如何处理不平衡数据的主要选项

数据挖掘 xgboost 交叉验证 阶级失衡 打击 奥克
2022-02-24 00:25:50

据我所知,从广义上讲,有三种处理二进制不平衡数据集的方法:

选项 1

  • 随机创建 k 折交叉验证样本(或者使用分层 k 折更好地创建 k 折样本:https ://scikit-learn.org/0.16/modules/generated/sklearn.cross_validation.StratifiedKFold.html )。
  • 对于每个折叠,在“训练”和“测试”集上分别应用重采样技术(上采样、下采样或两者的组合)。
  • 使用“传统”指标进行评估:例如 ROC 曲线的 AUC(TP 率与 FP 率)。

选项 2

  • 随机创建 k 折交叉验证样本(或者甚至更好地使用分层 k 折创建 k 折样本)。
  • 不要应用任何重采样技术。
  • 使用“替代”指标进行评估:例如 Precision-Recall 曲线的 AUC 或 F 分数(Precision 和 Recall 的调和平均值)。

选项 3

我的主要问题是我是否正确解释了选项。我所说的是否有任何概念上的错误?处理不平衡时,这三种情况使用Stratified k-fold是否合适?使用 XGBoost 和调优时是否不需要应用任何重采样scale_pos_weight当应用一些重采样(选项 1 和 3)时,使用“传统”指标是否有意义,而使用“替代”指标是否有意义?一般来说,重采样必须分别应用于训练集和测试集?等等。

此外,如果您对 SMOTE 和 ROSE 有任何很好的参考,关于它们如何工作、如何应用它们以及如何将它们与 python 一起使用,那就太好了。

2个回答

你的简历相当不错,但我不喜欢将广泛的讨论划分为那三条或多或少明显分开的道路。但实际上,通常会选择与其中一种类似的技术。让我强调一下它们:

  • Precision 和 Recall 的曲线下面积 (AUC) 已显示略好于 AUC ROC,但不要期待奇迹。它们在实际情况下非常相似。事实上,您选择的指标(AUC ROC、AUC Precision-Recall 或类似)的性能,因为它对测试集的影响,很大程度上取决于您要解决的问题。

  • XGBoost 的选项有scale_pos_weight帮助,但不是奇迹。如果您已经选择使用 XGBoost,请激活它。但是不要仅仅因为有这个选项就选择 XGBoost。

另外,请考虑:

  • 在实际应用中,您的样本反映了收集它们的系统的一组偏差。这意味着如果您有小的不平衡(高达 1 到 20 甚至 100),最好避免使用任何平衡技术并保持不平衡状态不变。这可能会保证生产中的模型更好。出于同样的原因,有时使用非分层 k-fold 可以提供比分层版本更好的模型。

  • 作为 SMOTE 的高思想合成样本创建技术经常错过目标。这是因为您尝试解决的问题的复杂性可能非常高,以至于 SMOTE(或类似技术)无论如何都无法创建像样的合成样本。在这些情况下,最好只使用欠采样或(更好的)过采样。实际上,就性能而言,仅复制较低样本类别的样本是一种惊人的好技术。

不平衡类是指一个类的计数与其他类的计数相比太低。这意味着模型将几乎没有机会学习少数类。


我们有这些选项来处理这个问题。
关键目标是减少多数类产生的迷雾,让模型也看到少数类-

加权类- 这指示学习过程不要平等对待类并使用指定的比率。例如,如果少数类被错误分类(假设权重为 10:1),损失将是 10 倍这只是一种方法,重量也可以用其他方式使用。

过采样- 使用可用数据创建虚拟少数类数据

欠采样- 将多数类采样到少数以提高比率。

指标- 我认为你唯一应该注意的是组合精度不起作用。您可以简单地测量单个类的准确性。或者可以使用Precision-Recall

规则 -
您无需保留任何特定规则,您必须单独或组合应用上述所有方法 (这很重要,有时我们同时应用过采样和欠采样),看看哪些方法有效。

另外,请记住,不平衡是一个单独的问题,与决策边界无关如果数据具有非常模糊的类决策边界,那么这将是一个单独的问题。
在这种情况下,即使应用上述方法,也可能不会得到好的结果。


Stratified k-fold
同样,与 Imbalanced 无关。您应该始终使用分层拆分。我将再次迭代 -将一般 ML 问题/解决方案与不平衡数据问题分开

好读物
Jeremy Jordan - 博客
Tom Fawcett - 博客
Haibo He 和 Edwardo A. Garcia - Paper
Imb-learn Library
Jason Brownlee - SMOTe
Learning from Imbalanced Data Sets - 书