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

时间:2018-06-27 13:46:30

标签: machine-learning scikit-learn classification resampling train-test-split

我的班级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)

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

2 个答案:

答案 0 :(得分:2)

  

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

当然应该在拆分后完成,即应仅将其应用于您的 training 集合,而不应用于验证和测试的集合;另请参阅我的相关答案here

  

我一般认为在拆分成这样的在线示例之前就已经完成了

从您显示的代码片段中可以看出,拆分之前并没有完成。这取决于train变量的确切位置:如果它是火车测试拆分的乘积,则实际上在 拆分后就会进行过度采样。

  

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

恰恰是这就是为什么在分割以进行训练测试之后而不是之前进行过采样的原因。

(我曾经目睹过一个案例,建模者正在努力理解为什么他获得〜100%的测试准确度,远高于他的训练水平;结果是他的初始数据集充满了重复-这里没有类不平衡,但是这个想法是相似的-这些拆分中的几个很自然地在拆分后最终出现在他的测试集中,当然不是新数据或看不见的数据...。

  

我很好,

您不应该:)

答案 1 :(得分:0)

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