← 返回题目列表

类别不平衡问题如何处理?

高频 中等 第 6 / 25 题 更新于 2026/07/28
机器学习类别不平衡采样评估指标

简化版

类别不平衡指分类任务中各类别的样本数量差距悬殊(如欺诈检测里正常交易 99.9%、欺诈 0.1%)。危害:模型只要全预测成多数类就能有极高「准确率」,但对我们真正关心的少数类完全无用——准确率这个指标在不平衡下会「骗人」。处理分三方面:① 数据层面——过采样少数类(如 SMOTE)、欠采样多数类;② 算法层面——给少数类更高的类别权重/代价(代价敏感学习);③ 评估层面——别用准确率,改用精确率、召回率、F1、AUC、PR 曲线等更能反映少数类的指标。

详细版

为什么准确率会骗人:

99% 正常 + 1% 欺诈的数据
模型「全部预测为正常」→ 准确率 = 99%!
但欺诈一个都没抓到(召回率 = 0),完全没用

三大类处理方法:

层面方法说明
数据过采样少数类复制或合成少数类样本(SMOTE 合成新样本)
数据欠采样多数类减少多数类样本(可能丢信息)
算法类别权重/代价敏感给少数类更高权重,分错代价更大
算法集成方法如 EasyEnsemble、BalancedRandomForest
评估换指标精确率、召回率、F1、AUC、PR 曲线
其他调整决策阈值降低判为少数类的概率阈值

SMOTE(合成少数类过采样):不是简单复制,而是在少数类样本之间插值合成新样本,避免简单复制导致的过拟合。

完整版教学

一、什么是类别不平衡、为什么是个问题

类别不平衡(Class Imbalance) 指分类任务中,不同类别的样本数量差距非常大。典型场景:

  • 欺诈检测:正常交易 99.9%,欺诈交易 0.1%。
  • 疾病诊断:健康人 99%,患病 1%。
  • 广告点击:不点击 99%,点击 1%。

而且往往我们真正关心的恰恰是少数类(欺诈、患病、点击)。类别不平衡之所以是问题,是因为机器学习模型默认追求「整体准确率最高」——在极度不平衡下,模型发现**「无脑预测多数类」就能拿到极高准确率**,于是干脆放弃学习少数类。结果模型「准确率很高」但对少数类毫无识别能力——完全违背了我们的目的。

二、准确率的陷阱(最关键的认知)

这是类别不平衡最核心的坑准确率(Accuracy)在不平衡数据上会严重误导

举例:99% 正常 + 1% 欺诈。一个什么都不学、全部预测为「正常」 的模型:

  • 准确率 = 99%(因为 99% 的样本确实是正常的)——看起来很棒!
  • 但它一个欺诈都没抓到(召回率 = 0)——完全没用,我们要的就是抓欺诈。

所以在不平衡数据上,高准确率是假象。第一步认知就是:不能只看准确率,要用能反映少数类识别能力的指标(下一节和「模型评估」专题)。很多不平衡问题的「解决」,首先是换对评估指标——否则连「模型好不好」都判断错了。

三、评估层面:换用合适的指标

针对少数类,用这些指标(详见「模型评估」专题):

  • 精确率(Precision):预测为少数类的里面,真的是少数类的比例(查得准不准)。
  • 召回率(Recall):真正的少数类里,被找出来的比例(抓得全不全)——欺诈检测里召回率往往最关键(宁可错杀不可放过)。
  • F1 分数:精确率和召回率的调和平均,综合衡量。
  • AUC / ROC 曲线:衡量模型的排序能力,对不平衡相对鲁棒。
  • PR 曲线(精确率-召回率曲线)在极度不平衡时比 ROC 更能反映少数类的表现

先用对指标,才能正确评估和优化。

四、数据层面:重采样

调整训练数据中各类别的比例,让模型「看到」更均衡的数据:

① 过采样(Over-sampling)少数类——增加少数类样本:

  • 简单复制:直接复制少数类样本。缺点:容易过拟合(模型反复见到相同样本)。
  • SMOTE(合成少数类过采样技术)不是复制,而是在少数类样本之间「插值」合成新样本——取一个少数类样本和它的近邻,在两者连线上随机生成新点。这样生成的是「新的、略有不同」的样本,缓解了简单复制的过拟合。是最常用的过采样方法。

② 欠采样(Under-sampling)多数类——减少多数类样本:

  • 随机丢弃一部分多数类样本,让两类数量接近。
  • 缺点:丢弃数据 = 丢失信息,可能损失多数类的有用模式。适合多数类样本极多、丢一些无妨的场景。

③ 结合:过采样少数类 + 欠采样多数类,或用集成方法(EasyEnsemble 把多数类分成多份、分别和少数类组合训练多个模型再集成)。

