【问题标题】:ML with imbalanced binary dataset具有不平衡二进制数据集的机器学习
【发布时间】:2023-03-12 03:57:01
【问题描述】:

我有一个要解决的问题: - 具有 2 个类别的不平衡数据集 - 一类使另一类相形见绌(923 对 38) - 当数据集按原样用于训练 RandomForestClassifier 时,f1_macro 得分在 TRAIN 和 TEST 中保持在 0.6 - 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 集中的案例好吧,但是由于 TEST 集中的这几个异常值使模型失去了平衡。

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

【问题讨论】:

    标签: python scikit-learn dataset resampling oversampling


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗨 Rajat,感谢您的 cmets。你能告诉我,如果我通过将测试集从主要数据中放在一边做正确的事情,甚至在用 SMOTE 重新采样少数类之前?稍后在培训工作中,我正在使用 CV 进行网格搜索,其中 CV 也从 TRAIN 集中分离出它自己的 VALIDATION 集。这样,我总是有一些数据在 TEST 集中被遗漏,其中可能包含 TRAIN 或 VALIDATION 集中不存在的模式。
    • 您必须保留数据进行测试,否则您将永远无法监控模型的性能。是的,测试集中可能存在模式,但这就是机器学习的目的。它必须对有点不同的集合进行泛化和预测,并且模型从未见过,否则它将是机器记忆,而不是机器学习。有几种方法可以更好地分割数据,因为随机分割可能会导致 60% 的少数类进入测试集,这也不好,所以寻找这种技术
    猜你喜欢
    • 2018-12-14
    • 2017-03-26
    • 2020-01-11
    • 2017-09-19
    • 1970-01-01
    • 2018-03-02
    • 2018-05-04
    • 2017-11-19
    • 2016-09-19
    相关资源
    最近更新 更多