多分类拆解策略 — 用二分类器搭出 N 类工程
R — 原文 (Reading)
"现实中常遇到多分类学习任务。……多分类学习的基本思路是'拆解法',即将多分类任务拆为若干 个二分类任务求解。……这里的关键是如何对多分类任务进行拆分,以及如何对多个分类器进行集 成。"
— 周志华,《机器学习》第3章 3.5节 "多分类学习"
"容易看出,OvR 只需训练 N 个分类器,而 OvO 需训练 N(N-1)/2 个分类器,因此,OvO 的存 储开销和测试时间开销通常比 OvR 更大。但在训练时……OvO 的每个分类器仅用到两个类的样例, 因此,在类别很多时,OvO 的训练时间开销通常比 OvR 更小。"
— 周志华,《机器学习》第3章 3.5节
"对同等长度的编码,理论上来说,任意两个类别之间的编码距离越远,则纠错能力越强。……并不 是编码的理论性质越好,分类性能就越好……一个理论纠错性质很好、但导致的二分类问题较难的编 码,与另一个理论纠错性质差一些、但导致的二分类问题较简单的编码,最终产生的模型性能孰强孰 弱很难说。"
— 周志华,《机器学习》第3章 3.5节
I — 方法论骨架 (Interpretation)
多数经典分类器是二分类的;要解决 N 类问题,标准做法是拆解法两步走——先把 N 类拆成若干二分类任务各训一个分类器,再把它们的预测集成为最终结果。全部工程决策落在三个策略的选择上:
- OvO(一对一): N 类两两配对,训 N(N-1)/2 个分类器,测试时投票。每个分类器只见两类样本——训练快,但存储与测试开销随 N 平方膨胀。
- OvR(一对其余): 每次一类为正、其余全为反,只训 N 个分类器。存储省,但每个分类器都要吃全部训练样例——类别多时训练反而更慢。多个分类器同时判正时,取置信度最大者。
- MvM(多对多)/ ECOC: 每次若干类为正、若干类为反,靠编码矩阵系统化组织;预测编码与各类编码比距离、取最近者。冗余编码带来纠错能力——个别分类器出错仍可能解码出正确类别。
两条反直觉纪律贯穿其中:其一,性能上 OvO 与 OvR 在多数情形差不多,选择依据是开销结构而非精度;其二,ECOC 码本不是越长/理论码距越大越好——拆分方式形成的两个"类别子集"区分难度不同,理论纠错好但子任务难的编码可能输给纠错稍差但子任务简单的编码。
A1 — 书中的应用 (Past Application)
案例 1: ECOC 纠错实例——f₂ 出错仍解码 C₃ (c21)
- 问题: 四个类别用五位二元码拆解后,某个二分类器在测试时出错,结果会崩吗?
- 方法论的使用: 作者构造具体演算:正确预测编码应为 (-1,+1,+1,-1,+1);假设 f₂ 出错把第二位翻成 -1,得到错误编码 (-1,-1,+1,-1,+1)。按欧氏距离与各类编码逐一比较,该错误编码仍离 C₃ 的编码最近。
- 结论: 单个分类器的错误被编码间的距离"吸收"了——这就是"纠错输出码"名称的由来;码越长纠错能力越强,但训练开销增大且有限类别数的组合有限、码长超过一定范围便失去意义。
- 结果: 确立了"以码距换容错"的设计哲学,并引出理论最优编码是 NP 难、实践中非最优编码往往已足够好的工程立场。
案例 2: OvO/OvR 开销对照分析
- 问题: 类别数 N 很大时,两种经典拆解谁更划算?
- 方法论的使用: 作者逐项对比:分类器个数(N vs N(N-1)/2)决定存储与测试开销;单个分类器的训练集规模(全部样例 vs 仅两类样例)决定训练时间开销;预测性能"取决于具体的数据分布,在多数情形下两者差不多"。
- 结论: 存在明确的开销交叉点——N 小或单分类器便宜时 OvR 省心;N 大且基学习器贵时 OvO 反而更快。选型看资源约束而非默认习惯。
- 结果: 这张开销矩阵成为拆解策略选型的基本工具;配套边注说明 OvR/MvM 对每类做了相同处理、其拆出的二分类任务中不平衡影响会相互抵消,通常无需专门处理。
案例 3: SVM 无法直接多用 → 必须专门推广
- 问题: 支持向量机是二分类器,遇到多分类怎么办?
- 方法论的使用: 作者在 ch06 阅读材料中明示"SVM 是针对二分类任务设计的,对多分类任务要进行专门的推广";实践中即通过 OvO/OvR/ECOC 外接拆解层(LIBSVM 内部默认 OvO)。
- 结论: "分类器原生支持多分类与否"是选型时就要问清的前置事实——对率回归可直接多用,SVM 必须加拆解层。
- 结果: 把"先查原生支持再谈拆解"确立为本 skill 流程的第一道闸门。
A2 — 触发场景 (Future Trigger) ★
用户会在什么情境下需要这个 skill?
- 用户手上有 SVM/感知机等二分类器,要解决 5~100 类问题,问"怎么拆"。
- 用户纠结"OvO 还是 OvR",说不清两者的真实差别与适用条件。
- 用户听说 ECOC 有纠错能力,想用但不知道码本怎么设计、码长取多少。
- 用户要搭 10 类分类器,担心拆解后的子任务类别失衡,不知道要不要处理。
- 用户面对成百上千类(人脸识别级)仍在考虑两两配对,需要有人提前判死。
语言信号 (用户的话里出现这些就应激活)
- "多分类怎么拆?" / "ovo ovr 区别" / "one-vs-one vs one-vs-rest"
- "ECOC" / "error correcting output codes" / "纠错输出码怎么设计"
- "multiclass strategy" / "10 类分类器怎么搭"
- "sklearn 里 ovo 是默认吗?" / "SVM 能做多分类吗"
- "拆出来的二分类正负例差好多怎么办"
与相邻 skill 的区分
- 与
ml-imbalanced-learning的区别(A2 边界最关键的一条): imbalanced-learning 处理原始数据类别比例失衡本身——度量失守、重采样、阈值移动、代价敏感。本 skill 只管拆解结构的工程;且书中明确指出 OvR/MvM 对每类对称处理,拆出任务的失衡影响会相互抵消,通常无需专门处理。用户说"我的数据 99:1" → 走 imbalanced-learning;用户说"N 类怎么拆" → 走本 skill。两者唯一交界面:若用户改用自定义的非对称拆分(MvM 手工分组),需回头审查子任务比例。 - 与
ml-ensemble-design的区别: ensemble-design 管"为降误差而集成同质个体"(好而不同、扰动通道);本 skill 的拆解是"为扩类别而生成异质任务"——投票/解码只是结合手段上的交集。用户目标是涨精度 → ensemble-design;目标是支持 N 类输出 → 本 skill。 - 与
ml-svm-playbook的区别: svm-playbook 管单个二分类器内部的间隔/核/参数;本 skill 管外层拆解架构。"SVM 做 10 类" = 本 skill 定拆解 + svm-playbook 定内核,两层各答各的问题。
E — 可执行步骤 (Execution)
当 skill 被激活后, agent 应按以下步骤执行:
确认任务形态与前置事实
- 完成标准: 记录类别数 N、样本量 m、基分类器类型;查清该分类器是否原生支持多分类(对率回归/决策树原生支持 → 无需拆解;SVM/感知机 → 进入拆解流程)。另核实每个样本只属一类——若可同时属多类则是多标记学习,超出本 skill 范围。
规模可行性预判
- 完成标准: 对候选策略算复杂度账——OvO 需 N(N-1)/2 个分类器(N=100 时约 4950 个);N 达数百上千时拆解法当场判死,转向嵌套类别体系/度量学习/原生 softmax 多分类等路线,并向用户明示此上限。
按开销矩阵选拆解策略
- 完成标准: 给出选型及理由——基学习器贵、类别多 → OvO(每分类器仅见两类样本,训练总开销小,代价是存储与测试时间平方级);基学习器便宜、存储紧张 → OvR(N 个分类器,但每个都吃全量训练集);需要容错鲁棒性或想注入领域拆分知识 → MvM/ECOC。声明:多数情形下 OvO 与 OvR 性能相当,决策依据是开销结构。
ECOC 码本设计(仅当选定 MvM)
- 完成标准: 遵循双原则——(a) 同码长下任意两类间编码距离尽量远(决定纠错能力上限);(b) 每位拆分形成的两个类别子集区分难度适中(理论纠错好但子任务难的编码可能整体更差)。码长 M 取"够用的纠错冗余"而非越长越好:M 增大 → 纠错增强但训练开销线性上升,且有限类别数的组合有限。随机码常已足够,不必追 NP 难的理论最优。
- 判停条件: 若业务无法容忍解码延迟或 M 个分类器的训练成本 → 退回步骤 3 改 OvO/OvR。
集成与解码配置
- 完成标准: OvO 配投票(被预测最多的类胜出);OvR 配置信度仲裁(多分类器判正时取置信度最大者);ECOC 配码距解码(欧氏/海明距离取最近类别)。若基分类器输出的是概率/分数而非硬标签,先校准可比性再集成。
子任务健康检查
- 完成标准: 抽查拆出的二分类子任务——类别比例、样本量、可分性是否出现极端劣化;确认使用的是 OvR/MvM 标准对称拆分(失衡影响自动抵消)还是自定义拆分(后者须补做比例审查)。报告时注明所用策略与码本参数,保证可复现。
B — 边界 (Boundary) ★
不要在以下情况使用此 skill
- 问题核心是少数类识别不了(原始类别比例悬殊)→ 走
ml-imbalanced-learning;标准拆解策略不处理也不放大失衡,两者是不同层面的病。 - 一个样本可同时拥有多个标签(图像同时含蓝天+白云+羊群)→ 这是多标记学习,不是多分类,拆解法的前提(互斥单标记)已被破坏。
- 分类器原生支持多分类(如 softmax 回归、树模型)且无特殊容错需求 → 直接用,引入拆解层纯属多余开销。
作者在书中警告的失败模式
- 大类问题硬上 OvO (f17): N(N-1)/2 的平方爆炸让方案在 N 大时不可行——1 万类 ≈ 5000 万个分类器,必须用复杂度公式预先判死而不是训到一半才发现。
- 迷信"理论最优编码"(c21 配套警告): 编码的理论纠错性质好 ≠ 分类性能好——不同拆分形成的类别子集难度不同,理论指标必须经过"子任务难度"这道折射再看;寻找最优离散编码矩阵本身是 NP 完全问题。
- 码长无限扩张: 码越长纠错越强但开销同步上涨,且有限类别数的组合数目有限——码长超过一定范围后就失去意义。
- OvR 的"其余"误读: OvA(one-vs-all) 说法不严格——不可能把"所有类"作为反类;多分类器同时判正是常态而非异常,必须有置信度仲裁规则兜底。
作者的盲点 / 时代局限
- 成书于 2015-2016:未覆盖深度学习中端到端 softmax/cross-entropy 已成多分类绝对主流的现实——如今拆解法主要用于二分类器生态(SVM/LIBSVM、传统管线)与极端类别数场景;DAG 拆分、多类 SVM 直接求解等仅在阅读材料一笔带过。
- ECOC 的讨论基于二元码/三元码经典文献,未涉及深度特征空间中的度量学习式解码。
- 书中假设类别集合固定;开放集识别(测试时出现未知类别)完全不在视野内。
容易混淆的邻近方法论
- 多分类 vs 多标记: 多分类每样本恰属一类(拆解法的适用域);多标记每样本可属多类(需标签相关性建模),名字相近、方法体系不同。
- 拆解集成 vs 精度集成: 同样是"多个分类器投票",拆解集成的成员面向互斥的子任务(扩类别数),Boosting/Bagging 的成员面向同一任务(降误差)——目的不同,多样性逻辑也不同。
- 类别失衡的两个层面: 拆解前原始数据的失衡(imbalanced-learning 的领地)vs 拆解后子任务的失衡(标准策略下自动抵消)——混为一谈会导致不必要的重复处理。
相关 skills
- depends-on: ml-task-matching(确认任务确为互斥单标记的多分类)
- contrasts-with: ml-imbalanced-learning(拆解结构 vs 类别比例,A2 分流写死)
- composes-with: ml-svm-playbook(二分类内核 + 本 skill 外层拆解), ml-ensemble-design(解码/投票环节的结合策略接口)
审计信息
- 验证通过: V1 ✓ / V2 ✓ / V3 ✓
- 素材单元: f17(前半已挂 imbalanced-learning,本 skill 承接多分类工程主线)/ c21 / x16 关联边界(扩充批A 新增单元,阶段 1.5 池外补充)
- skill_version: 0.0.1
- 蒸馏时间: 2026-08-24