测试数据不能很好地表示训练数据

数据挖掘 机器学习 数据清理 训练 预处理 预训练
2022-02-28 01:36:31

我有预定义的训练和测试集。在生成一些统计数据(如 value_counts)并检查唯一值时,我觉得变量的分布之间存在“很多”差异。应该怎么做?

假设如果我想从train_set中删除一列,比如方差接近于零,我应该对test_set重复同样的操作吗(即使 test_set 的频率表中没有这样的问题?

我运行了以下代码

for dataset in both_datasets:       # both_datasets contains train_set and test_set 
print(dataset.nunique())
print('\n')

这是输出(我编译它是为了更好地查看并突出显示一些极端情况) 在此处输入图像描述 您可能会观察到对于 column specific_code_lesion,test_set 错过了整个类别!

然后为了查看我的列包含多少唯一值,我运行了以下代码

for dataset in both_datasets:
print('-'*120)
for col in dataset.columns:
    unique = len(dataset[col].unique())
    percentage = float(unique)/ dataset.shape[0]*100
    print(percentage, col)
    

这是输出: 在此处输入图像描述

因此,唯一值的百分比存在比率之间存在明显差异。

问题是我应该

  1. 避免从 test_data 中获取任何见解。仅更改从 train_set 中获取的见解。但是,我所做的每一个更改也应该在 test_set 中复制

  2. 也使用 test_data 来获得洞察力并进行相应的预处理。

  3. 做一些改变 test_data 使其更加平衡和有代表性的事情。

  4. 别的东西:S

1个回答

这是我试图回答这些问题的尝试:

  1. 避免从 test_data 中获取任何见解。仅更改从 train_set 中获取的见解。但是,我所做的每一个更改也应该在 test_set 中复制
    第二部分基本上是正确的。只有在极少数情况下,您可能会将类平衡技术应用于不应应用于测试/评估集的训练集。测试集应该尽可能地代表真实世界的数据,而训练集应该做同样的事情,对这个数据集的一些调整可以独立应用,以便使用所选的 ML 算法进行训练变得容易/可能。但是,任何缩放/归一化/转换参数也必须准确地复制到测试集。

  2. 也使用 test_data 来获得洞察力并进行相应的预处理。
    在训练和测试数据集上执行 EDA 并使用组合知识做出特征工程决策应该没有害处。

  3. 做一些改变 test_data 使其更加平衡和有代表性的事情。
    不。如上面#1所述,测试数据应尽可能代表真实世界的数据。对于看不见的真实世界数据,您如何依赖测试集的评估指标?你可以在这里阅读更多关于它的信息,当我有高度不平衡的数据时,我应该平衡测试集吗?

  4. 其他:S
    如果测试集中缺少某个特征的类别/类,您不必担心。然而,反之则不然:在测试或真实世界数据集中不能有任何新的类别/类在训练集中不存在——预处理例程和模型将不知道如何处理它。
    此外,如果某个特征中唯一值的数量非常少或方差接近于零,则应考虑将其删除(从训练集和测试集中)。最后,这应该反映在低特征重要性上,并通过任何特征选择程序(如特征选择)突出显示