为什么采样提高了我的模型的性能?

数据挖掘 随机森林 阶级失衡 采样
2021-09-18 14:13:06

我有一个包含 88 个正样本和 128575 个负样本的不平衡数据集。我不愿意对数据进行过度/欠采样,因为它是一个生物数据集,我不想引入合成数据。我用这个原始数据集构建了一个随机森林分类器。我的正面课程的 F1 分数为 0。零精度。零召回。我交叉检查了预测和测试数据。该模型预测了一些积极因素,但实际上都不是积极因素。最差的表现。

所以,我试图对正类进行过采样。我将阳性样本上采样到 1000 个样本。令我惊讶的是,这个数据集的 F1 分数是 0.97,对于正类。然后我尝试了较少的样本。我用 200 个正样本获得了 0.83 的 F1 分数,这只是原始正样本的 2.25 倍。

我想知道为什么会这样。对于 88 个样本,F1 得分为 0.00(四舍五入为两位数)。对于 200 个样本,它是 0.83。没有数据泄露。所有功能都经过精心设计。我使用imbalanced-learn模块进行过采样。有人可以解释为什么会出现这种性能差异吗?

3个回答

正如您在评论中提到的,您在拆分测试集之前进行了上采样,这会导致数据泄漏;你的分数是不可信的。问题是给定的正样本可能会被复制,然后放入训练集和测试集。特别是对于树模型,这很可能正确预测测试集中的样本。SMOTE 的故事类似,但正如你所指出的,没有那么严重。SMOTE 中,您在正样本之间进行插值(参见imb-learn 文档中的图像),因此如果其中一些点在训练集中,而一些在测试集中,您仍然更有可能正确识别这些点。

相反,您应该首先拆分,然后对训练集进行上采样。或者,设置类权重(这具有独立于拆分的好处)。现在您的测试集与训练集具有不同的分布,因此您需要调整类预测阈值或调整概率预测。参见例如“将下采样后的预测概率转换为分类中的实际概率?” . 这里的部分问题是您是否想要概率的实际估计,或者只关心类预测。

关于重采样技术是否有帮助是一个严肃的问题。参见例如
“类不平衡问题的根本原因是什么?”
“什么时候不平衡数据真的是机器学习中的一个问题?”
作为第一次尝试,我会坚持使用原始数据,拟合随机森林,并查看不同的阈值。

在您的情况下,我担心 88 个阳性样本可能不足以看到有意义的模式。(可能是;这取决于类的分离程度。)

当您尝试在不采样的情况下训练您的模型时——保持不平衡的类,您的模型正在学习对数据进行分类的最简单方法是将所有内容标记为负数。从准确性的角度来看(每个类别的正确分类总数除以实例总数),您的模型将具有128487128575或 99%。从本质上讲,它非常不适合您的数据成为一个类。

过采样纠正了不平衡,并使您的算法更难找出数据的真实形状。将所有内容归为一类是行不通的。您还可以通过对负类进行欠采样来纠正您的不平衡。通常,经验法则是当您有数万到数十万行时进行欠采样,而当您的数据较小(数万或更少)时进行过采样。

是处理机器学习中的类不平衡的一个很好的参考。

如果我了解 OP 描述的情况,那么答案已经在问题中了。这是因为 OP 的训练集不平衡。在超过 120000 个中只有两位数的正样本,该模型将具有最大的统计成功,只是始终预测为负样本。

过度采样或采样不足数据(生物或其他)并不是错误的,因此如果仔细进行重新采样是一个完全合法的解决方案。如果你真的想避免合成数据,重复是有效的,但除此之外还有很多技术可以解决这个问题(例如 SMOTE)。