1204.机器学习-集成学习-2.Boosting-3.XGBoost

业务表要做点击率或风险排序:非线性强、有缺失、特征多,sklearn 版 GBDT 能跑,但一到「正则怎么写进目标、分裂怎么用二阶信息、大数据怎么扫得动」,就需要更工程化的实现。

极端梯度提升(eXtreme Gradient Boosting,XGBoost)把 GBDT 那套「加法树 + 拟合梯度」做成可扩展库:目标里显式加复杂度惩罚,用损失的二阶泰勒近似指导分裂与叶权重,并补上行/列采样、缺失默认方向、并行与缓存等工程手段。

段末注释:XGBoost(Chen & Guestrin,开源约 2014,KDD 2016)是 GBDT 的可扩展实现;思想仍属梯度提升。后文沿用 XGBoost。

配图目录:./1204.机器学习-集成学习-2.Boosting-3.XGBoost/


1. 一句话定位

维度 一句话
学习范式 监督学习;GBDT 族实现
输入 → 输出 特征(支持缺失)→ 多棵树分数之和,再按任务映射
在优化什么 每轮加一棵树,最小化「训练损失 + 正则 $\Omega$」的二阶近似

出现背景:Chen & Guestrin 开源约 2014,论文 XGBoost: A Scalable Tree Boosting System(KDD 2016)。当时 GBDT 在精度上已强,但大规模训练、正则进目标、缺失与稀疏特征的工程化不足;XGBoost 把复杂度惩罚、二阶近似与系统实现打成可扩展库。

图 1 拟合误差与树复杂度一起进目标

比喻:GBDT 像「专改残差的补丁」;XGBoost 还规定补丁不能太花哨——叶子太多、叶权重太大要挨罚,分裂前先看增益够不够支付「复杂度门票」。


2. 直觉:相对 GBDT 多了什么

  1. 目标 = 损失 + 正则:$\Omega(f)=\gamma T+\frac12\lambda|w|^2$($T$ 叶数,$w$ 叶权重)。
  2. 二阶信息:每轮用 $g_i$(一阶)、$h_i$(二阶)近似损失,叶权重与分裂增益有闭式直觉。
  3. 工程:列采样、收缩、缺失处理、近似分位点找分裂、并行等。

3. 核心链路(最小公式集)

第 $t$ 轮在已有预测 $\hat y^{(t-1)}$ 上加 $f_t$:

$$
\mathcal{L}^{(t)}\approx\sum_i\left[g_i f_t(x_i)+\frac12 h_i f_t^2(x_i)\right]+\Omega(f_t)
$$

其中

$$
g_i=\partial_{\hat y^{(t-1)}},l(y_i,\hat y^{(t-1)}),\quad
h_i=\partial^2_{\hat y^{(t-1)}},l(y_i,\hat y^{(t-1)})
$$

固定树结构时,叶 $j$ 最优权重近似:

$$
w_j^*=-\frac{\sum_{i\in I_j}g_i}{\sum_{i\in I_j}h_i+\lambda}
$$

分裂增益看左右叶相对不分裂是否「赚」过 $\gamma$。读参数时:max_depth / min_child_weight 管复杂度,eta(学习率)管每棵树步子,subsample/colsample_bytree 管随机性防过拟合。


4. 手算完整实例:带正则的叶值(2 轮)

平方损失;数据与 GBDT 年龄例同结构,突出 $\lambda$ 对叶值的收缩。

A. 问题与原始表

$x$(1=学生) $y$
$p_1$ 1 14
$p_2$ 1 16
$p_3$ 0 24
$p_4$ 0 26

B. 初始化

$F_0=20$;$\nu=0.5$;叶正则 $\lambda=1$。树直接拟合残差 $r_i=y_i-F(x_i)$;叶值取

$$
f(x\in\text{叶})=\frac{\sum_{i\in\text{叶}} r_i}{|\text{叶}|+\lambda}
$$

(相对「普通均值」多分母 $\lambda$,步子更小。完整 XGBoost 用 $g,h$ 同形,平方损失时 $h_i=1$。)

C. 训练过程

第 1 轮:$r=(-6,-4,+4,+6)$。

$$
f_1(1)=\frac{-10}{2+1}\approx-3.33,\quad f_1(0)=\frac{10}{3}\approx3.33
$$

(无 $\lambda$ 时为 $-5,+5$。)$F_1=20+0.5 f_1$ ⇒ $F_1(1)\approx18.34$,$F_1(0)\approx21.66$。

