XGBoost
弱树变强树——不是训练一棵厉害的树,而是把很多棵"专门修错误"的小树加在一起
✦ 先看效果:逐棵树拟合残差
点击"添加一棵树"观察每棵新树如何消化当前误差,或点击"自动添加"连续播放。 调整学习率和树深度,看看收敛速度的变化。
01 核心原理(大白话版)
一个新手厨师第一次做菜,味道淡了(预测偏低)。第二个厨师专门负责"补救"——哪里淡就补哪里。第三个厨师再看剩下的差距继续补……
XGBoost 就是这样:每棵新树只负责修正前面所有树的误差,最终把每棵树的预测加起来,得到精准结果。
和随机森林的区别
随机森林(并行)
同时训练很多棵完全独立的树,每棵树用不同的随机子集,最后投票/取均值。好处:天然并行,不容易过拟合。
XGBoost(串行)
树一棵一棵地加,每棵都针对前面的"残差"来训练。好处:最终精度更高,缺点:必须按顺序训练,且需要调早停防止过拟合。
三个核心步骤
第一棵树之前,用一个常数初始化预测值(回归任务用均值,分类任务用概率的 log-odds)。
计算当前预测和真实值的差距——残差 = 真实值 − 当前预测。这就是"还差多少",也叫损失函数对预测值的负梯度。
训练一棵新决策树专门拟合残差,然后把它乘以学习率 η 加到当前预测上。重复第2步,直到树的数量达到上限或残差足够小。
学习率:慢慢走才不迷路
η(学习率)控制每棵树贡献多少:η=1 表示完全信任每棵新树,收敛快但容易过拟合;η=0.1 每步只走一小步,需要更多棵树,但最终效果更稳定。工业上常用 η=0.05~0.3,树的数量 100~1000。
为什么叫"梯度"提升?
拟合残差其实是梯度下降在函数空间的实现:残差是均方误差损失的负梯度,每加一棵树就是沿梯度方向前进一步。XGBoost 把这个思路推广到任意可微损失函数,用一阶梯度(g)和二阶梯度(h)来决定每个叶节点的最优输出值。
一步步构建 XGBoost
生成带噪声的正弦曲线,手写一棵基于方差减少的回归树。
初始化预测为均值,计算残差,让第二棵树去拟合残差。
把"计算残差 → 拟合残差 → 更新预测"循环 N 次,观察 RMSE 下降曲线。
对比有无正则化的过拟合差异,加入验证集早停避免树太多。
02 代码
03 学术性讲解
目标函数
XGBoost 的目标函数 = 损失项 + 正则项:
其中 L 是可微损失函数(回归用 MSE,分类用对数损失),Ω(f) 是对单棵树的复杂度惩罚:
T 是叶节点数,wⱼ 是第 j 个叶节点的输出值。γ 惩罚叶节点数(控制树深),λ 对叶权重做 L2 正则。
每轮的近似目标
第 t 轮新增树 fₜ,对当前预测 ŷ(t-1) 做二阶泰勒展开:
其中 gᵢ = ∂L/∂ŷ⁽ᵗ⁻¹⁾(一阶梯度),hᵢ = ∂²L/∂(ŷ⁽ᵗ⁻¹⁾)²(二阶梯度)。对 MSE 损失而言 gᵢ = ŷ - y(残差),hᵢ = 1。
叶节点最优权重
把每个叶节点 j 内的样本分组,对 wⱼ 求导并令导数为零,得到最优叶权重:
其中 Gⱼ = Σᵢ∈j gᵢ,Hⱼ = Σᵢ∈j hᵢ。代入目标函数得到该树结构的得分:
分裂增益
评估一个分裂点是否值得,计算分裂前后目标函数的减少量:
Gain > 0 才真正分裂;γ 越大,越难触发分裂,树越矮。这就是 XGBoost 内置正则化的精髓。
XGBoost 的四大工程优化
列采样(Column Subsampling)
每棵树或每次分裂随机选部分特征,降低过拟合的同时加速训练,和随机森林的特征采样同理。
直方图近似(Approximate Split)
不遍历所有分裂点,而是先对特征值分桶(直方图),只在桶边界处找最优分裂,大幅提速。
稀疏感知(Sparsity-aware)
对缺失值和 one-hot 稀疏特征有专门处理策略,自动学习缺失值应该走左子树还是右子树。
缓存感知(Cache-aware)
优化内存访问模式,把梯度数据按列存储,让 CPU cache 命中率最大化,比朴素实现快几倍。
关键超参数
n_estimators / num_round
树的数量。越多精度越高,但过多会过拟合。配合 early_stopping_rounds 用验证集自动确定。
learning_rate(η)
每棵树的缩放系数。越小需要越多棵树,通常 0.05-0.3,训练时间换取泛化能力。
max_depth
树的最大深度,控制模型复杂度。典型值 3-8,太深容易过拟合,太浅欠拟合。
subsample / colsample_bytree
行采样和列采样比例(0~1),增加随机性防止过拟合。通常设 0.7-0.9。
XGBoost vs LightGBM vs CatBoost
XGBoost(2016)
开创性的梯度提升实现,引入正则化和二阶梯度,赢得无数 Kaggle 比赛,至今仍是基准首选。
LightGBM(2017,微软)
直方图加速 + 叶子优先生长(leaf-wise),训练速度比 XGBoost 快 5-10 倍,内存占用更小,大数据首选。
CatBoost(2017,Yandex)
对类别特征原生支持,有序提升(Ordered Boosting)减少预测偏移,对缺失值和类别变量最友好。