ML 集成设计:好而不同 · 降对项 · 选对通道与结合法
R — 原文 (Reading)
要获得好的集成,个体学习器应"好而不同",即个体学习器要有一定的"准确性",即学习器不能太坏,并且要有"多样性"(diversity),即学习器间具有差异。
— 周志华,《机器学习》第8章 8.1节
上式显示出,随着集成中个体分类器数目T 的增大,集成的错误率将指数级下降,最终趋向于零。然而我们必须注意到,上面的分析有一个关键假设:基学习器的误差相互独立。在现实任务中,个体学习器是为解决同一个问题训练出来的,它们显然不可能相互独立!事实上,个体学习器的"准确性"和"多样性"本身就存在冲突。
— 周志华,《机器学习》第8章 8.1节
从偏差-方差分解的角度看,Boosting 主要关注降低偏差……Bagging 主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。
— 周志华,《机器学习》第8章 8.2/8.3节
常见做法主要是对数据样本、输入属性、输出表示、算法参数进行扰动……有一些基学习器对数据样本的扰动不敏感,例如线性学习器、支持向量机、朴素贝叶斯、k近邻学习器等,这样的基学习器称为稳定基学习器(stable base learner),对此类基学习器进行集成往往需使用输入属性扰动等其他机制。
— 周志华,《机器学习》第8章 8.5.3节
加权平均法的权重一般是从训练数据中学习而得……较容易导致过拟合。因此,实验和应用均显示出,加权平均法未必一定优于简单平均法。……若直接用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大;因此,一般是通过使用交叉验证或留一法这样的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本。
— 周志华,《机器学习》第8章 8.4节
I — 方法论骨架 (Interpretation)
集成不是"多训几个模型投票",而是一个有明确前提条件的设计问题,分三步走:
第一步:判断值不值得集成。 集成收益完全来自个体间的分歧(diversity):错误互斥的个体集成后大涨,高度雷同的个体集成后零收益白付 T 倍算力,一致地错且差的集成反而更糟。"误差独立→错误率指数下降趋于零"的漂亮结论现实中不成立——个体是为同一问题训出来的,天然相关;且准确性与多样性本身冲突,个体已很强后再强行增多样会掉准确率。所以先测成员相关性/分歧度,别急着堆数量。
第二步:按主导误差项选路线。 先用偏差-方差语言诊断:偏差主导(欠拟合、弱学习器)→ 走串行 Boosting,逐轮聚焦错例削减偏差;方差主导(深树、神经网络等不稳定学习器)→ 走并行 Bagging/随机森林,自助采样削方差。对已经又强又稳的模型做任何集成收益趋零。
第三步:制造多样性靠扰动通道,结合靠策略匹配。 注入随机性有四个旋钮:数据样本扰动、输入属性扰动、输出表示扰动、算法参数扰动——通道必须与基学习器的敏感性匹配(线性学习器/SVM/朴素贝叶斯是稳定学习器,对样本扰动不敏感,须换属性等其他通道;通道可叠加,RF=样本+属性)。结合策略按个体质量分布定:性能相近宜简单平均(加权未必更优、学得的权重还易过拟合),性能悬殊才宜加权,异质概率输出必须先校准再混投,Stacking 必须用交叉验证产生的 held-out 预测训练次级层否则泄露。
A1 — 书中的应用 (Past Application)
案例 1: 三个 66.6% 分类器集成的三种结局(c24)
- 问题: 集成到底能带来多大收益?收益由什么决定?
- 方法论的使用: 作者构造了图 8.2 的最小沙盘——三个分类器对三个测试样本投票:(a) 各自精度仅 66.6% 但错误互斥 → 集成 100%;(b) 三者预测无差别 → 集成仍是 66.6%,零提升;(c) 各自只有 33.3% 且一致地错 → 集成跌到 0%。由此提炼出"好而不同"双必要条件。
- 结论: 集成前先估成员分歧度:错误互斥→大涨;相同→白付 T 倍计算;一致地错且差→负收益。
- 结果: 该三联对照成为全书集成学习的论证起点,也是判断"该不该继续堆模型"的第一反应装置。
案例 2: AdaBoost 与 Bagging 在西瓜数据集 3.0α 上的边界演化(c25)
- 问题: 同一个任务,串行 Boosting 和并行 Bagging 到底选哪个?
- 方法论的使用: 作者在同一份数据上分别以决策树桩/不剪枝决策树为基学习器跑 AdaBoost 与 Bagging,可视化两者分类边界随集成规模的演化:AdaBoost 用极弱的树桩逐轮聚焦错例把边界逐步修正(降偏差);Bagging 让不剪枝深树互相平均、边界更平滑稳定(降方差);RF 起始性能差于 Bagging(属性扰动拉低个体),但随规模收敛到更低误差。
- 结论: 选路由偏差-方差诊断决定——偏差主导走 Boosting,方差主导走 Bagging/RF;RF 的"起始差、终局好"说明多样性注入是有代价的投资。
- 结果: 这组对照图成为"Boosting 降偏差 vs Bagging 降方差"选型规则的图形证据。
案例 3: 随机森林 = 样本扰动 + 属性扰动的叠加示范
- 问题: Bagging 对决策树已经有效,还能更进一步吗?
- 方法论的使用: 作者指出 RF 只对 Bagging 做了小改动——多样性不仅来自样本扰动还叠加属性扰动,个体差异度增加使泛化性能进一步提升;同时点破代价:属性扰动使单个个体变差,故 RF 起始往往较差。
- 结论: 扰动通道可以组合叠加;评估时要看集成的收敛终态而非第一个个体的表现。
- 结果: RF 以"简单改动+双通道"成为被誉为"代表集成学习技术水平的方法",验证了通道叠加的设计价值。
A2 — 触发场景 (Future Trigger) ★
用户会在什么情境下需要这个 skill?
- 手里有一个基线模型想继续涨点:"再训几个不同种子的模型投票/平均会不会更好?""要不要叠一层 stacking?"
- 集成后没有收益甚至变差:"10 个同配置 XGBoost 投票没涨点""SVM 跑 Bagging 零提升"——需要诊断为什么翻车、换哪条路。
- 在 Boosting 家族(AdaBoost/GBDT/XGBoost/LightGBM)与 Bagging 家族(Bagging/随机森林)之间做选型。
- 做 Kaggle/竞赛融合:多模型概率混投结果反而不如最好的单模型、stacking 线下 AUC 涨线上崩、学出来的融合权重不如等权。
- 设计多样性来源:数据太少没法切分造个体、基学习器太稳产不出分歧、Boosting 训练日志里实际个体数远少于设定轮数。
语言信号 (用户的话里出现这些就应激活)
- "ensemble / 模型融合 / 多模型投票 / averaging / blending / stacking"
- "bagging 还是 boosting"、"随机森林 vs GBDT"、"weak learner 弱学习器"
- "好而不同"、"多样性 diversity"、"基学习器/base learner 分歧"
- "stacking 泄露 / out-of-fold / OOF"、"软投票概率不可比 / 校准 calibration"
- "堆模型没涨点"、"加了模型反而变差"
与相邻 skill 的区分
- 与
ml-diagnosis的区别(定稿口径:同时 depends-on 与 contrasts-with): ml-diagnosis 回答"我的单模型为什么差"(偏差-方差归因、过拟合缓解);本 skill 在你已经决定要集成或怀疑集成无效时接管。它消费 ml-diagnosis 的诊断结论(偏差主导/方差主导)来选 Boosting/Bagging 路线——诊断开药方,集成抓药;但不负责单模型修复。 - 与
ml-evaluation-design的区别: 集成方案的效果验证(多次运行取均值、成员分歧度测量协议、Friedman 比较)走 ml-evaluation-design;本 skill 只管集成结构本身的设计与翻车预防。 - 与
ml-imbalanced-learning的区别: EasyEnsemble 这类"为不平衡而生"的集成是重采样路线的产物,归 ml-imbalanced-learning;本 skill 讲的是通用集成设计原理。
E — 可执行步骤 (Execution)
当 skill 被激活后, agent 应按以下步骤执行:
审查集成动机:先判"值不值得"
- 问清现状:现有单模型什么水平?打算用什么个体(同质换种子 or 异质换算法)?
- 快速体检:个体是否都显著好于随机猜测?彼此预测相关性多高?(可让用户报告两两预测一致率或不一致样本数)
- 判停条件: 若个体间预测高度雷同(如只换了随机种子的同配置 GBDT,分歧≈0)→ 直接告知"堆数量无收益",跳到步骤 3 选新扰动通道,禁止建议加 n_estimators 了事。
- 若个体本身接近随机猜测或更差 → 引用三分支沙盘警告负收益,先修个体再谈集成(转 ml-diagnosis)。
- 完成标准: 得出"值得集成/不值得/需先改造个体"的三选一结论并给出依据。
按主导误差项选生成路线
- 诊断主导项:训练误差也高、容量不足 → 偏差主导 → Boosting 族(逐轮聚焦错例);训练/验证间隙大、结果对种子敏感 → 方差主导 → Bagging/RF 族(自助采样+不稳定学习器)。
- 排除条款: 对已经又强又稳的基学习器(如调好的线性 SVM、GBDT 上再叠 GBDT)任何集成收益趋零——明确劝退而非陪跑。
- 完成标准: 输出路线选择 + 一句机理说明("我在降偏差/我在降方差")。
选扰动通道制造多样性
- 对照四通道清单逐一评估可行性:数据样本扰动(默认首选,仅对不稳定学习器有效)、输入属性扰动(冗余属性多时尤佳,顺带提速)、输出表示扰动(翻转标记/分类转回归/拆解子任务)、算法参数扰动(超参抖动;调参时训过的候选模型直接回收利用,额外开销小)。
- 匹配规则: 线性学习器/SVM/朴素贝叶斯/kNN 是稳定基学习器,样本扰动白忙——必须换其他通道;通道可叠加(RF=样本+属性)。
- 完成标准: 为用户的场景指定至少一个与其基学习器敏感性匹配的通道,并说明预期代价(个体可能变差、收敛变慢)。
定结合策略
- 决策顺序: 个体性能相近 → 简单平均/简单投票(默认,加权未必更优);性能相差较大 → 加权,但权重估计也要走交叉验证且施加非负约束,警惕权重过拟合;异质模型的"概率"尺度不可比 → 先各自 Platt/等分校准,校准不了退回硬投票;要用另一个模型来学结合 → Stacking,强制要求次级训练集来自 k 折 out-of-fold 预测。
- 完成标准: 给出明确的结合方式 + 其前提条件的核查动作(如校准曲线、OOF 生成代码路径)。
过一遍六坑自查清单(收尾闸门)
- 逐一核对并提示用户:(a) 个体无差别或太差 → 无增益/负增益;(b) 引用"指数下降"理论修辞 → 其误差独立前提现实不成立;(c) Boosting 日志中实际个体数 < 设定 T → 重赋权触发抛弃过早停止,改重采样重启或原生带权;(d) 学得权重不可靠 → 非负约束+CV;(e) 稳定学习器做了样本扰动 → 换通道;(f) Stacking 直接用初级学习器的训练集生成次级训练集 → 改 OOF。
- 完成标准: 六项每项标注"通过/不适用/已修复",任一"未处理"不得宣布设计完成。
B — 边界 (Boundary) ★
不要在以下情况使用此 skill
- 单模型还没调好、连基线都没跑稳就急着集成——先把 ml-diagnosis 的归因做完,否则是在给一个坏模型叠罗汉。
- 用户的问题其实是类别不平衡(少数类召回为零)——那是度量与重采样问题(ml-evaluation-design / ml-imbalanced-learning),堆集成解决不了尺子选错。
- 追求推理延迟/边缘部署等强资源约束下"能不能再压"的场景——集成天然增加 T 倍推理开销,本 skill 只在精度优先语境下给建议。
- 把集成当作解释性工具(想要模型可解释时)——多数集成牺牲可解释性,需求错位。
作者在书中警告的失败模式
- 个体无差别/太差 (x31): 图 8.2 三分支完备枚举——同质无分歧则集成零收益,个体 33.3% 一致地错则集成 0%;"多模型投票更好"的朴素认知在此失效。
- 误差独立假设不成立 (x32): "T 个分类器错误率指数下降趋于零"依赖误差相互独立,而同一问题训出的个体显然不可能独立——汇报/PPT 里引用该理论曲线属于修辞滥用;正确姿势是论证多样性的具体来源。
- Boosting 过早停止 (x33): 每轮检查基学习器是否比随机猜测好,不达标即抛弃且过程停止——初始设 T=50 可能只剩 7 个个体而性能不佳;重采样法提供"重启动"机会。日志中实际个体数远小于设定值是可观测信号。
- 学得权重不可靠 (x34): 权重从(通常不充分或有噪声的)训练数据学得易过拟合,大规模集成为甚;Breiman 证明须非负权重约束才能保证优于最佳个体;加权平均未必胜过简单平均。
- 稳定基学习器扰动白忙 (x35): 对线性学习器/SVM/朴素贝叶斯做样本扰动型 Bagging 几乎无收益(习题 8.6 专设"为何难提升朴素贝叶斯");处方是换属性扰动等其他通道,而非放弃集成。
- Stacking 泄露 (x36): 直接用初级学习器的训练集生成次级训练集,次级学到的是初级"背答案"的记忆映射——线下虚高线上崩;必须用交叉验证产生的、初级学习器未见过的样本作次级训练集。
作者的盲点 / 时代局限
- 成书于 2015-2016:GBDT 仅一笔带过,XGBoost/LightGBM/CatBoost 未出现;深度学习时代的隐式集成观(SNAPDOTTA、model soup、深度集成的校准特性)不在讨论范围。
- 书中的多样性度量(不合度/Q 统计/κ 系数)与误差-分歧分解只在回归上有严格推导、难以直接优化——作者自己也承认 E-A 分解"难以直接推广到分类任务",实操中只能作定性指引。
- 工程视角薄弱:不讲集成的推理成本工程化(蒸馏回单模型、树并行实现)、分布式训练、特征泄露的全链路防控。
- 教材体例所限:各技巧组合使用的相互作用(如"Stacking + 不平衡重采样")未讨论,真实项目需自行叠加检查。
容易混淆的邻近方法论
- 多分类拆解(OvO/OvR/ECOC): 形式上也"训很多模型再投票",但其目的是任务分解而非性能集成——拆解法的多样性不是设计目标,不要套用本 skill 的分歧度逻辑去"优化"拆解。
- 贝叶斯模型平均 (BMA): 形式上是加权平均的特例,但动机是后验模型不确定度;作者引 Clarke (2003) 指出现实中数据生成模型未必在候选集内,Stacking 通常鲁棒性更好——两者动机不同勿混谈。
- EasyEnsemble 等不平衡专用集成: 表面是 Bagging 变体,实质服务再缩放目标,归 ml-imbalanced-learning。
相关 skills
- depends-on: ml-diagnosis(消费其偏差-方差诊断结论选 Boosting/Bagging 路线;个体太差时也移交其修复)
- contrasts-with: ml-diagnosis(多模型协同 vs 单模型修复——同一对象的两面)
- composes-with: ml-evaluation-design(集成效果的比较检验协议), ml-imbalanced-learning(EasyEnsemble 类方法的完整展开), ml-pitfall-audit(问 4"误差独立"前提的深挖执行版在此)
审计信息
- 验证通过: V1 ✓ / V2 ✓ / V3 ✓(f25/f26/f27/f28 + x31-x36 + c24/c25 共 12 单元,见 verified-fp.md / verified-xc.md)
- 测试通过率: 待阶段 4 压力测试(test-prompts.json)
- skill_version: 0.0.1
- 蒸馏时间: 2026-08-24