第 2 轮:$r\approx(-4.34,-2.34,+2.34,+4.34)$。

$$
f_2(1)\approx\frac{-6.68}{3}\approx-2.23,\quad f_2(0)\approx2.23
$$

$F_2=F_1+0.5 f_2$ ⇒ $F_2(1)\approx17.22$,$F_2(0)\approx22.78$。

D. 可部署对象

$F_2(x)=20+0.5 f_1(x)+0.5 f_2(x)$。

E. 预测 / 推断

  • 训练内($p_1$):$F_2(1)\approx17.22$。
  • 新样本 $x=0$:$F_2(0)\approx22.78$。

5. 适用 / 不适用

维度 判定 要求或边界 具体例子
特征 适用 中高维表格;可含缺失;类别需编码或库内处理策略 广告日志:数值特征 + 哈希后的类别 id,缺失用默认方向
特征 不适用 原始序列/图像端到端;或特征全是极高基数未处理类别 原始 token 序列直接当数值列塞进 XGBoost
训练目标 适用 回归、二分类、多分类、排序等(换 objective binary:logistic 做违约概率;reg:squarederror 做销量
训练目标 不适用 必须可部署成极浅规则且审计只要 if-then 合规只要三层决策清单时,单棵浅树/规则列表更合适
训练数据 适用 数千至千万行量表格;用验证集 early stopping Kaggle 表格赛、业务离线训练后导出模型
训练数据 不适用 样本极少却深度与轮数拉满;分布漂移严重还当静态库 200 条样本 max_depth=12n_estimators=2000

6. 优缺点与常见坑

优点:精度与稳定性常优于朴素 GBDT;生态成熟;特征重要度、早停、缺失友好。
缺点:超参面仍大;超大数据上训练常不如 LightGBM 快;叶-wise 生态上 LightGBM 另有优势。

:忘记 early stopping;学习率与树棵数脱节;类别特征 one-hot 爆炸却不降维;把训练集指标当上线指标。


7. 最小可运行示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"""XGBoost 二分类最小示例:DMatrix → train → predict。"""
import numpy as np
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)

dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

params = {
"objective": "binary:logistic",
"eval_metric": "auc",
"max_depth": 3,
"eta": 0.1,
"seed": 42,
}
model = xgb.train(
params,
dtrain,
num_boost_round=200,
evals=[(dtrain, "train"), (dtest, "test")],
early_stopping_rounds=20,
verbose_eval=False,
)
pred = model.predict(dtest)
print("AUC:", roc_auc_score(y_test, pred))

说明:公开数据集示例,与上文手算表无关。

重要配置参数(XGBoost)

参数(库内常用名) 训练中的作用与影响 参考起点 / 常用范围 配置指导
max_depth 树深;过深易过拟合 表格任务常 3~8;起点可 4~6 过拟合先减深度或加正则,再谈加树
eta / learning_rate 收缩步长;小更稳、常需更多 num_boost_round 0.03~0.2;起点可 0.05~0.1 务必配验证集早停,不要只堆轮数
subsample / colsample_bytree 行/列采样;降方差、抗过拟合 0.6~1.0;起点可 0.8 过拟合双向略降;欠拟合先回调近 1.0
lambda(L2)/ alpha(L1) 叶权重正则;抑制极端叶值 lambda 常从 1 附近试;alpha 默认 0 高噪/过拟合优先加 lambda
min_child_weight 子节点最小海森量和门槛;越大树越保守 视任务;分类常从小值试起再增大 过拟合可增大;过小分裂过碎
早停 early_stopping_rounds 验证指标若干轮不升则停 20~50 生产用 best_iteration 预测,避免用满轮过拟合

8. 和近邻算法怎么挑

需求 更优先考虑
教学:加重错分 AdaBoost
残差提升框架 GBDT
通用数值表强基线 XGBoost
类别多、防目标编码泄漏 CatBoost
行数极大、要更快训练 LightGBM
要整段预测分布 NGBoost

9. 小结

  • XGBoost ≈ GBDT + 正则目标 + 二阶近似 + 工程优化
  • 表格监督任务的常用默认之一;用验证集早停比盲目加树重要。
  • 最易踩的坑:只看训练 AUC、不开 early stopping

参考文献

  1. Chen T., Guestrin C. XGBoost: A Scalable Tree Boosting System. KDD 2016.
  2. XGBoost 文档
-------------本文结束感谢您的阅读-------------