类别不平衡问题是 分类任务 中常见的问题,表现为数据集中不同 类别 的样本数量存在 显著差异 (即某些类别的样本数量远远多于其他类别),它常见于真实世界的许多场景,例如:
在金融领域,银行区分欺诈行为(少)和正常交易行为(多);在医疗领域,筛查或诊断疾病时,病人(少)远少于健康人(多);以及在文本分类方面,识别垃圾邮件(少)和正常邮件(多)等。
这种不平衡会导致分类模型在训练阶段,过分关注于 多数类,使其在多数类上表现出较好的分类能力;而对于 少数类,模型往往因忽视它的信息而造成错分。这时候,由于多数类在数据集中占较大的比重,模型的 总体准确率 主要由多数类的准确率所决定,其泛化能力因此受到质疑。
然而,我们往往对这些少数类更感兴趣,这时候就需要解决这种不平衡问题。以下介绍常见的几种方法。
方法导图
一、数据准备阶段
合并类别:
某些类别的数量很少且非常相似,可以考虑将它们合并为一个类别,从而增加该类别的样本数量。
重采样(Resampling):
1. 过采样(Oversampling):增加少数类的样本数量,直至与多数类大致相同。简单的过采样方法是直接复制少数类的样本,但其存在过拟合的风险;而复杂的方法则是合成 新样本,如 SMOTE技术(Synthetic Minority Over-sampling Technique,SMOTE),它通过在全部少数类样本间进行插值生成新的样本;以及 自适应合成技术(Adaptive Synthetic,ADASYN),它在少数类样本中的离群值/异常值周围生成新的样本。Python中分别使用 imblearn库 中的 RandomOverSampler类、 SMOTE类 和 ADASYN类 来实现。
2. 欠采样(Undersampling):减少多数类的样本数量,使其与少数类的样本数量接近。因为选择性地舍弃了部分多数类样本,故可能会丢失重要信息。Python中使用 imblearn库 中的 RandomUnderSampler类 来实现。
二、建模阶段
集成方法:
使用多个模型的预测结果进行集成,如集成学习算法 EasyEnsemble 和 BalanceCascade。以及尝试不同的算法,例如,决策树和随机森林在某些情况下可能比逻辑回归或SVM更适合处理类别不平衡数据。
样本权重调整:
在模型的训练阶段,为少数类样本分配较高的权重,同时为多数类样本分配较低的权重。(通常在模型的参数中进行设置)
阈值调整:
对模型的预测结果的阈值进行调整。例如,在二分类问题中,通常使用0.5作为决策阈值,但由于类别不平衡,可能需要调整该阈值,使模型对少数类的预测更敏感。
三、评价阶段
采用合适的评估指标:
不以总体准确率为准,应分别评估不同类别的准确率。同时,联合精确率(Precision)、召回率(Recall)、F1分数(F1 Score),以及ROC曲线和AUC值 等指标进行判断。