← 返回题目列表

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

高频 中等 第 7 / 25 题 更新于 2026/09/25
机器学习类别不平衡采样评估指标
学习 AI 实战项目

简化版

类别不平衡指分类任务中各类别样本比例差距较大(如欺诈检测里正常交易 99.9%、欺诈 0.1%)。此时“全预测多数类”也能得到很高 Accuracy,所以不能只看准确率。应先按误报/漏报成本选择 Precision、Recall、PR-AUC、分层指标与决策阈值,再考虑类别权重、过采样、欠采样或集成;重采样只能在训练折内完成,SMOTE 对类别特征、稀疏高维数据和边界重叠并非总适用。

详细版

为什么准确率会骗人:

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

三大类处理方法:

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

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

完整版教学

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

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

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

而且往往我们真正关心的恰恰是少数类(欺诈、患病、点击)。类别不平衡会让未加权经验损失主要受多数类样本贡献,固定阈值下也可能偏向多数类;但具体行为取决于损失、采样、可分性和校准,不能说所有模型都直接“追求准确率”。最直观的问题仍是:一个无识别能力的多数类基线也可能拥有很高 Accuracy。

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

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

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

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

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

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

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

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

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

四、数据层面:重采样

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

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

  • 简单复制:直接复制少数类样本。缺点:容易过拟合(模型反复见到相同样本)。
  • SMOTE(合成少数类过采样技术):在少数类样本与其近邻之间插值,而不是简单复制。它可能提供更多变化,也可能在类别重叠处生成错误样本;对类别字段、文本稀疏向量和时序数据不能不经适配直接套用。

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

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

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

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

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

  • 类别权重(class weight):给少数类更高的损失权重。许多实现提供类似 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 和业务选)。注意:重采样只在训练集做,验证/测试集保持原始分布(否则评估失真)。记忆锚点:先换对指标,再重采样或加权,按业务调阈值。