要同时预测四个人的年龄:14、16、24、26。一棵很浅的树只能先给出「学生约 15 / 职场约 25」这种粗刻度,对不上精确岁数。下一棵树不必重学「年龄本身」,而是去学上一棵还差多少——残差为负的往下修,为正的往上修,多轮加起来就对齐了。
梯度提升决策树(Gradient Boosting Decision Tree,GBDT,亦称 GBM / GBRT / MART)正是这条路:基学习器多为回归树,每一轮在损失函数的**负梯度(残差方向)**上再拟合一棵树,再以较小步长加进模型。
段末注释:GBDT(Friedman,约 2001)是算法框架名;XGBoost、CatBoost、LightGBM 等是后续工程实现。后文沿用 GBDT。
配图目录:./1204.机器学习-集成学习-2.Boosting-2.GBDT/(本篇主推文字手算;外链示意见参考文献)。
1. 一句话定位
| 维度 | 一句话 |
|---|---|
| 学习范式 | 监督学习;Boosting |
| 输入 → 输出 | 表格特征 → 多棵回归树预测值之和(分类时常对概率/分数做提升) |
| 在优化什么 | 加法模型 $F_M(x)=\sum_{m=1}^{M}\nu,f_m(x)$,每轮 $f_m$ 拟合当前损失的负梯度 |
出现背景:Friedman(2001)系统阐述梯度提升机(Greedy Function Approximation: A Gradient Boosting Machine)。相对 AdaBoost「改样本权重」的路径,它把提升写成对一般损失的函数空间梯度下降,用回归树去拟合负梯度(残差方向),从而统一回归与多种分类损失。
比喻:作文批改——第一稿先搭骨架;红笔只圈「还差的地方」;下一稿只改红笔处,且每次只改一点(Shrinkage),避免一次改过头。
与 AdaBoost 对照:AdaBoost 加重错分样本;GBDT 改下一轮的拟合目标(残差/梯度),样本权重不必显式那一套。
2. 直觉:残差接力
- 初始化 $F_0$(常取常数,如均值或损失最优常数)。
- 算残差(或一般损失下的负梯度)$r_i$。
- 训练回归树 $f_m$ 去拟合 ${r_i}$。
- $F_m = F_{m-1} + \nu f_m$($\nu$ 为学习率 / Shrinkage)。
- 重复至 $M$ 轮或验证集不再提升。
3. 核心链路
平方损失时,负梯度就是残差:
$$
r_{m,i} = y_i - F_{m-1}(x_i)
$$
新树拟合 $r_{m,i}$ 后:
$$
F_m(x) = F_{m-1}(x) + \nu, f_m(x),\quad 0<\nu\le 1
$$
$\nu$ 偏小:更慢、常更稳,需更多树;$\nu$ 偏大:收敛快但易过拟合。
Shrinkage($\nu$)≠ 优化器里另谈的「梯度步长」口头混用——这里明确是每棵树贡献的折扣。
分类任务:对合适损失(如对数损失)算负梯度,仍用回归树去拟合该「伪残差」,最后映射到类别。
4. 手算完整实例:年龄残差(2 轮)
A. 问题与原始表
用「是否学生」粗特征 $x\in{0,1}$ 预测年龄 $y$(示意)。
| 人 | $x$(1=学生) | $y$(岁) |
|---|---|---|
| $p_1$ | 1 | 14 |
| $p_2$ | 1 | 16 |
| $p_3$ | 0 | 24 |
| $p_4$ | 0 | 26 |
B. 初始化
取 $F_0(x)=\bar y=20$(全体均值);学习率 $\nu=0.5$。平方损失下伪残差 $r_i=y_i-F(x_i)$。
C. 训练过程
第 1 轮
| 人 | $F_0$ | $r^{(1)}=y-F_0$ |
|---|---|---|
| $p_1$ | 20 | $-6$ |
| $p_2$ | 20 | $-4$ |
| $p_3$ | 20 | $+4$ |
| $p_4$ | 20 | $+6$ |
浅树按 $x$ 分裂:学生叶拟合残差均值 $(-6-4)/2=-5$;非学生叶 $(4+6)/2=+5$。记
$$
f_1(x)=\begin{cases}-5,& x=1\ +5,& x=0\end{cases}
$$
$$
F_1=F_0+\nu f_1=20+0.5,f_1
\quad\Rightarrow\quad
F_1(1)=17.5,\ F_1(0)=22.5
$$
第 2 轮
| 人 | $F_1$ | $r^{(2)}=y-F_1$ |
|---|---|---|
| $p_1$ | 17.5 | $-3.5$ |
| $p_2$ | 17.5 | $-1.5$ |
| $p_3$ | 22.5 | $+1.5$ |
| $p_4$ | 22.5 | $+3.5$ |
再按 $x$ 分裂:$f_2(1)=(-3.5-1.5)/2=-2.5$,$f_2(0)=+2.5$。
$$
F_2=F_1+0.5,f_2
\quad\Rightarrow\quad
F_2(1)=16.25,\ F_2(0)=23.75
$$
(实装会继续加树;此处截断。)
D. 可部署对象
$$
F_2(x)=20+0.5 f_1(x)+0.5 f_2(x)
$$
即两棵浅树系数与 $\nu$;推理用 $F_2$,不再单独保留各轮残差表。
E. 预测 / 推断
- 训练内复核($p_1$,$x=1$):$F_2(1)=16.25$(真值 14,误差缩小中)。
- 新样本:工作一年 $x=0$ → $F_2(0)=23.75$ 岁。
5. 适用 / 不适用
| 维度 | 判定 | 要求或边界 | 具体例子 |
|---|---|---|---|
| 特征 | 适用 | 表格混合类型(数值+类别编码);存在非线性与特征交互 | 房价:面积、地段、房龄交互影响,浅树加法可刻画 |
| 特征 | 不适用 | 原始高维感知输入未表征;或强线性且只要系数 | 原始 CT 像素直接 GBDT;只要 $\beta$ 解释时用线性/Logistic |
| 训练目标 | 适用 | 回归或分类;可换损失(平方、绝对、对数损失等) | 点击率预估(对数损失);销量回归(平方/ Huber) |
| 训练目标 | 不适用 | 必须在线毫秒级且模型要极简;或要严格因果系数 | 嵌入式设备线性打分;政策评估要可识别因果参数 |
| 训练数据 | 适用 | 有标签;中等以上样本;可用验证集早停 | 数万条业务表,n_estimators+learning_rate 网格 + early stopping |
| 训练数据 | 不适用 | 标签噪声极大还把树加得很深很多;样本极少却树很深 | 500 条噪声标签、max_depth=10 且 1000 棵树,训练集虚高 |
6. 优缺点与常见坑
优点:对表格数据强;可处理非线性与交互;框架清晰,是 XGBoost/LightGBM 的母体直觉。
缺点:串行训练;经典实现大数据上慢于专用库;超参(树深、轮数、学习率)需联动。
坑:学习率与树棵数不配套;把分类树当 GBDT 基学习器(标准叙述用回归树拟合梯度);不做早停。
7. 最小可运行示例
1 | """GBDT:拟合回归目标;输入 X,输出连续预测。""" |
说明:公开数据集示例,与上文手算表无关。
重要配置参数(sklearn GradientBoostingRegressor / Classifier)
| 参数(库内常用名) | 训练中的作用与影响 | 参考起点 / 常用范围 | 配置指导 |
|---|---|---|---|
n_estimators |
树的数量;太多易过拟合且慢 | 常 100~300;配合早停思维看验证曲线 |
验证误差回升 → 减轮数或降 learning_rate |
learning_rate($\nu$) |
每棵树步长;小更稳,常需更多树 | 常 0.05~0.2;起点可试 0.1 |
lr 与树数联动调;不要只猛加树 |
max_depth |
单树复杂度;深则交互强、更易过拟合 | 表格数据常 2~5;起点可 3 |
过拟合优先减深度/加正则类参数,而不是只减树数 |
subsample |
每轮行采样比例;<1 引入随机性、常更抗噪 |
常 0.7~1.0 |
过拟合可试 0.8;过小可能欠拟合 |
max_features |
每分裂考虑的特征子集 | 默认全特征;特征很多可试 sqrt/log2 |
高维噪声特征多时优先尝试 |
8. 和近邻算法怎么挑
| 需求 | 更优先考虑 |
|---|---|
| 教学:加重错分 | AdaBoost |
| 残差提升框架 | GBDT |
| 通用数值表强基线 | XGBoost |
| 类别多、防目标编码泄漏 | CatBoost |
| 行数极大、要更快训练 | LightGBM |
| 要整段预测分布 | NGBoost |
9. 小结
- GBDT = 回归树拟合负梯度 + 小步长累加。
- 表格非线性问题的默认候选之一;工程上常直接上 XGBoost/LightGBM。
- 最易踩的坑:学习率很小却树太少,或学习率很大还猛加树。
参考文献
- Friedman J.H. Greedy Function Approximation: A Gradient Boosting Machine. Annals of Statistics 2001.
- scikit-learn Gradient Boosting
- 年龄示例图示可参考:集成学习笔记