Boosting 与 AdaBoost
一句话定义
Boosting 串行训练一串弱学习器:每一轮提高上一轮被分错样本的权重(AdaBoost),后一个模型专注修前一个的错误,最终加权组合——与 Bagging 的「并行平均」相对,是「串行纠错」的集成路线。
为什么重要
它证明了大量「略好于随机」的弱模型可以组合成任意强的模型(Schapire 的弱可学习性等价于强可学习性定理),这一思想是 GBDT/XGBoost 的直接祖先;其指数损失视角(见下)是「从损失函数理解算法」的典范案例。
前置知识
损失函数:从 0-1 损失到代理损失 的指数损失与代理损失;决策树:信息增益、增益率与基尼指数 弱学习器常取浅决策树(决策树桩)。
核心概念
- 弱学习器:略好于随机猜测的模型(错误率 < 0.5),如深度为 1 的决策树。
- 样本权重:AdaBoost 维护权重分布 Dt(i),错分样本权重放大。
- 学习器权重 αt:错误率越低,该轮模型在最终组合中话语权越大。
- 加性模型:f(x) = ∑t αt ht(x),逐轮添加成员。
- 指数损失:L(y, f(x)) = e-y f(x),AdaBoost 等价于在其上做前向分步最小化。
直观类比
错题本策略:第一遍做题,做错的题标星(升权重);第二遍重点刷标星题;每轮老师水平不同,讲得好的老师(低错误率)以后听他的(高 α)。最后的成绩单是所有老师意见的加权投票。代价是:题库里混进的「错误答案」会被反复标星——对噪声敏感的根源。
原理与机制
AdaBoost 流程:初始 D1(i) = 1/n;第 t 轮在权重 Dt 下训练弱学习器 ht,得加权错误率 εt = ∑i: ht(xi) ≠ yi Dt(i);学习器权重 αt = 12ln1 - εtεt;错分样本权重乘 eαt、正确样本乘 e-αt 后归一化。最终 f(x) = sign(∑t αt ht(x))。
等价性推导的骨架:把加性模型 fm = fm-1 + αm hm 代入指数损失并固定已训练部分,对 α, h 联合最小化,可以整理出「权重重标 + 加权错误率」的形式——这正是 AdaBoost 的更新公式。因此 AdaBoost 是指数损失下的前向分步加性建模,它不是经验性技巧而是损失最小化算法。指数损失 φ(t) = e-t 对 t < 0 的惩罚随边际呈指数增长、永不封顶,单个噪声标签即可扭曲整条 boosting 轨迹——对照 hinge(线性封顶不敏感区)与 logistic(对数缓和),这是 AdaBoost 怕噪声、GBDT 可换稳健损失而更强的深层原因。
公式与推导
固定 fm-1,最小化 ∑i exp(-yi fm-1(xi) - α h(xi) yi)。记 wi(m) = e-yi fm-1(xi),展开为
对 ε(加权错误率)最优的 h 即「在当前权重下错误率最小的弱学习器」,对 α 求导置零得 α = 12ln1-εε——与 AdaBoost 原始更新完全一致。
图示
样本: ○○○●●●○●○○●○ ●=被分错
轮1 权重 ▁▁▁█▁▁▁█▁▁▁▁ h₁ 学出粗糙边界
▼ 错分样本权重 ↑
轮2 权重 ▁▁▁▇▁▁▂█▁▁▂▁ h₂ 专攻上轮错区
▼
轮3 权重 ▂▁▂▆▁▁▃█▂▁▃▂ h₃ 继续补漏
─────────────────────
f = sign(α₁h₁ + α₂h₂ + α₃h₃ + …) 加权组合实例或案例
决策树桩在二维螺旋数据上从「接近随机」滚成强分类器:
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import cross_val_score
X, y = make_moons(n_samples=500, noise=0.3, random_state=0)
stump = DecisionTreeClassifier(max_depth=1)
print("单树桩 CV:", cross_val_score(stump, X, y, cv=5).mean().round(3))
ada = AdaBoostClassifier(estimator=stump, n_estimators=200, learning_rate=0.5, random_state=0)
print("AdaBoost CV:", cross_val_score(ada, X, y, cv=5).mean().round(3))弱到单打独斗约 0.85 的树桩,串行纠错后组合出弯曲的非线性边界。
常见误区
- 在含标签噪声的数据上用 AdaBoost:指数损失无上限惩罚会围绕噪声样本反复加权重,性能崩坏;换 logistic 损失(
SAMME.R已移除时可转 GBDT)或先清洗标签。 - Boosting 减方差:它主要减偏差(每轮都在拟合更贴近数据),与 Bagging 的分工要分清。
- 弱学习器必须极弱:现代实践直接用浅树(深度 3~6),太弱迭代过慢、太强则首轮就过拟合。
与其他知识点的关系
随机森林与 Bagging 与本节构成集成的两极(并行降方差 vs 串行降偏差);梯度提升树 GBDT 与 XGBoost 把「换掉指数损失」后的框架推广为 GBDT;不平衡数据与代价敏感学习 的噪声敏感问题在此最尖锐,类不平衡场景慎用原版 AdaBoost。
自测题
- AdaBoost 的两个「加权」分别是什么?
- 要点:样本权重 Dt(错分样本升权,使下轮专注难例)与学习器权重 αt(低错误率者话语权大)。
- 为什么说 AdaBoost 是「指数损失的前向分步最小化」?
- 要点:把加性模型代入 ∑ e-yf(x)、固定历史项联合优化 (αm, hm),得到与原始 AdaBoost 完全相同的更新公式。
- AdaBoost 为什么对标签噪声敏感?
- 要点:指数损失对负边际指数放大、不封顶,噪声样本被持续升权主导训练;对照 hinge/logistic 的饱和行为。
延伸阅读
Freund & Schapire, A Decision-Theoretic Generalization of On-Line Learning…(JCSS, 1997);周志华《机器学习》第 8 章。