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

Process for oversampling data for imbalanced binary classification

class0(少数class)和class1(多数class)我有大约 30% 和 70%。由于我没有很多数据,我计划对少数 class 进行过采样以平衡 classes 成为 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)

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

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

I was wondering if oversampling should be done before or after splitting my data into train and test sets.

当然应该在 拆分之后完成,即它应该只应用于你的 training 集,而不是你的验证和测试的;另见我的相关回答 here.

I have generally seen it done before splitting in online examples, like this

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

However, wouldn't that mean that the test data will likely have duplicated samples from the training set (because we have oversampled the training set)? This means that testing performance wouldn't necessarily be on new, unseen data.

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

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

I am fine doing this

你不应该:)