Skip to content

类别不平衡是机器学习的“常态”,而不是异常。核心思想一句话:要么让模型在训练时更重视少数类,要么让决策阈值更偏向少数类,要么换一个能正确反映业务代价的评估指标。 下面分两部分回答你的问题:数据中类别不平衡 与 题目分数类别不平衡(如使用 F2 score)。


一、数据中类别不平衡怎么办? ​

先给一个工程决策树,再展开细节:

先看数据量 → 小数据:重采样 + 类别权重;大数据:损失函数 + 阈值调整。
再看业务代价 → 漏报(FN)贵?用 F2 / Recall;误报(FP)贵?用 F0.5 / Precision。
最后看评估 → 永远不要用准确率(Accuracy)。

1. 数据层面:重采样与增强 ​

方法做法优点缺点
随机过采样复制少数类简单,不丢信息容易过拟合
随机欠采样丢弃多数类训练快丢失多数类信息
SMOTE在少数类近邻间插值生成新样本缓解过拟合高维/噪声数据效果差,可能生成噪声
ADASYN根据密度自适应生成关注难分样本同样对噪声敏感
Tomek Links / NearMiss清理边界或选择代表性多数类改善类间重叠可能欠拟合
组合采样(SMOTEENN)过采样 + 清洗效果通常更好参数多

工程铁律:重采样只在训练集做,验证集和测试集必须保持原始分布,否则评估会失真。

2. 算法/损失层面:让模型“付出代价” ​

  • 类别权重:class_weight='balanced'(sklearn)、scale_pos_weight(XGBoost/LightGBM)。
  • 代价敏感损失:加权交叉熵,少数类权重高。
  • Focal Loss:降低易分样本权重,聚焦难分样本,对极端不平衡有效。
  • Dice / Tversky Loss:医学图像分割常用,直接优化 F1 类指标。
  • LDAM / Logit Adjustment / Balanced Softmax:从 margin 或 logit 层面校正类别先验。

3. 决策层面:阈值移动 ​

模型输出概率后,不要默认 0.5 为阈值。在验证集上搜索使目标指标(F1、F2、Recall)最大的阈值。

  • 若漏报代价高 → 降低阈值,提高召回。
  • 若误报代价高 → 提高阈值,提高精确率。
  • 阈值必须在验证集上选,绝不能用测试集。

4. 集成与后处理 ​

  • EasyEnsemble / BalanceCascade:多次欠采样训练多个模型,集成投票。
  • 异常检测视角:若少数类极少(<1%),可把问题转为单类分类(One-Class SVM、Isolation Forest)。
  • 概率校准:Platt Scaling、Isotonic Regression,让概率更可靠后再调阈值。

5. 评估指标:别再看 Accuracy ​

  • AUC-ROC:在极端不平衡下可能过于乐观。
  • AUC-PR:对少数类更敏感,推荐。
  • F1 / F2 / F0.5:根据业务代价选 β。
  • MCC(马修斯相关系数):综合 TP、TN、FP、FN,不平衡下更稳健。
  • Balanced Accuracy:各类召回率的平均。
  • G-mean:正负类召回率的几何平均。

二、题目分数类别不平衡与 F2 score ​

“题目分数类别不平衡”通常有两种含义,分别处理:

情况 A:多分类中每个分数段的样本量不平衡 ​

比如评分 1~5 分,1 分很多,5 分很少。此时:

  • 宏平均 F2(macro-F2):对每个分数类分别算 F2,再取平均。平等对待每个分数段,适合你希望每个分数都预测好。
  • 加权平均 F2(weighted-F2):按各类样本数加权,多数类主导,不推荐用于不平衡场景。
  • 序数回归指标:如果分数有顺序(1<2<3<4<5),F2 会忽略“把 5 分错成 4 分”和“错成 1 分”的区别。此时应补充 二次加权 Kappa(QWK)、MAE、Spearman 相关系数。

情况 B:评估指标本身偏向某一类,使用 F2 score ​

F-beta 的严格定义:

Fβ=(1+β2)⋅Precision⋅Recallβ2⋅Precision+Recall
  • β=1:F1,精确率与召回率同等重要。
  • β=2:F2,召回率的权重是精确率的 4 倍(因为 β²=4)。即更容忍误报(FP),但绝不容忍漏报(FN)。
  • β=0.5:F0.5,更看重精确率。

何时用 F2?
当漏报少数类的代价远高于误报时。例如:癌症筛查、欺诈检测、故障预警、召回重要客户。
如何针对 F2 优化?

  1. 训练时使用加权损失或 Focal Loss,让模型偏向召回。
  2. 在验证集上画 PR 曲线,计算每个阈值下的 F2,选 F2 最大的阈值。
  3. 多分类时用 macro-F2,避免多数类掩盖少数类。
  4. 若分数是序数,F2 不够,需结合 QWK 或 MAE。

注意:F2 不是训练损失,通常作为评估和阈值选择指标。你可以用代价敏感学习模拟 F2 的偏好:设 FN 的代价是 FP 的 4 倍,等价于 β=2 的代价比。


三、总结:类别不平衡的“组合拳” ​

  1. 明确业务代价:漏报贵还是误报贵?→ 决定用 F2 还是 F0.5。
  2. 数据层面:小数据重采样(SMOTE + Tomek),大数据慎用。
  3. 损失层面:加权交叉熵、Focal Loss、LDAM。
  4. 决策层面:验证集上调阈值,最大化目标指标。
  5. 评估层面:AUC-PR、F1/F2、MCC、Balanced Accuracy,多分类用 macro 平均。
  6. 序数分数:补充 QWK、MAE,别只用 F2。

没有银弹。类别不平衡的本质是代价不对称——要么改数据分布,要么改损失权重,要么改决策阈值。三者组合,才能让模型真正“看见”少数类。