跳到主要内容

AdaBoost

一、直观理解:专盯“总分错的人”,再加权投票​

AdaBoost(Adaptive Boosting)把一堆弱分类器(只比瞎猜稍好,如浅决策树桩)串起来:

  1. 一开始每个训练样本权重相同;
  2. 训练一个弱分类器;
  3. 分错的样本下一轮提高权重,分对的降低权重;
  4. 根据该弱分类器的加权错误率给它一个发言权重 αt\alpha_t;
  5. 最终预测是所有弱分类器的加权投票。

像补习班策略:第一次模考后,专攻错题本;下一轮再专攻新的错题。每个老师(弱分类器)按历史战绩获得不同话语权。

AdaBoost 对噪声标签敏感:一直分错的点权重会变得极大,模型可能围着噪声转。

二、适用场景与优缺点​

类型说明
适用场景二分类为主;弱学习器易得;希望提升浅树/树桩性能;特征为表格型;样本量中等。
核心优点理论有训练误差指数下降等经典结果;实现清晰;常显著强于单棵浅树;特征处理相对省心。
局限与缺点对异常值/标错标签敏感;弱学习器太强反而易过拟合;多分类需扩展(SAMME 等);概率输出需校准;如今在精度上常不及 GBDT/XGBoost。

使用前:清洗标签噪声;从树桩或浅树开始;用 CV 选迭代轮数;不平衡时配合权重或重采样。

三、核心原理​

以二分类 yi∈{−1,+1}y_i\in\{-1,+1\} 为例。

初始化 D1(i)=1/nD_1(i)=1/n。对 t=1,…,Tt=1,\ldots,T:

  1. 在分布 DtD_t 下训练弱分类器 ht(x)∈{−1,+1}h_t(x)\in\{-1,+1\};
  2. 加权错误率
εt=∑i=1nDt(i)1(ht(xi)≠yi)\varepsilon_t=\sum_{i=1}^n D_t(i)\mathbf{1}(h_t(x_i)\ne y_i)
  1. 若 εt≥1/2\varepsilon_t\ge 1/2 则停止;否则
αt=12log⁡1−εtεt\alpha_t=\frac{1}{2}\log\frac{1-\varepsilon_t}{\varepsilon_t}
  1. 更新权重并归一化:
Dt+1(i)∝Dt(i)exp⁡(−αtyiht(xi))D_{t+1}(i)\propto D_t(i)\exp\big(-\alpha_t y_i h_t(x_i)\big)

最终分类器:

H(x)=sign(∑t=1Tαtht(x))H(x)=\mathrm{sign}\Big(\sum_{t=1}^{T}\alpha_t h_t(x)\Big)

从加性模型与指数损失 ∑iexp⁡(−yif(xi))\sum_i\exp(-y_i f(x_i)) 的角度看,AdaBoost 每轮拟合都在降低指数损失,是前向阶段加性建模的特例。

多分类常用 SAMME / SAMME.R,MATLAB 的 AdaBoostM1(二类)、AdaBoostM2/GentleBoost 等对应不同变体。

四、关键决策​

决策点建议
弱学习器默认树桩或 MaxNumSplits 很小的树
轮数 TT50–200 起,看 CV;过大可能过拟合噪声
学习率部分实现有 shrink;降低可换更多轮
噪声可疑标签先清洗;或改用更稳健的提升/Bagging
不平衡Prior/Cost,或训练前重采样
与随机森林噪声多、求稳 → 森林;边界难、求提升 → Boosting

五、MATLAB 示例​

X = [
1.0 1.0; 1.1 1.2; 0.9 0.8; 1.2 0.9;
3.0 3.0; 3.1 2.8; 2.9 3.2; 3.2 3.1;
1.5 2.5; 2.5 1.5 % 稍难点
];
y = [1;1;1;1; 2;2;2;2; 1;2];

% AdaBoost + 决策树弱学习器
t = templateTree("MaxNumSplits", 1); % 树桩
ada = fitcensemble(X, y, ...
"Method", "AdaBoostM1", ...
"NumLearningCycles", 50, ...
"Learners", t, ...
"LearnRate", 1);

yhat = predict(ada, X);
disp("混淆矩阵:");
disp(confusionmat(y, yhat));

% 查看训练损失随轮数变化
figure;
plot(loss(ada, X, y, "Mode", "cumulative"));
xlabel("弱学习器个数"); ylabel("训练损失");
title("AdaBoost 累积损失");

% 交叉验证选轮数
cv = fitcensemble(X, y, "Method", "AdaBoostM1", ...
"NumLearningCycles", 80, "Learners", t, ...
"KFold", 5);
% 可用 kfoldLoss(..., "Mode","cumulative") 观察
L = kfoldLoss(cv, "Mode", "cumulative");
figure; plot(L); xlabel("轮数"); ylabel("CV 损失");

[~, bestT] = min(L);
fprintf("CV 建议轮数 ≈ %d, loss=%.3f\n", bestT, L(bestT));

% 预测分数
[label, score] = predict(ada, X);
disp("分数(前 5):"); disp(score(1:5,:));

六、如何解释结果​

  1. 轮数—误差曲线:是否已平台、是否过拟合上扬;
  2. 弱学习器权重 αt\alpha_t:哪些轮贡献大;
  3. 高权重样本:最后仍难分的点是否为噪声或边界;
  4. 特征重要性(若基学习器为树):累计分裂贡献;
  5. 报告:Method、轮数、树深、LearnRate、CV 曲线、与单树/森林对比。

七、常见误区​

1. 基学习器用很深的树​

Boosting 需要的是弱而准的方向,过强基学习器会让后期轮次很难再改进且易过拟合。

2. 轮数只加不加验证​

训练误差一直降不代表测试误差一直降。

3. 噪声点权重爆炸仍继续猛训​

应检查标签,或换 Bagging/稳健损失。

4. 把 AdaBoost 分数直接当概率​

需校准后再谈风险。

5. 多分类误用仅支持二类的接口​

确认 AdaBoostM1 vs 多类方法。

八、小结​

AdaBoost 通过提高难分样本权重、加权组合弱分类器,以指数损失驱动的前向加性模型提升性能。

它是理解 Boosting 的最佳入口。现代表格题更常上 GBDT,但 AdaBoost 的“重权重—再学习—再组合”叙事清晰,适合教学与中等难度二分类基线。