Skip to content

XGBoost

核心思想

XGBoost (eXtreme Gradient Boosting) 在 GBDT 基础上引入二阶泰勒展开来近似目标函数,并加入树结构的正则化项,使训练更快、更稳定。

正则化目标函数

Obj=i=1NL(yi,y^i)+t=1TΩ(ht)

其中树的正则项:

Ω(h)=γ|叶子数|+12λj=1Jwj2

J 为叶节点数,wj 为叶节点权重。

二阶泰勒展开推导

在第 t 轮,目标函数对第 t 棵树 ht

Obj(t)=i=1NL(yi,y^i(t1)+ht(xi))+Ω(ht)

Ly^i(t1) 处做二阶泰勒展开:

L(yi,y^i(t1)+ht)L(yi,y^i(t1))+giht(xi)+12hiht2(xi)

其中:

gi=L(yi,y^)y^|y^=y^i(t1),hi=2L(yi,y^)y^2|y^=y^i(t1)

去掉与 ht 无关的常数项,目标函数化为:

Obj~(t)=i=1N[giht(xi)+12hiht2(xi)]+Ω(ht)

叶节点权重最优解

定义叶节点 j 的样本集合 Ij={i:xileafj},则 ht(xi)=wj

代入目标函数:

Obj~(t)=j=1J[Gjwj+12(Hj+λ)wj2]+γJ

其中 Gj=iIjgiHj=iIjhi

wj 求导令其为零:

wj=GjHj+λ

代回目标函数:

Obj~=12j=1JGj2Hj+λ+γJ

分裂增益

对节点分裂的增益:

Gain=12[GL2HL+λ+GR2HR+λ(GL+GR)2HL+HR+λ]γ

只有 Gain>0 时才分裂,γ 起到预剪枝的作用。

XGBoost 的工程优化

  • 列采样:类似随机森林的特征子集采样
  • 加权分位数草图:高效近似分割点搜索
  • 缓存感知访问:利用 CPU 缓存加速列遍历
  • 稀疏感知:自动处理缺失值

代码对应

bash
python -m pipelines.ensemble.xgboost