我想用 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
这太糟糕了。我使用随机决策森林进行分类。
有没有人知道为什么会发生这种情况以及解决此问题的解决方案?也欢迎任何有关我可以尝试获得更多见解的额外测试的有用提示。
更多信息:我不接触多数类。我在 Python 中使用 scikit-learn 和 this algorithm for SMOTE。
测试数据(有合成数据)上的混淆矩阵:
验证集中的混淆矩阵(没有任何合成数据,也没有被用作创建合成数据的基础):
编辑: 我读到问题可能在于创建了 Tomek 链接。因此 I wrote some code to remove the Tomek links 。虽然这不会提高分类分数。
Edit2: 我读到问题可能在于重叠太多。对此的解决方案是更智能的合成样本生成算法。因此我实现了
.我的实现可以在 here 中找到。它的表现比 smote 差。
最佳答案
重叠可能是原因。如果给定变量的类之间存在重叠,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
关于python - 使用 SMOTE 时验证集性能不佳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17088051/