Up Sampling不平衡数据集的次要类

Dai*_*ail 1 python machine-learning scikit-learn

我正在使用scikit-learn来对我的数据进行分类,目前我正在运行一个简单的DecisionTree分类器.我有三个课程,存在很大的不平衡问题.类是0,1和2.次要类是1和2.

为了让您了解类的样本数量:

0 = 25.000 samples
1 = 15/20 less or more
2 = 15/20 less or more
Run Code Online (Sandbox Code Playgroud)

所以次要类约占数据集的0.06%.我正在遵循的解决不平衡问题的方法是次要类的UPSAMPLING.码:

from sklearn.utils import resample,
resample(data, replace=True, n_samples=len_major_class, random_state=1234)
Run Code Online (Sandbox Code Playgroud)

现在出现了问题.我做了两个测试:

  1. 如果我对次要类进行上采样,然后将我的数据集分为两组,一组用于训练,另一组用于测试...准确度为:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00     20570
          1       1.00      1.00      1.00     20533
          2       1.00      1.00      1.00     20439

avg / total       1.00      1.00      1.00     61542
Run Code Online (Sandbox Code Playgroud)

非常好的结果.

  1. 如果我只对训练数据进行上采样并保留原始数据进行测试,结果为:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00     20570
          1       0.00      0.00      0.00        15
          2       0.00      0.00      0.00        16

avg / total       1.00      1.00      1.00     20601
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,全局精度很高,但是1级和2级的精度为零.

我正在以这种方式创建分类器:

DecisionTreeClassifier(max_depth=20, max_features=0.4, random_state=1234, criterion='entropy')
Run Code Online (Sandbox Code Playgroud)

我也试图加入class_weight均衡价值,但它没有什么区别.

我只应该对训练数据进行上采样,为什么我会遇到这个奇怪的问题?

Rob*_*rto 6

当您在拆分之前进行重新采样时,获得该行为的事实是很正常的; 你是在引起数据偏见.

如果您对数据进行过采样然后拆分,则测试中的少数样本将不再独立于训练集中的样本,因为它们是一起生成的.在您的情况下,它们是训练集中样本的精确副本.您的准确度为100%,因为分类器正在对已经在培训中看到的样本进行分类.

由于您的问题是强烈不平衡的,我建议使用一组分类器来处理它.1)在训练集和测试集中拆分数据集.考虑到数据集的大小,您可以从少数类中抽取1-2个样本进行测试,然后留下另一个用于训练.2)从训练中,您生成N个数据集,其中包含少数类的所有剩余样本和来自多数类的欠样本(我会说少数类中的2*个样本数).3)对于获得的每个数据集,您都要训练一个模型.4)使用测试集来获得预测; 最终预测将是分类器所有预测的多数投票结果.

使用强大的度量标准执行不同的迭代,使用不同的初始拆分测试/培训.