为不平衡二元分类对数据进行过采样的过程

Posted

技术标签:

【中文标题】为不平衡二元分类对数据进行过采样的过程【英文标题】:Process for oversampling data for imbalanced binary classification 【发布时间】:2018-12-06 10:46:04 【问题描述】:

0 类(少数类)和 1 类(多数类)我有大约 30% 和 70%。由于我没有很多数据,我计划对少数类进行过采样以平衡这些类,使其成为 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)

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

我可以这样做

你不应该:)

【讨论】:

我认为可以在训练/测试拆分后对训练数据和测试数据进行过采样? (假设您分别拟合训练和测试数据)? @Ciaran 我们从不对测试集进行过采样;见***.com/questions/48805063/…和datascience.stackexchange.com/questions/82073/…【参考方案2】:

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

【讨论】:

以上是关于为不平衡二元分类对数据进行过采样的过程的主要内容,如果未能解决你的问题,请参考以下文章

分类问题中的过采样和欠采样

步骤用于高度不平衡的分类步骤。我应该对数据进行上采样和下采样,还是对不平衡的类进行上采样

数据不平衡不平衡采样调整分类阈值过采样欠采样SMOTEEasyEnsemble加入数据平衡的流程代价敏感学习BalanceCascade

如何使用 Python 对图像数据集进行过采样?

从信用卡欺诈模型看不平衡数据分类数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RFxgboost神经网络能够取得非常不错的效果。模型层面:

使用 SMOTE 对图像数据进行过采样