0

我有一个我正在尝试解决的问题: - 具有 2 个类的不平衡数据集 - 一个类使另一个类相形见绌(923 对 38) - 当数据集按原样用于训练 RandomForestClassifier 时,f1_macro 得分保持在 0.6 中的 TRAIN 和 TEST - 0.65 范围

昨天在研究该主题时,我自学了重采样,尤其是 SMOTE 算法。它似乎为我的 TRAIN 分数创造了奇迹,因为在将数据集与它们平衡后,我的分数从 ~0.6 上升到 ~0.97。我应用它的方式如下:

  • 我一开始就将我的 TEST 集与其余数据分开(整个数据的 10%)

  • 我只在 TRAIN 集上应用了 SMOTE(班级余额 618 与 618)

  • 我已经在 TRAIN 集上训练了一个 RandomForestClassifier,并实现了 f1_macro = 0.97

  • 使用 TEST 集进行测试时,f1_macro 分数保持在 ~0.6 - 0.65 范围内

我会假设发生的情况是,TEST 集中的保留数据包含观察结果,这与 TRAIN 集中少数类的 SMOTE 前观察有很大不同,最终教会模型很好地识别 TRAIN 集中的案例,但是使模型与测试集中的这些少数异常值失去平衡。

处理这个问题的常用策略是什么?常识表明我应该尝试在 TRAIN 集中捕获一个非常具有代表性的少数类样本,但我认为 sklearn 没有任何自动化工具可以实现这一点?

4

1 回答 1

2

你的假设是正确的。您的机器学习模型基本上对您的训练数据过度拟合,这些数据对一个类重复相同的模式,因此,模型学习了该模式并错过了测试数据中的其余模式。这意味着该模型在野外世界中表现不佳。

如果 SMOTE 不起作用,您可以通过测试不同的机器学习模型进行试验。随机森林通常在此类数据集上表现良好,因此请尝试通过修剪或调整超参数来调整您的 rf 模型。另一种方法是在训练模型时分配类权重。您还可以尝试惩罚模型,当错误分类少数类时,这会给模型带来额外的成本。

您也可以尝试欠采样,因为您已经测试过过采样。但很可能您的欠采样也会遇到同样的问题。请尝试简单的过采样而不是 SMOTE,以查看您的结果如何变化。

您应该尝试的另一种更高级的方法是批处理。取所有少数类和多数类中相同数量的条目并训练模型。继续为你的大多数班级的所有批次这样做,最终你将拥有多个机器学习模型,然后你可以一起使用它们来投票。

于 2019-05-10T17:11:25.290 回答