【漫话机器学习系列】215.处理高度不平衡数据策略(Strategies For Highly Imbalanced Classes)
处理高度不平衡数据的四大策略详解
在机器学习与数据挖掘任务中,“类别不平衡”问题几乎无处不在。无论是信用卡欺诈检测、医疗异常诊断,还是网络攻击识别,正负样本的比例往往严重失衡。比如一个欺诈检测数据集中,可能只有不到 1% 的交易是欺诈行为。
面对这样的数据分布,传统的模型往往在训练时被主导类别(多数类)“牵着走”,结果是模型对少数类(我们最关注的部分)识别能力差,最终效果远不理想。
本文将基于 Chris Albon 的经验总结,深入探讨处理高度不平衡数据的四种核心策略,帮助你提升模型在实际任务中的表现。
不平衡数据的挑战
高度不平衡的标签分布会导致:
-
模型只学习多数类的特征,忽视少数类。
-
普通的准确率(accuracy)指标会误导结果。
-
极易出现 Recall(召回率)极低 或 Precision(精度)极低 的情况。
因此,我们不仅需要在数据层面做处理,还要从算法、损失函数与评估指标多方面协同调整。
四种应对策略
1. 收集更多数据
虽然听起来像“废话”,但这的确是最根本也最有效的方式之一。
-
补充少数类数据 可以直接减少类别间的不均衡性。
-
特别是在真实世界的应用中,通过更高频的采集设备、更大的时间窗口等方式获得更多代表性的样本,对模型性能提升显著。
举例:在医学诊断中,如果肺癌阳性样本太少,可以联合更多医院进行数据汇总,提升阳性样本量。
2. 选择适合不平衡数据的损失函数和评估指标
传统的损失函数(如交叉熵)和准确率指标往往在不平衡场景下表现不佳。
更换损失函数
-
使用 Focal Loss:强调难分类的少数类样本。
-
使用 加权交叉熵:人为提升少数类样本的损失权重。
更换评估指标
-
查准率(Precision)
-
查全率(Recall)
-
F1-score
-
AUC-ROC 曲线
这些指标能更真实反映少数类的分类性能,避免被“99% 准确率”误导。
3. 加权(Class Weighting)
在模型训练过程中,可以显式为不同类别设置权重:
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(class_weight='balanced')
或自定义权重,例如:
class_weight = {0: 1, 1: 5} # 给少数类更高的惩罚
多数深度学习框架(如 PyTorch、TensorFlow)也支持这一策略。
优点:保留了所有原始数据,不做过采样或欠采样。
4. 降采样和升采样(Resampling)
欠采样(Under-sampling)
从多数类中随机抽取与少数类相等数量的样本。
-
优点:加快训练速度
-
缺点:可能丢失有用信息
过采样(Over-sampling)
对少数类进行“复制”或生成新样本,增加其占比。
-
最简单的方式:重复少数类样本
-
更智能的方式:使用 SMOTE(Synthetic Minority Oversampling Technique) 等算法合成新样本。
from imblearn.over_sampling import SMOTE
sm = SMOTE()
X_resampled, y_resampled = sm.fit_resample(X, y)
注意:过采样可能导致过拟合,因此应配合交叉验证等手段使用。
实战技巧:组合使用
在真实任务中,这几种策略并不是非此即彼,而是经常需要组合使用:
-
收集更多数据 + 加权训练
-
SMOTE + Focal Loss + AUC指标
-
欠采样 + Bagging(随机森林)
每种方法都有其优劣,建议根据任务特点灵活搭配,并通过实验进行比较。
总结
策略 | 核心作用 | 风险点 |
---|---|---|
收集更多数据 | 弥补少数类不足 | 成本高,时间长 |
更换评估指标 | 准确反映少数类识别效果 | 不一定适用于所有任务 |
加权训练 | 模型更重视少数类样本 | 调权不当可能反效果 |
过采样与欠采样 | 平衡类别分布,提升模型公平性 | 可能导致过拟合/欠拟合 |
不平衡数据是机器学习的现实挑战,而不是例外。掌握合适的策略与思维方式,才是打造高质量模型的关键。
💬 如果你在项目中遇到类别不平衡的问题,不妨试试上面的策略,并观察模型表现的变化。欢迎留言交流!