我想用2个 class 进行分类 . 当我没有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
这太可怕了 . 我使用随机决策森林进行分类 .
有谁知道为什么会这样,以及解决这个问题的解决方案?任何有关额外测试的有用提示我都可以尝试获得更多见解 .
更多信息:我不接触大多数 class . 我使用scikit-learn在Python中工作,为SMOTE使用this algorithm .
测试数据上的混淆矩阵(具有合成数据):
验证集中的混淆矩阵(没有任何合成数据,也没有用作创建合成数据的基础):
Edit: 我读到问题可能在于Tomek Links的创建 . 因此I wrote some code to remove the Tomek links . 虽然这不会提高分类分数 .
Edit2: 我读到问题可能在于重叠太多的事实 . 对此的解决方案是更智能的合成样本生成算法 . 所以我实施了
ADASYN:不 balancer 学习的自适应合成采样方法
. 我的实现可以找到here . 它比表现更差 .
1 回答
重叠可能是原因 . 如果给定变量的类之间存在重叠,则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