具有不平衡二进制数据集的ML

时间:2019-05-10 01:43:44

标签: python scikit-learn dataset resampling oversampling

我有一个要解决的问题: -具有2个类别的不平衡数据集 -一等人比另一等人小(923 vs 38) -当按原样使用数据集训练RandomForestClassifier的TRAIN和TEST停留在0.6-0.65范围内时,f1_macro得分

昨天我在做这个话题的研究时,我对重采样,尤其是SMOTE算法进行了自我教育。似乎对我的TRAIN分数产生了奇迹,因为在与他们平衡数据集之后,我的分数从〜0.6升至〜0.97。我的应用方式如下:

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

  • 我仅在火车上应用了SMOTE(班级余额618和618)

  • 我已经在TRAIN集上训练了RandomForestClassifier,并获得了f1_macro = 0.97

  • 在进行TEST设置测试时,f1_macro得分保持在〜0.6-0.65范围内

我会假设发生的是,TEST集中的保留数据保留了观测值,这与TRAIN集合中少数群体的SMOTE之前观测值有很大不同,最终使该模型能够真正识别TRAIN集合中的案例很好,但是在TEST集中只有少数几个异常值使模型失去了平衡。

解决此问题的常用策略是什么?根据常识,我应该尝试在TRAIN集中捕获非常有代表性的少数群体样本,但是我不认为sklearn具有任何自动化的工具可以使这种情况发生?

1 个答案:

答案 0 :(得分:2)

您的假设是正确的。您的机器学习模型基本上是过度拟合您的训练数据的,训练数据具有针对一个班级重复的相同模式,因此,该模型将学习该模式,而错过测试数据中存在的其余模式。这意味着该模型在野外环境中效果不佳。

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

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

您应该尝试的另一种更高级的方法是批处理。参加所有少数派课程并从多数派课程中获得相等数量的条目,然后训练模型。继续对多数班的所有批次执行此操作,最后您将拥有多个机器学习模型,然后可以将它们一起用于投票。