ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GBDT 与 XGBoost 完全指南:从残差拟合到梯度提升,一个例子讲透

GBDT 与 XGBoost 完全指南:从残差拟合到梯度提升,一个例子讲透 1. 为什么一群树比一棵树强集成学习Ensemble Learning的核心直觉是个体容易犯错但群体投票不容易错。两个主流流派Bagging如随机森林并行训练多棵互相独立的树每棵用不同的随机子样本/子特征预测时投票取平均。目标是降低方差——单棵树波动大平均后稳。Boosting如 GBDT串行训练每棵新树专注于纠正前面模型的错误。目标是降低偏差——把弱学习器逐步提升为强学习器。对比维度Bagging随机森林BoostingGBDT训练方式各树并行、互不依赖各树串行、依赖前一轮结果降低什么方差减少波动偏差减少系统性错误树的大小通常较深几乎不过拟合很浅深度 1~3 的弱树对噪声敏感度较鲁棒较敏感噪声会被反复放大用程序在月牙形数据上对比单棵深树与 GBDT 集成的决策边界直观感受差异图 1单棵决策树深度 10与 GBDT 集成60 棵深度 3 的树的决策边界对比数据由程序生成用于演示单棵深树把训练集分类得 100% 正确但边界是大量锯齿状的拼图这是典型的过拟合信号——边界跟着每一个噪声点走而 GBDT 用一堆浅树叠加出的边界平滑得多更接近数据真实的形态。这就是一群弱树强于一棵强树。2. 核心思想加法模型与残差拟合Boosting 把最终模型写成加法模型Additive ModelFM(x) Σ(t1..M) η · ft(x)其中 ft 是第 t 棵决策树η 是学习率收缩系数M 是树的总数。训练采用前向分步算法第 t 轮只学一棵树 ft让它尽量弥补当前模型 Ft−1 的不足然后 Ft Ft−1 η·ft。以回归的平方损失 L(y,F) ½(y−F)² 为例不足就是残差ri yi − Ft−1(xi)每一轮新树拟合的目标不是原始标签 y而是当前模型没预测对的部分残差。模型逐步查漏补缺这就是残差拟合的朴素形态。下一节用手算把整个过程走一遍。3. 手算例子两轮回归提升考虑 5 套房子的数据面积 x抽象单位与价格 y万元样本面积 x价格 y万元115022603380449055110第 0 轮初始化没有树时最优常数预测是均值 F0 ȳ 78。第 1 轮计算残差并训练一棵深度为 1 的树桩去拟合它。程序按 MSE 最小找最优切点 x ≤ 2.5样本真实 y残差 r y−F0树 1 输出F1 F0 0.5×树1x150−28−2366.5x260−18−2366.5x380215.3385.67x4901215.3385.67x51103215.3385.67树 1 把 5 个样本分成两组x ≤ 2.5 的残差均值为 −23x 2.5 的残差均值为 15.33。取学习率 η 0.5 更新F1 78 0.5×f1此时 MSE 从初始的 375 降到 191.5。第 2 轮对 F1 再算残差训练树 2。注意此时残差格局变了——x5 的残差 24.33 明显偏大所以树 2 的最优切点变成了 x ≤ 4.5样本真实 y残差 r y−F1树 2 输出F2 F1 0.5×树2x150−16.5−6.0863.46x260−6.5−6.0863.46x380−5.67−6.0882.62x4904.33−6.0882.62x511024.3324.3397.83更新 F2 F1 0.5×f2MSE 从 191.5 再降到 80.48。两轮下来预测 [63.46, 63.46, 82.62, 82.62, 97.83] 已经明显逼近真实值 [50, 60, 80, 90, 110]且每轮残差都在缩小图 2两轮回归提升全过程——每轮拟合残差、叠加 0.5 倍新树预测逐步逼近真实值数据由程序真实计算这个例子浓缩了 Boosting 的全部精髓模型累加、每轮只学还差的部分、学习率控制每一步的幅度。树 1 和树 2 都是深度 1 的弱树加起来却比任何一棵都强。4. 从残差到梯度GBDT 的通用框架残差拟合只适用于平方损失。如果换成分类的对数损失、回归的 Huber 损失残差是什么答案藏在梯度里对平方损失求导负梯度恰好就是残差。−∂L(yi, F(xi)) / ∂F(xi) yi − F(xi) ri把拟合残差推广为拟合损失函数的负梯度就得到了 GBDT 的通用框架适用于任意可导损失函数图 3GBDT 训练流程——每轮拟合负梯度并累加模型画板示意图分类任务用对数损失 L −y·log(p) − (1−y)·log(1−p) 时负梯度不再是简单残差而是预测概率与真实标签的差同样由每轮新树去拟合。回归用平方损失负梯度就是上一节手算的残差。这个统一视角正是梯度提升这个名字的由来。用程序在真实数据400 个月牙形样本上训练 GBDT记录每一轮迭代后的训练错误率图 4GBDT 训练过程——错误率随迭代轮数持续下降150 轮后训练错误率为 0.000数据由程序真实训练曲线证明只要给够轮数提升模型能对训练数据拟合到几乎完美——这也是为什么树的数量和学习率两个参数必须配合控制否则就是过拟合。5. 学习率每一步走多小手算例子里的 η 0.5 是关键超参数。学习率控制每一轮新树对模型的贡献幅度η 大如 1.0收敛快但每步迈得大、容易在最优解附近震荡也更容易过拟合。η 小如 0.1收敛慢、需要更多树但每一步更稳健通常最终效果更好。实践配比小学习率 多棵树η 0.01~0.1几百到几千棵几乎总是比大学习率效果好代价是训练时间。图 5不同学习率下训练错误率随迭代轮数的变化——η1.0 下降快但前期波动η0.1 平稳但慢数据由程序真实训练注意 η 1.0 曲线前段的抖动步子太大导致损失在下降途中反复横跳。经验法则先把学习率调小0.05~0.1再用早停决定树的棵数。6. 树的数量与过拟合为什么要早停提升模型拟合训练数据的能力近乎无限但拟合训练数据不等于泛化好。用程序在 800 个月牙样本60% 训练、40% 测试上训练不同棵树数的 GBDT图 6树的数量与过拟合——测试误差在树38 处最低0.094之后缓慢回升数据由程序真实计算训练误差一路趋近 0测试误差却先降后升——典型过拟合。所以实践中常用早停Early Stopping每加一批树就在验证集上测一次验证误差连续 N 轮不再下降就停止训练。sklearn 的 GradientBoostingClassifier(n_estimators..., validation_fraction0.1, n_iter_no_change10) 和 XGBoost 的 early_stopping_rounds 都是干这件事的。7. XGBoost把 GBDT 推向极致的工程实现XGBoosteXtreme Gradient Boosting是陈天奇 2014 年开源的 GBDT 实现凭借速度和精度横扫 Kaggle 多年。它和教科书版 GBDT相比有四大核心改进7.1 目标函数二阶泰勒展开GBDT 只用损失的一阶信息梯度XGBoost 把损失做二阶泰勒展开同时使用梯度 gi 和 Hessian hiℒ ≈ Σi [L(yi, F) gi·ft(xi) ½·hi·ft(xi)²] Ω(ft)二阶信息让每一步的优化更准收敛更快、损失下降更稳。7.2 正则化直接写进目标函数XGBoost 给每棵树加了复杂度惩罚 Ω(f) γT ½λΣj wj²T 为叶子数wj 为叶子权重控制树的大小和叶子数值的幅度从机制上抑制过拟合。7.3 分裂增益公式综合上述两点XGBoost 的候选分裂得分去掉常数项后为Gain ½[ GL²/(HLλ) GR²/(HRλ) − (GLGR)²/(HLHRλ) ] − γ其中 G Σgi、H Σhi 是左右子节点的梯度和。增益必须大于 γ 才分裂否则剪枝——正则化系数直接参与分裂决策。7.4 工程优化列采样与近似分裂列采样colsample_bytree每棵树只用一部分特征类似随机森林进一步降方差、加速。近似直方图分裂把连续特征分桶只试桶边界把特征排序复杂度从 O(n log n) 降到 O(n)。并行与缓存按特征预排序、块结构缓存多个分裂点候选并行计算。对比维度GBDT经典实现XGBoost损失信息一阶梯度一阶梯度 二阶 Hessian正则化仅靠树深/叶数等隐式控制γ、λ 直接进目标函数缺失值需自行预处理自动学习缺失值方向特征分裂精确贪心精确贪心 近似直方图工程能力单机串行并行、缓存、早停、交叉验证LightGBM 与 CatBoost 则进一步在直方图与类别特征处理上做了优化三者同属梯度提升树家族核心思想一致。8. 优缺点与适用场景优点缺点表格数据上精度极高常是 Kaggle 首选训练串行、调参维度多参数组合空间大能处理特征间非线性关系与交互无需特征工程对异常值/噪声敏感残差会被放大可同时处理回归与分类输出特征重要性高维稀疏特征如文本词袋上不如线性模型XGBoost/LightGBM 工程成熟、支持并行与早停模型体量大解释性弱于单棵决策树内置缺失值处理与交叉验证树的数量多时推理速度与内存占用上升适用场景表格型数据的回归与分类信贷风控、销量预测、点击率预估、生物信息学几乎无脑首选图像、语音、长文本等非结构化数据则交给深度学习。9. 代码实战从 sklearn 到 XGBoost先用 sklear
返回列表