XGBoost 与梯度提升
问题
XGBoost 的原理是什么?和 GBDT、LightGBM 有什么区别?
答案
一、GBDT 原理
GBDT(Gradient Boosting Decision Tree)串行训练决策树:
模型 = 树1 + 树2 + 树3 + ...
每棵新树拟合前面所有树的【残差】(梯度)
其中 是第 棵树, 是学习率。
二、XGBoost 改进
| 改进项 | GBDT | XGBoost |
|---|---|---|
| 目标函数 | 一阶梯度 | 二阶梯度(牛顿法) |
| 正则化 | 无 | 树复杂度正则(叶节点数 + 权重) |
| 缺失值 | 需预处理 | 自动处理 |
| 并行 | 无 | 特征级并行(分裂点搜索) |
| 剪枝 | 预剪枝 | 后剪枝(更优) |
三、XGBoost vs LightGBM vs CatBoost
| 对比维度 | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| 树生长策略 | Level-wise | Leaf-wise | Ordered |
| 训练速度 | 中 | 快 | 中 |
| 分类特征 | 需编码 | 原生支持 | 原生支出最佳 |
| 内存占用 | 中 | 低 | 高 |
| 精度 | 高 | 高 | 小数据集最佳 |
| 适用场景 | 通用 | 大数据集 | 多分类特征 |
四、关键超参数
| 参数 | 作用 | 建议值 |
|---|---|---|
n_estimators | 树的数量 | 100~1000(配合 early stopping) |
max_depth | 树最大深度 | 3~8 |
learning_rate | 学习率 | 0.01~0.3 |
subsample | 样本采样率 | 0.6~1.0 |
colsample_bytree | 特征采样率 | 0.6~1.0 |
reg_alpha | L1 正则 | 0~1 |
reg_lambda | L2 正则 | 1~5 |
常见面试问题
Q1: XGBoost 为什么用二阶梯度?
答案:
- 二阶梯度(Hessian)相当于用牛顿法优化,收敛更快
- 二阶信息帮助更好地估计分裂增益,选择更优分裂点
- 同时为正则化提供了自然的权重衰减
Q2: LightGBM 为什么比 XGBoost 快?
答案:
- Leaf-wise 生长:只分裂增益最大的叶子(XGBoost 是 Level-wise 逐层生长)
- 直方图算法:将连续特征离散化为直方图 bin,减少分裂点搜索量
- GOSS:梯度单边采样,保留大梯度样本,随机采样小梯度样本
- EFB:互斥特征捆绑,减少特征数量
Q3: 结构化数据建模首选什么算法?
答案:
- 首选 XGBoost/LightGBM:在 Kaggle 等竞赛中,结构化数据 90% 以上的冠军方案使用 GBDT 类算法
- 深度学习在结构化数据上通常不如 GBDT 类算法
- TabNet 等深度表格模型在特定场景有优势,但通用性不如 XGBoost