五、算法层面:代价敏感学习

不改数据,而是改模型的「代价」——让模型分错少数类的代价更大,逼它重视少数类:

  • 类别权重(class weight):给少数类更高的权重。很多模型(逻辑回归、SVM、随机森林、XGBoost)都支持 class_weight 参数——设成 balanced 会自动按类别频率的反比加权,少数类的每个样本在损失里「更值钱」,分错它的惩罚更重。
  • 代价敏感学习(Cost-sensitive Learning):在损失函数里为不同类别的错误设置不同代价(如把欺诈误判为正常的代价设得远高于反之)。
  • 专门的损失:如 Focal Loss——降低「容易分对的多数类样本」的权重,让模型聚焦在「难分的少数类样本」上(目标检测常用)。

代价敏感的好处是不改变数据分布(避免过采样的过拟合、欠采样的信息丢失)。

六、调整决策阈值

分类模型通常输出一个概率,默认以 0.5 为阈值判类别。在不平衡下,可以调低「判为少数类」的阈值

  • 比如把「判为欺诈」的阈值从 0.5 降到 0.2——只要模型觉得有 20% 可能是欺诈就判为欺诈,能提高召回率(抓到更多欺诈),代价是精确率下降(误报增多)。
  • 通过 PR 曲线 / ROC 曲线选一个符合业务需求的阈值(是宁可错杀多报警、还是宁可漏过少打扰,取决于业务)。

阈值调整不用重新训练模型,是简单有效的手段。

七、如何综合选择

实践中通常组合使用

  1. 首先换对评估指标(F1/召回/AUC/PR),否则判断都是错的。
  2. 数据不太少 → 试试 SMOTE 过采样类别权重(两者都常用,效果看数据)。
  3. 多数类极多 → 欠采样 + 集成。
  4. 根据业务调决策阈值(重召回还是重精确)。
  5. 交叉验证评估各方案(注意:重采样只能在训练集上做,验证/测试集要保持原始分布——否则评估失真,这是数据泄露的一种)。

没有万能方案,要结合数据量、业务对精确率/召回率的偏好来选和调。

八、用数字和工程流程校验理解

在 10000 个样本中若只有 100 个正类,全部预测为负类也有 99% accuracy,但正类 recall=0。若模型找出 80 个正类且报出 120 个正类,则 TP=80、FN=20、FP=40,precision=80/120≈66.7%,recall=80/100=80%。

对象/方案核心机制选择或风险
评估PR-AUC、Recall、F1、业务成本不要只看 Accuracy
数据过采样、欠采样、SMOTE只在训练折内实施
算法/决策类别权重、Focal Loss、调阈值与误报漏报成本对齐

把面试题落到可执行流程:

先固定真实业务代价
再选择指标与验证切分
仅在训练数据上重采样/加权
最后在独立验证集选择阈值

重采样必须放进每个交叉验证训练折内部;先对全量数据做 SMOTE 会把邻近测试样本信息泄露给训练过程。

九、常见误区与追问

  • 误区:类别比例达到 1:10 就必须使用 SMOTE。 是否处理取决于指标、样本量、可分性与业务成本,不存在统一比例阈值。
  • 误区:下采样不会损失有用信息。 删除多数类样本可能丢掉决策边界和子群信息,尤其在总样本量不大时。
  • 追问:为什么 PR-AUC 常比 ROC-AUC 更敏感? 正类极少时大量 TN 会让 ROC 曲线显得乐观,PR 直接关注正类预测质量。
  • 追问:类别权重和调阈值等价吗? 不完全等价;权重会改变训练目标和概率排序,阈值只改变既有分数的决策点。
  • 追问:测试集要不要重采样? 不要,测试集应保持真实分布,才能估计上线表现。

十、加强记忆

记忆时抓住这条主线:类别不平衡 = 各类别样本数量悬殊(欺诈 0.1%),且我们常关心少数类。核心坑:准确率会骗人——「全预测多数类」就能拿 99% 准确率但召回率=0、完全没用。处理三方面:① 评估层面(首要)——别用准确率,改用精确率/召回率/F1/AUC/PR 曲线(否则判断都错);② 数据层面——过采样少数类(SMOTE 在近邻间插值,可能比重复复制提供更多变化,但也可能跨越错误边界)、欠采样多数类(丢信息)、或结合+集成③ 算法层面——类别权重/代价敏感(给少数类更高权重、分错代价更大,如 class_weight='balanced'、Focal Loss,不改数据分布)。另可调决策阈值(降低判为少数类的阈值提召回,按 PR/ROC 和业务选)。注意:重采样只在训练集做,验证/测试集保持原始分布(否则评估失真)。记忆锚点:先换对指标,再重采样或加权,按业务调阈值