Python:处理python机器学习中的不平衡类

数据挖掘 机器学习 Python 数据挖掘 数据集 熊猫
2021-09-23 05:30:14

我有一个数据集,我正在尝试预测目标变量。

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

我提供了一个示例数据,但我的有数千条以类似方式分布的记录。在这里,Col1、Col2、Col3、Col4 是我的特征,Col5 是目标变量。因此预测应该是 1、2、3 或 4,因为这些是我的目标变量值。我曾尝试使用随机森林、决策树等算法进行预测。

在这里,如果您看到,与 4 相比,值 1,2 和 3 出现的次数更多。因此,在预测时,我的模型更偏向于 1 2 和 3,而我对 4 的预测数量较少(只有 1 个预测当我看到混淆矩阵时,从数千条记录中获取 policy4)。

为了使我的模型泛化,我随机删除了属于 1,2 和 3 值的相等百分比的数据。我按 Col5 中的每个值进行分组,然后删除一定的百分比,这样我就减少了记录数。现在我可以看到准确率百分比有所增加,并且混淆矩阵中值 4 的预测也有合理增加。

这是正确的处理方法(从模型有偏差的那些组中随机删除数据)吗?

我尝试了内置的 python 算法,如 Adaboost、使用 sklearn 的 GradientBoost 技术。我读到这些算法用于处理不平衡类。但是我无法成功提高我的准确性,而是通过随机删除数据,我可以看到一些改进。

这种减少是欠采样技术吗?这是欠采样的正确方法吗?

如果我的随机删除错误,sklearn 中是否有任何预定义的包或我可以在 python 中实现的任何逻辑来完成这项工作?

此外,我还了解了 SMOTE 技术,它处理过采样。我应该为价值 4 试试这个吗?我们可以使用python中的任何内置包来做到这一点吗?如果有人在这种情况下帮助我,那就太好了。

4个回答

本文建议使用排名(我写的)。例如,您可以使用 RankSVM,而不是直接使用 SVM。由于排名者将观察与观察进行比较,因此训练必然是平衡的。但是有两个“但是”:训练要慢得多,最后,这些模型所做的是将您的观察结果从它们属于一个类别的可能性到属于另一个类别的可能性进行排序,因此您需要之后应用阈值。

如果您打算使用预处理来解决您的不平衡问题,我建议您查看MetaCost该算法涉及构建模型的 bagging,然后根据难以预测的情况更改类先验以使它们保持平衡。它非常优雅。像 SMOTE 这样的方法很酷的一点是,通过制造新的观察结果,您可以使小型数据集更加健壮。

无论如何,即使我写了一些关于阶级不平衡的东西,我仍然怀疑这是现实世界中的一个重要问题。我认为你的训练集中有不平衡的先验,但在你的现实世界数据中存在平衡的先验是非常罕见的。你?通常发生的情况是 I 型错误与 II 型错误不同,我敢打赌大多数人最好使用成本矩阵,大多数训练方法都接受,或者您可以通过使用 MetaCost 或 SMOTE 进行预处理来应用它。我认为很多时候“修复不平衡”就是“我不想费心考虑 I 型和 II 型错误之间的相对权衡”。

附录:

我尝试了内置的 python 算法,如 Adaboost、使用 sklearn 的 GradientBoost 技术。我读到这些算法用于处理不平衡类。

当您在考虑不平衡的情况下初始化权重分布时,AdaBoost 可以为类别不平衡提供更好的结果。如果你愿意,我可以在我读到这篇文章的地方挖掘论文。

无论如何,当然,这些方法不会提供良好的准确性。您的训练和验证数据集中是否存在类别不平衡?您应该使用 F1 分数等指标,或将成本矩阵传递给准确度函数。“修复”类不平衡是指您的先验在您的训练和验证案例中有所不同。

sklearn 的一些算法有一个名为class_weight的参数,您可以将其设置为"balanced"这样 sklearn 将根据每个类的样本数量调整其类权重。

对于随机森林分类器,请尝试以下操作,看看它是否会提高您的分数:

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!

是的,这是解决类不平衡问题的一种很好的技术。但是,欠采样方法确实会导致数据集中的信息丢失(例如,您刚刚删除了剩余变量中的一个有趣模式,这可能有助于更好地训练模型)。这就是为什么首选过采样方法的原因,特别是在数据集较小的情况下。

针对您对 Python 包的查询,不平衡学习工具箱专门用于同一任务。它提供了几种欠采样和过采样方法。我建议尝试SMOTE技术。

这取决于您要使用的合奏技术。您正在处理多类数据不平衡问题的基本问题。欠采样可以有效地用于 bagging 和 boosting 技术。SMOTE 算法在生成新样本方面非常有效。数据不平衡问题已在文献中得到广泛研究。我建议您阅读以下算法之一: SMOTE-Boost SMOTE-Bagging Rus-Boost EusBoost 这些是专为不平衡数据问题设计的提升/装袋技术。您可以尝试使用 ADA-SMOTE 或 Border-Line SMOTE,而不是 SMOTE。我已经为多类使用和修改了 Border-Line SMOTE,它非常有效。如果您的数据库非常大并且问题很容易尝试:viola - jones classifier。我也用过数据不平衡问题,它真的很有效