【问题标题】:Bad performance on validation set while using SMOTE使用 SMOTE 时验证集性能不佳
【发布时间】:2013-06-09 21:31:08
【问题描述】:

我想用 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 为 SMOTE 工作。

测试数据(包含合成数据)的混淆矩阵:

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


编辑:我读到问题可能在于创建了 Tomek 链接这一事实。因此I wrote some code to remove the Tomek links。虽然这并没有提高分类分数。

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

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

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

【问题讨论】:

  • 有趣的是,您的表现可以追溯到 SMOTE 之前的情况。当类不平衡时,Precision 和 Recall 可能会产生误导。

标签: python machine-learning scikit-learn


【解决方案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

【讨论】:

  • 谢谢,我想我昨天开始实施 ASASYN(另一种自适应合成数据点生成算法),稍后会完成。否则我会看看你的建议之一。
猜你喜欢
  • 2019-10-02
  • 2019-12-26
  • 2011-07-09
  • 2017-02-10
  • 2013-06-01
  • 2015-10-29
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多