类别不平衡学习 (Imbalanced Learning)
R — 原文 (Reading)
"这就是类别不平衡学习的一个基本策略——'再缩放'(rescaling)……再缩放也是代价敏感 学习的基础……不能对初始正例进行重复采样,否则会招致严重的过拟合;过采样法的代表性 算法 SMOTE 是通过对训练集里的正例进行插值来产生额外的正例。"
— 周志华《机器学习》第3章3.6节
"有 998 个反例,但正例只有 2 个,那么学习方法只需返回一个永远将新样本预测为反例的 学习器,就能达到 99.8% 的精度;然而这样的学习器往往没有价值,因为它不能预测出任何 正例。"
— 周志华《机器学习》第3章3.6节(998反例)
I — 方法论骨架 (Interpretation)
类别不平衡的病根不在数据本身,而在"训练集观测几率 = 真实几率"这个隐含假设被打破后的度量失守。处理它的统一策略是再缩放 (rescaling):既然训练时两类样本数不等扭曲了判决天平,就在决策端把它扳回来。具体拆成三条路线:
- 直接调整训练集分布(重采样):欠采样砍多数类(省算力但丢信息),过采样补少数类(保信息但可能过拟合)。
- 不动数据只动判决(阈值移动):训练照常,推理时按真实几率调整判正阈值——零额外训练成本。
- 把不平衡翻译成代价(代价敏感):将样本数比 m-/m+ 换成代价比 cost+/cost-,让损失函数自己学会偏心。
三条路线源于同一个判断:无偏采样假设是否成立、以及你愿意在哪一端付代价。选择依据不是技巧流行度,而是部署约束(延迟、算力、能否重训)与信息保全需求。
A1 — 书中的应用 (Past Application)
案例 1: 998 反例思想实验 (c20)
- 问题: 训练集中有 998 个反例、2 个正例,一个永远输出"反例"的学习器精度高达 99.8%。
- 方法论的使用: 作者用这个极端数字暴露 accuracy 在不平衡下的失效机制——当"永远猜多数类"就能拿到可接受精度时,该度量已无法区分有用模型与无用模型。
- 结论: 必须换用查准/查全/代价敏感度量重新评估,并从观测几率推出再缩放策略。
- 结果: 该思想实验成为整节展开欠采样/过采样/阈值移动三路线及其各自坑位(EasyEnsemble 保信息、SMOTE 插值防复制)的论证入口。
A2 — 触发场景 (Future Trigger) ★
用户会在什么情境下需要这个 skill?
- 风控/欺诈/疾病筛查模型 accuracy 很高但混淆矩阵里少数类召回≈0,不知道下一步动数据还是动阈值。
- 正例占比万分之一量级,纠结 SMOTE、随机复制、EasyEnsemble、class_weight、阈值移动哪个适合线上延迟敏感的服务。
- 对少数类做了复制式过采样后验证指标暴涨,怀疑出了问题又说不清原因。
- 用"已报警案件"等选择性上报数据训练检测模型,发现阈值怎么调都不对。
语言信号 (用户的话里出现这些就应激活)
- "accuracy 99.9% 但 fraud recall 是 0 / 欺诈全放行"
- "该用过采样还是欠采样?SMOTE 有没有坑?" / "oversampling vs undersampling"
- "class_weight 和阈值移动是一回事吗?" / "threshold moving"
- "训练集里正例太少了,模型总把少数类判成多数类"
与相邻 skill 的区分(定稿口径)
- 与
ml-evaluation-design的区别(depends-on 单向): 度量失守的判定与换尺子选型(P/R/Fβ/代价敏感)由 evaluation-design 完成;本 skill 在尺子已换对之后,接手再缩放三路线的选路与修复执行。998 反例是两站共用的入口证据。 - 与
ml-diagnosis的区别: diagnosis 遇到"accuracy 99.8% 但少数类召回为 0"时会把症状移交本 skill 换尺子,确认真实差距后再回到 diagnosis 归因;本 skill 不做偏差-方差归因。 - 与
ml-pitfall-audit的区别:审计 skill 只负责问"训练集是无偏采样吗"(x18);本 skill 在前提成立后给出完整的三路线选路与修复执行——审计问前提,本 skill 干活。 - 与
ml-ensemble-design的区别:EasyEnsemble 这类"为不平衡而生"的集成归本 skill(服务再缩放目标);通用集成设计原理(好而不同/扰动通道)归 ensemble-design。 - 与
ml-dimensionality的区别:那是高维小样本下的结构问题;本 skill 只管类别比例失衡引发的判决失真。
E — 可执行步骤 (Execution)
当 skill 被激活后, agent 应按以下步骤执行:
确认度量已失守
- 完成标准: 看混淆矩阵而非 accuracy——若"全猜多数类"也能达到接近当前的 accuracy,则确认失守;同时记录少数类数量级(如 998:2)。
审查无偏采样前提
- 完成标准: 明确回答"观测到的类别比例是否等于真实比例"。若训练数据来自选择性上报/筛选(如只用已报警案件),标注偏差方向。
- 判停条件: 若观测几率≠真实几率且无法估计真实几率,跳到步骤 5 改走领域代价设定或验证集校准,禁止直接套再缩放公式。
按部署约束在三路线中选路
- 完成标准: 给出明确选路及理由,例如——在线延迟敏感→阈值移动(零训练成本);少数类极珍贵不可丢→SMOTE 插值(禁止随机复制);算力受限→EasyEnsemble 式集成欠采样(禁止随机丢弃)。每条路线须附对应禁令。
换度量复评
- 完成标准: 用查准/查全/Fβ 或代价加权指标重评,报告阈值移动前后的混淆矩阵对比,确认少数类召回提升未以总体代价暴涨为交换。
声明残留风险
- 完成标准: 输出中注明所用路线的隐藏前提(如插值可能生成"平均欺诈"样本),以及验证集与线上分布的一致性假设。
B — 边界 (Boundary) ★
不要在以下情况使用此 skill
- 两类比例失衡但业务只关心整体 accuracy 且阈值可接受——此时换度量即可,不必上重采样工程。
- 回归任务的目标分布偏斜(长尾回归)——那是损失函数/变换问题,不是类别再缩放问题。
- 推荐系统"正样本稀疏"本质是排序问题——用 ranking 度量,本框架的三路线不适用。
作者在书中警告的失败模式
- 精度幻觉 (x16): 99.8% 精度的"永远猜反例"学习器毫无价值——先看混淆矩阵再谈上线。
- 修复动作引入新失败模式 (x17): 过采样简单复制正例导致严重过拟合;欠采样随机丢弃反例丢失重要信息。原理级判据:插值而非复制、集成而非随机丢。
- 再缩放的前提陷阱 (x18): 再缩放依赖"训练集是无偏采样"假设,而现实中观测几率≠真实几率(选择性上报/筛选)很常见——前提不成立时阈值移错方向。
作者的盲点 / 时代局限
- 成书于 2015-2016,未覆盖深度不平衡学习的 focal loss、logit adjustment 等现代手段;但三路线的分类逻辑仍能映射到它们(focal loss 属代价敏感路线的变体)。
- 全书默认 i.i.d.,对持续漂移的不平衡流数据(概念漂移下不平衡率本身在变)无讨论。
容易混淆的邻近方法论
- 代价敏感学习: 与再缩放同源(m-/m+ ↔ cost+/cost- 可互换),但视角不同——前者显式建模错误后果,后者修正采样偏差。选路时应说明用的是哪一侧语义。
- 异常检测: 极端不平衡有时应改形为单类问题(one-class),此时不再适用监督再缩放框架。
相关 skills
- depends-on: ml-evaluation-design(度量失守判定与换尺子选型是其前置;本 skill 接手三路线修复)
- contrasts-with: ml-pitfall-audit(x18 前提审查 vs 前提成立后的执行深挖), ml-ensemble-design(不平衡专用集成 vs 通用集成原理)
- composes-with: ml-diagnosis(99.8% 精度红旗的移交对象:换尺子后回诊断主线), ml-bayesian-thinking(代价矩阵同源接口)
审计信息
- 验证通过: V1 ✓ / V2 ✓ / V3 ✓
- 素材单元: f18, f17 / c20 / x16, x17, x18
- skill_version: 0.0.1
- 蒸馏时间: 2026-08-24