2

我有大约 30% 和 70% 的 0 类(少数类)和 1 类(多数类)。由于我没有很多数据,我计划对少数类进行过采样以平衡这些类,使其成为 50-50 的分割。我想知道是否应该在将数据拆分为训练集和测试集之前或之后进行过采样。在拆分在线示例之前,我通常已经看到它完成了,如下所示:

df_class0 = train[train.predict_var == 0]
df_class1 = train[train.predict_var == 1]
df_class1_over = df_class1.sample(len(df_class0), replace=True)
df_over = pd.concat([df_class0, df_class1_over], axis=0)

但是,这是否意味着测试数据可能会从训练集中重复样本(因为我们对训练集进行了过采样)?这意味着测试性能不一定要基于新的、看不见的数据。我很好这样做,但我想知道什么被认为是好的做法。谢谢!

4

2 回答 2

5

我想知道是否应该在将数据拆分为训练集和测试集之前或之后进行过采样。

它当然应该拆分后完成,即它应该只应用于你的训练集,而不是你的验证和测试集;另请参阅我的相关答案

在拆分在线示例之前,我通常已经看到它完成了,就像这样

从您显示的代码片段中,正如您所声称的那样,它在拆分之前完成并不明显。这取决于train这里的变量到底是什么:如果它是训练测试拆分的产物,那么过采样确实会拆分后发生,这是应该的。

但是,这是否意味着测试数据可能会从训练集中重复样本(因为我们对训练集进行了过采样)?这意味着测试性能不一定要基于新的、看不见的数据。

确切地说,这就是为什么应该在拆分到训练测试之后而不是之前进行过采样的原因。

(我曾经目睹过一个案例,建模者很难理解为什么他的测试准确率高达 100%,远高于他的训练准确率;结果他的初始数据集充满了重复——这里没有类不平衡,但想法是类似的——其中几个副本在拆分后自然会出现在他的测试集中,当然不是新的或看不见的数据......)。

我很好做这个

你不应该:)

于 2018-06-28T12:24:58.640 回答
1

根据我的经验,这是一种不好的做法。正如您所提到的,测试数据应该包含看不见的样本,这样它就不会过度拟合,并且可以让您更好地评估训练过程。如果您需要增加样本量 - 考虑数据转换的可能性。例如人/猫图像分类,因为它们是对称的,您可以通过镜像图像来加倍样本大小。

于 2018-06-27T14:36:32.400 回答