梯度提升树 GBDT 与 XGBoost
一句话定义
梯度提升把「参数空间的梯度下降」搬到函数空间:每一轮在当前预测的负梯度方向上新增一棵回归树(平方损失下即拟合残差),XGBoost 在此之上引入二阶泰勒展开与对树结构的显式正则化,把 GBDT 做成工业级标准件。
为什么重要
表格数据(特征工程得当的)上,GBDT 家族长期是最强通用模型:损失函数可插拔(回归/分类/排序/生存同一框架)、对缺失与尺度不敏感、精度高。Kaggle 结构化赛道与众多工业风控系统的默认选择。它是「优化 + 集成 + 正则化」三个知识点的集成巅峰。
前置知识
梯度下降与凸优化基础 的梯度下降(必须先懂「负梯度=最速下降方向」);Boosting 与 AdaBoost 的加性模型与前向分步;决策树:信息增益、增益率与基尼指数 的回归树。
核心概念
- 函数空间优化:把预测函数 fm = fm-1 + ρm hm 当作参数,沿损失对当前预测值的负梯度逐步更新。
- 伪残差:rim = -[∂ L(yi, f(xi))/∂ f(xi)]f = f_m-1,第 m 轮树的学习目标。
- 学习率(收缩)ν:每棵树只贡献 ν · hm,小步多轮,防止单树过冲。
- 二阶展开(XGBoost):用一阶导 gi 与二阶导 hi 近似损失,得到解析的叶子权重与分裂增益。
- 显式正则:惩罚叶子数 T 与叶子权重 ‖ w ‖2——对树结构本身的惩罚。
- 行/列采样:借鉴随机森林的去相关技巧。
直观类比
改作文:第一稿(f0 常数)交上去,老师逐句批注出「还差多少」(负梯度/伪残差);第二轮作者专门针对批注写补丁(新树);每轮只采纳批注的三成意见(学习率)防止越改越乱。平方损失下批注恰好就是「标准答案 − 当前稿」的残差,直觉最顺。
原理与机制
第 m 轮在 fm-1 处做一阶泰勒近似:L(yi, fm-1(xi) + h(xi)) ≈ L(yi, fm-1(xi)) + h(xi) · gi,其中 gi = ∂ L / ∂ f(xi)。要使损失下降最多,应取 h ≈ -g——于是「训练一棵回归树去拟合 -g」就是函数空间的一步最速下降。平方损失时 -g = y - fm-1 即残差;对数损失时 -g = y - p 恰好也是残差形式;Huber、分位数、排序损失则给出各自的伪残差——换损失即换任务,框架不变,这是 GBDT 通用性的来源。
XGBoost 的推进:对 ∑i L(yi, fm-1(xi) + h(xi)) 做二阶泰勒展开并加正则 γ T + 12λ∑j wj2,可解析解出最优叶子权重 wj^* = -∑i ∈ j gi∑i ∈ j hi + λ 与最优目标值,分裂增益变成 O(1) 公式:
分裂搜索与近似直方图算法使它可并行、可分布式,工程实现远超 Friedman 原始算法。
公式与推导
GBDT 的通用更新(Friedman 框架):
以平方损失验证:L = 12(y - f)2 ⇒ gi = fm-1(xi) - yi ⇒ rim = yi - fm-1(xi)(标准残差)。XGBoost 目标:
按叶子分组后对每个 wj 是独立二次函数,闭式解即上式叶子权重;把它代回目标得结构分数 -12∑j Gj2Hj + λ + γ T,分裂增益即「左 + 右 − 父」之差——正则化被直接写进了分裂准则。
图示
y ●●●
│ ●● ●● f₀(常数)──┐
│ ●● ●● │ 每轮学习率 ν
│ ●● f₁ = f₀ + ν·h₁(拟合残差)
└────────────────────▶ x │
h₁ 拟合: y − f₀(残差) ▼
h₂ 拟合: y − f₁(新残差) f₂ = f₁ + ν·h₂ → …
残差逐轮变小,模型逐轮逼近 y实例或案例
sklearn 的直方图加速版(等价 XGBoost 思想)在分类任务上的典型用法:
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = fetch_california_housing(return_X_y=True)
gbdt = HistGradientBoostingRegressor(
max_iter=500, learning_rate=0.06, max_depth=None,
max_leaf_nodes=31, l2_regularization=1.0, early_stopping=True, random_state=0)
print("5折 CV R²:", cross_val_score(gbdt, X, y, cv=5).mean().round(3))对照 kp-006 线性回归同数据的 CV R2(约 0.60),GBDT 通常显著更高——非线性与交互被树自动捕捉。
常见误区
- 学习率与树数不联动:ν 调小必须同步加大
max_iter,否则欠拟合;推荐小 ν(0.03~0.1)+ 早停。 - 忽略正则化:认为 boosting 会自己收敛,叶子数/深度/行采样不设限照样过拟合(XGBoost 的 γ、λ 存在的意义)。
- 数据量太小硬上 GBDT:样本几百条时线性模型或更简单方法往往更稳,树系方差优势发挥不出来。
与其他知识点的关系
梯度下降与凸优化基础 的梯度思想在此升维到函数空间;偏差-方差分解与过拟合 中它是「低学习率下逐步降偏差」的典型;超参数调优:网格、随机与贝叶斯搜索 的调参重点(学习率 × 树数 × 正则)集中在本模型;树模型可解释性:特征重要性与 SHAP 的 SHAP 正是在树集成上解释力最强的场景。
自测题
- 为什么「拟合负梯度」而不是「拟合残差」是更普适的表述?
- 要点:残差只是平方损失下负梯度的特例;任意可微损失都有负梯度,换损失即扩展到分类/排序/稳健回归。
- XGBoost 相对经典 GBDT 的两大改进?
- 要点:二阶泰勒展开(更快收敛、更准步长)+ 显式结构正则(叶子数 γ、叶子权重 λ²)进分裂增益。
- 学习率在 boosting 中的角色与和树数的关系?
- 要点:收缩系数,控制每轮步长;小 ν 低方差高偏差需更多轮数,常配合早停在验证集上截断。
延伸阅读
Friedman, Greedy Function Approximation(Annals of Statistics, 2001);Chen & Guestrin, XGBoost(KDD, 2016)。