python - 具有不平衡二进制数据集的机器学习
问题描述
我有一个我正在尝试解决的问题: - 具有 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 没有任何自动化工具可以实现这一点?
解决方案
你的假设是正确的。您的机器学习模型基本上对您的训练数据过度拟合,这些数据对一个类重复相同的模式,因此,模型学习了该模式并错过了测试数据中的其余模式。这意味着该模型在野外世界中表现不佳。
如果 SMOTE 不起作用,您可以通过测试不同的机器学习模型进行试验。随机森林通常在此类数据集上表现良好,因此请尝试通过修剪或调整超参数来调整您的 rf 模型。另一种方法是在训练模型时分配类权重。您还可以尝试惩罚模型,当错误分类少数类时,这会给模型带来额外的成本。
您也可以尝试欠采样,因为您已经测试过过采样。但很可能您的欠采样也会遇到同样的问题。请尝试简单的过采样而不是 SMOTE,以查看您的结果如何变化。
您应该尝试的另一种更高级的方法是批处理。取所有少数类和多数类中相同数量的条目并训练模型。继续为你的大多数班级的所有批次这样做,最终你将拥有多个机器学习模型,然后你可以一起使用它们来投票。
推荐阅读
- python - 如何在 Django 中使用异步视图和 URL?
- c# - 如果项目不存在,则 C# foreach 循环跳过它
- javascript - 如何在 PHP 中附加选项元素和值并在 ajax 中调用 html
- python - 散点图的 Matplotlib 2D 条形图未按预期排列
- r - 如何在 Shiny 中验证上传的 csv
- r - 在数据框中重复值时,仅保留每个 id 的第一个值
- oracle - 知道 JDBC 连接字符串的 Oracle 数据库的 ODBC 连接字符串是什么
- laravel - Laravel 任务调度是否适用于 5 分钟的 cron 作业?
- swift - SwiftUI如何在标签点击时刷新
- python - 如何使用python准备这种形式的数据