通过使用 SMOTE,验证集的分类很糟糕

机器算法验证 分类 Python 重采样 不平衡类 scikit-学习
2022-03-10 16:45:03

我想用 2 个类进行分类。当我在没有打击的情况下进行分类时,我得到:

Precision       Recall            f-1
0,640950987     0,815410434       0,714925374

当我使用smote时:(以200%和 k = 5 对少数类进行过采样)

Precision        Recall           f-1
0,831024643      0,783434343      0,804894232

如您所见,这很好用。

但是,当我在验证数据(没有任何合成数据)上测试这个训练有素的模型时

Precision        Recall           f-1
0,644335755      0,799044453      0,709791138

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

有谁知道为什么会这样?任何关于额外测试的有用提示,我都可以尝试获得更多见解,也欢迎。

更多信息:我不接触大多数班级。我在 Python 中使用 scikit-learn 和这个用于 smote 的算法。

测试数据(具有合成数据)的混淆矩阵: 在此处输入图像描述

相同模型的验证数据上的混淆矩阵(真实数据,非 SMOTE 生成)

在此处输入图像描述


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

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

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

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

2个回答

如果您对训练数据进行过采样以更改训练集中的相对类频率,则您隐含地告诉分类器期望验证集具有相同的类频率。由于类频率影响决策边界,如果验证集的类频率不同,则结果分类边界将是错误的,性能将是次优的。

现在确实,对于某些分类器,具有不平衡的类会导致其表现不佳,重新采样数据可以帮助纠正这个问题。但是,如果您对少数类进行过多采样,您将过度纠正并且性能将欠佳,因为训练集和验证集之间的类频率差异超过了纠正不平衡问题所需的差异。

然后,我的方法是使用交叉验证来选择补偿分类器遇到的“类不平衡问题”所需的过采样程度,但仅此而已。但是请注意,这会导致需要调整一个额外的参数,这会导致更大的计算成本,并且模型选择中过度拟合的可能性更高(如果可调参数的总数不可忽略)。

您是否考虑过通过 Rpy 使用 R 实现的随机森林?它有一个选项,允许您选择训练每棵树的样本大小和落入每个类别的分数。我发现它是使用随机森林时处理不平衡的最有效方法。