梯度提升树:XGBoost / LightGBM / CatBoost
表格数据的"王者"三件套。Kaggle 表格赛里,这三家刷了半个世纪的榜单。理解 GBDT 原理是面试和实战的分水岭。
GBDT 原理
论串行纠错
GBDT 像"补课":第一棵树学个大概,第二棵树专门拟合第一棵树的残差(预测和真实值的差),第三棵树拟合前两棵的残差……最后把所有树的输出加起来。每棵树都很浅(3~8 层),叫"弱学习器"。Shinkage(学习率):每棵树的贡献乘一个小系数(0.01~0.1),让多棵树慢慢修正,过拟合更少。
GBDT 直观例子:拟合残差
XGBoost:极致优化的 GBDT
论陈天奇的工程魔法
XGBoost 比原生 GBDT 强在:① 正则化项(叶子数 + 叶子权重,防过拟合);② 二阶泰勒展开(同时用一阶梯度和二阶梯度,收敛更快);③ 缺失值自动处理(学一个默认方向);④ 列块并行(特征排序预先分块);⑤ 近似分裂(大数据不找精确分裂点)。
LightGBM:又快又省内存
论微软的两个绝活
① 直方图算法:把连续特征分桶(比如 256 个桶),分裂点只在桶边界找,速度快一个数量级。② Leaf-wise(leaf 优先生长):每次从当前所有叶子里挑损失下降最大的那个分裂,而不是整层一起长(XGBoost 默认 Level-wise)。③ GOSS 单边梯度采样:保留大梯度样本、随机采小梯度样本。④ EFB 互斥特征捆绑:把稀疏特征绑一起降维。
CatBoost:类别特征全自动
论Yandex 的贡献
CatBoost 最大卖点:类别特征不用你 One-Hot,直接喂进去,它内部用有序目标编码(Ordered Target Encoding)处理,避免目标泄漏。有序提升(Ordered Boosting):每棵树用不同的样本顺序训练,减少预测偏移。对称树:所有叶子同深度,预测快。
三巨头对比
| 维度 | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| 速度 | 中 | 最快 | 中 |
| 内存 | 中 | 最省 | 中 |
| 类别特征 | 需自己编码 | 支持但要声明 | 原生支持,最强 |
| 精度 | 强 | 强 | 强(调参少时 often 第一) |
| 调参难度 | 中 | 中 | 最简单(默认就好) |
| 小数据集 | 好 | 可能过拟合 | 好 |
XGBoost 关键超参速查
| 参数 | 常用值 | 作用 |
|---|---|---|
| n_estimators | 100~1000 | 树的数量,配 early_stopping_rounds。 |
| max_depth | 3~8 | 每棵树深度,越大越易过拟合。 |
| learning_rate | 0.01~0.1 | shrinkage,小要配多树。 |
| subsample | 0.7~1.0 | 每棵树用多少样本,防过拟合。 |
| colsample_bytree | 0.7~1.0 | 每棵树用多少特征。 |
| reg_alpha / reg_lambda | 0.1 / 1.0 | L1 / L2 正则。 |
| gamma | 0~5 | 分裂所需最小损失下降,防过拟合。 |
本章面试题
Q1. GBDT 和随机森林都用树,区别?
查看答案
随机森林是 Bagging(并行投票,降方差);GBDT 是 Boosting(串行拟合残差,降偏差)。前者树深、并行;后者树浅、串行。
Q2. XGBoost 比原生 GBDT 多了什么?
查看答案
正则化项、二阶泰勒展开、缺失值处理、列块并行、近似分裂算法。
Q3. learning_rate 调大还是调小?
查看答案
小(0.01~0.1)更稳但要更多树;大(0.3+)快但容易过拟合。常用 0.05,配合 early stopping。
Q4. Leaf-wise vs Level-wise?
查看答案
Level-wise 整层一起长(XGBoost 默认),稳但慢;Leaf-wise 只长损失降最多的叶子(LightGBM),快但小数据易过拟合,要配 min_child_samples。