Skip to content

GBDT 梯度提升决策树 (Gradient Boosting Decision Tree)

核心思想

GBDT 是一种 Boosting 集成方法:通过逐步添加新的弱学习器来纠正前一轮残差。与 Bagging 的并行独立不同,GBDT 是串行依赖的,旨在降低偏差

前向分布加法模型

最终模型为 T 棵树的叠加:

FT(x)=t=1Tηht(x)

其中 η 为学习率(缩减系数),ht 为第 t 棵回归树。

每一步贪心地添加使损失最小的树:

ht=argminhi=1NL(yi,Ft1(xi)+h(xi))

负梯度作为伪残差

直接优化上式很困难。梯度提升的关键洞察:用损失函数对当前模型预测值的负梯度作为第 t 棵树的拟合目标:

rti=L(yi,F(xi))F(xi)|F=Ft1
损失函数L(y,F)负梯度 rti
平方损失12(yF)2yiFt1(xi) (真实残差)
绝对损失|yF|sign(yiFt1(xi))
对数损失 (分类)[ylnp+(1y)ln(1p)]yipi

可以看到,当使用平方损失时,负梯度恰好就是残差本身,这正是 GBDT 名称中"残差"的由来。

完整算法流程

  1. 初始化 F0(x)=argminci=1NL(yi,c)
  2. t=1,2,,T
    1. 计算伪残差 rti
    2. 用回归树拟合 {(xi,rti)},得到 ht
    3. 对每个叶节点区域 Rtm,计算最优输出值:γtm=argminγxiRtmL(yi,Ft1(xi)+γ)
    4. 更新 Ft(x)=Ft1(x)+ηmγtm1(xRtm)

正则化手段

  • 学习率 η(0,1]:缩小每棵树的贡献
  • 子采样:每轮只用部分样本(随机梯度提升)
  • 树复杂度:限制深度、叶节点数、最小分裂样本数

代码对应

bash
python -m pipelines.ensemble.gbdt