用于不平衡二元分类的过采样数据的过程

Jan*_*lly 2 classification machine-learning scikit-learn train-test-split imbalanced-data

我有大约 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)
Run Code Online (Sandbox Code Playgroud)

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

des*_*aut 5

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

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

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

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

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

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

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

我很好这样做

你不应该:)