我想用2个班级进行分类。 当我在没有SMOTE的情况下进行分类时,我得到了(平均值为10倍交叉验证):
Precision Recall f-1
0,640950987 0,815410434 0,714925374
当我使用smote :(过度采样200%和k = 5的少数类)(也是10次交叉验证,这意味着我的测试和训练集中有合成数据。
Precision Recall f-1
0,831024643 0,783434343 0,804894232
正如你所看到的那样效果很好。
然而,当我在验证数据上测试这个经过训练的模型时(没有任何合成数据,并且没有用于构建合成数据点)
Precision Recall f-1
0,644335755 0,799044453 0,709791138
太可怕了。我使用随机决策林进行分类。
有谁知道为什么会这样?&解决这个问题的解决方案?任何有关额外测试的有用提示我都可以尝试获得更多见解。
更多信息:我不接触大多数班级。我使用scikit-learn在Python中工作,为SMOTE使用this algorithm。
测试数据的混淆矩阵(具有合成数据):
验证集中的混淆矩阵(没有任何合成数据,也没有用作创建合成数据的基础):
编辑:我读到问题可能在于创建了Tomek Links。因此I wrote some code to remove the Tomek links。虽然这不会提高分类分数。
编辑2:我读到问题可能在于重叠太多的事实。对此的解决方案是更智能的合成样本生成算法。因此我实施了
ADASYN:不平衡学习的自适应合成采样方法
。我的实现可以找到here。它比表现更差。
答案 0 :(得分:4)
重叠可能是原因。如果给定变量的类之间存在重叠,则SMOTE将生成影响可分离性的合成点。正如您所指出的,可以生成Tomek链接以及损害分类的其他点。我建议你尝试其他SMOTE变体,如Safe-SMOTE或Bordeline-SMOTE。你可以在:
找到他们的描述http://link.springer.com/chapter/10.1007/11538059_91
http://link.springer.com/chapter/10.1007/978-3-642-01307-2_43