使用SMOTE时验证集性能不佳

Oli*_*s_j 4 python machine-learning scikit-learn

我想用2个类别进行分类。当我不使用SMOTE进行分类时,我会得到(交叉验证的10倍平均值):

Precision       Recall            f-1
0,640950987     0,815410434       0,714925374
Run Code Online (Sandbox Code Playgroud)

当我使用smote时:(在200%且k = 5时对少数类进行了过度采样)(也有10个交叉验证),这意味着我的测试和训练集中存在综合数据。

Precision        Recall           f-1
0,831024643      0,783434343      0,804894232
Run Code Online (Sandbox Code Playgroud)

如您所见,这很好。

但是,当我在验证数据(没有任何综合数据,也没有用于构造综合数据点)上测试此训练好的模型时,

Precision        Recall           f-1
0,644335755      0,799044453      0,709791138
Run Code Online (Sandbox Code Playgroud)

太可怕了 我使用随机决策森林进行分类。

有谁知道为什么会这样以及解决此问题的解决方案?任何有关额外测试的有用技巧,我都可以尝试以获取更多见解,也欢迎您。

更多信息:我不会碰多数派。我使用scikit-learn和 SMOTE 算法在Python中工作。

测试数据(具有综合数据)上的混淆矩阵: 在此处输入图片说明

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

在此处输入图片说明


编辑:我读到问题可能在于创建了Tomek Links。因此,我写了一些代码来删除Tomek链接。虽然这不能提高分类分数。

Edit2:我读到问题可能在于存在太多重叠的事实。一种解决方案是更智能的合成样本生成算法。因此我实现了

ADASYN:用于失衡学习的自适应合成采样方法

。我的实现可以在这里找到。它的表现比击杀还差。

小智 5

重叠可能是原因。如果在给定变量的情况下类之间存在重叠,则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