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)
现在出现了问题.我做了两个测试:
Run Code Online (Sandbox Code Playgroud)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)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
正如您所看到的那样,全局精度很高,但是1级和2级的精度为零.
我正在以这种方式创建分类器:
DecisionTreeClassifier(max_depth=20, max_features=0.4, random_state=1234, criterion='entropy')
Run Code Online (Sandbox Code Playgroud)
我也试图加入class_weight
与均衡价值,但它没有什么区别.
我只应该对训练数据进行上采样,为什么我会遇到这个奇怪的问题?
当您在拆分之前进行重新采样时,获得该行为的事实是很正常的; 你是在引起数据偏见.
如果您对数据进行过采样然后拆分,则测试中的少数样本将不再独立于训练集中的样本,因为它们是一起生成的.在您的情况下,它们是训练集中样本的精确副本.您的准确度为100%,因为分类器正在对已经在培训中看到的样本进行分类.
由于您的问题是强烈不平衡的,我建议使用一组分类器来处理它.1)在训练集和测试集中拆分数据集.考虑到数据集的大小,您可以从少数类中抽取1-2个样本进行测试,然后留下另一个用于训练.2)从训练中,您生成N个数据集,其中包含少数类的所有剩余样本和来自多数类的欠样本(我会说少数类中的2*个样本数).3)对于获得的每个数据集,您都要训练一个模型.4)使用测试集来获得预测; 最终预测将是分类器所有预测的多数投票结果.
使用强大的度量标准执行不同的迭代,使用不同的初始拆分测试/培训.