使用SMOTE时验证集的性能不佳

时间:2013-06-13 13:17:08

标签: python machine-learning scikit-learn

我想用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

测试数据的混淆矩阵(具有合成数据): enter image description here

验证集中的混淆矩阵(没有任何合成数据,也没有用作创建合成数据的基础):

enter image description here


编辑:我读到问题可能在于创建了Tomek Links。因此I wrote some code to remove the Tomek links。虽然这不会提高分类分数。

编辑2:我读到问题可能在于重叠太多的事实。对此的解决方案是更智能的合成样本生成算法。因此我实施了

  

ADASYN:不平衡学习的自适应合成采样方法

。我的实现可以找到here。它比表现更差。

1 个答案:

答案 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