1204.机器学习-集成学习-2.Boosting-2.GBDT

要同时预测四个人的年龄: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. 直觉:残差接力

  1. 初始化 $F_0$(常取常数,如均值或损失最优常数)。
  2. 算残差(或一般损失下的负梯度)$r_i$。
  3. 训练回归树 $f_m$ 去拟合 ${r_i}$。
  4. $F_m = F_{m-1} + \nu f_m$($\nu$ 为学习率 / Shrinkage)。
  5. 重复至 $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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"""GBDT:拟合回归目标;输入 X,输出连续预测。"""
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split

X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)

reg = GradientBoostingRegressor(
n_estimators=100,
learning_rate=0.1,
max_depth=3,
random_state=42,
)
reg.fit(X_train, y_train)
print("R2:", reg.score(X_test, y_test))

说明:公开数据集示例,与上文手算表无关。

重要配置参数(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。
  • 最易踩的坑:学习率很小却树太少,或学习率很大还猛加树

参考文献

  1. Friedman J.H. Greedy Function Approximation: A Gradient Boosting Machine. Annals of Statistics 2001.
  2. scikit-learn Gradient Boosting
  3. 年龄示例图示可参考:集成学习笔记
-------------本文结束感谢您的阅读-------------