* 英文名:XGBoost (eXtreme Gradient Boosting)
* 中文名:极端梯度提升
导数(梯度、Hessian)进行近似优化与高效分裂增益计算,同时加入树结构的正则化以防过拟合。
XGBoost(Extreme Gradient Boosting) 是一种高效的梯度提升决策树算法,通过迭代训练弱决策树并集成,以精准的误差修正和正则化设计成为机器学习领域的经典模型。
XGBoost 用加法模型把多个树组合起来:每一步拟合当前残差(用梯度与二阶信息来做近似),并通过正则化的目标函数来选择树结构与分裂点。训练目标是最小化带正则化项的经验损失(objective)
1. 梯度提升框架:基于加法模型,每次训练一棵新的决策树来拟合前一轮模型的预测残差,通过梯度下降最小化损失函数。
2. 关键优化:采用二阶泰勒展开近似损失函数,提升优化效率;引入L1和L2正则化,防止模型过拟合;支持稀疏数据处理和缺失值自动填充。
3. 并行与高效:训练时可对特征进行并行处理,同时通过预排序和缓存机制提升计算速度,适配大规模数据。
本质:一种基于加法模型的梯度提升树(GBDT)实现,侧重于计算效率、正则化和可扩展性。XGBoost 用 CART 决策树作为基学习器,并通过一阶/二阶
* $\hat{y}_i$:第 $i$ 个样本的模型预测值(标量)。
* $K$:总的基学习器(决策树)的数量(正整数)。
* $f_k$:第 $k$ 棵树的函数映射,$f_k \in \mathcal{F}$,其中 $\mathcal{F}$ 表示所有允许的回归树的集合(每个 $f_k$ 是一棵树,把输入 $\mathbf{x}_i$ 映射到叶节点的权重)。
* $\mathbf{x}_i$:第 $i$ 个样本的特征向量(列向量)。
* $\sum_{k=1}^K$:把 K 棵树的输出逐项相加,得到最终的预测。
--------------------------------------------------------------------------------
* $\mathcal{L}(\phi)$:整体损失函数,关于模型 $\phi={f_1,\dots,f_K}$。
* $n$:训练样本总数(正整数)。
* $l(y_i,\hat{y}_i)$:第 $i$ 个样本的训练损失函数(例如平方误差 $(y_i-\hat{y}_i)^2/2$ 或对数损失等),是经验损失项。
* $y_i$:第 $i$ 个样本的真实标签(标量)。
* $\hat{y}_i$:第 $i$ 个样本的预测(参见公式 1)。
* $\Omega(f)$:单棵树的复杂度惩罚项(正则化),XGBoost 常用形式:
--------------------------------------------------------------------------------
* $\gamma$:叶子节点数惩罚常数(非负),控制叶子数的复杂度惩罚。
* $T$:树的叶子数。
* $\lambda$:L2 正则化系数(非负),用于叶子权重 $w_j$ 的L2惩罚。
* $w_j$:第 $j$ 个叶子的权重(叶值)。
--------------------------------------------------------------------------------
| 参数名 | 描述 | 值范围 | 默认值 | 建议值 |
|---|---|---|---|---|
| learning_rate | 学习率(缩放因子) | - | - | - |
| n_estimators | 树的数量(迭代次数) | - | - | - |
| max_depth | 最大深度 | - | - | - |
1. 加法迭代:初始化 $\hat{y}_i^{(0)}$,通常为常数(例如训练标签均值);然后按迭代 $t=1\ldots T$:在第 $t$ 步训练一棵新树 $f_t$,以拟合当前的负梯度(残差)并最小化目标函数增量。
2. 二阶泰勒近似:为了高效优化目标函数的增量,XGBoost 对损失在当前预测处做二阶泰勒展开,使用一阶梯度 $g_i=\partial_{\hat{y}_i} l(y_i,\hat{y}*i)$ 和二阶导数(Hessian) $h_i=\partial^2*{\hat{y}_i} l(y_i,\hat{y}_i)$ 来近似。
3. 分裂增益计算(加权增益):对于某个候选分裂,将左子节点的 $G_L=\sum_{i\in L} g_i$,$H_L=\sum_{i\in L} h_i$,右子节点的 $G_R,H_R$,分裂增益(Gain)通常计算为:
$$
\text{Gain} = \frac{1}{2}\left( \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} \right) - \gamma.
$$
逐个说明公式中符号:
* $\text{Gain}$:该分裂带来的目标函数减少量(增益)。
* $G_L = \sum_{i\in L} g_i$:左子节点样本的一阶梯度和。
* $H_L = \sum_{i\in L} h_i$:左子节点样本的二阶导和(Hessian 和)。
* $G_R, H_R$:右子节点对应的一阶/二阶和。
* $\lambda$:叶子权重的 L2 正则系数(同上)。
* $\gamma$:分裂惩罚(与 $\Omega$ 中的 $\gamma$ 同义),若增益小于 $\gamma$ 则不做分裂。
4. 剪枝与正则化:利用 $\gamma$、$\lambda$(以及 `min_child_weight`)来防止过拟合;通过 `subsample` 与 `colsample_bytree` 做样本/列抽样来增加随机性。
5. Shrinkage(学习率):每棵树的输出乘以缩放因子 `learning_rate`(小于 1),减缓拟合速度,常与更多弱树配合使用以提高泛化。
* 速度快:采用高效的并行化分裂查找与优化实现。
* 二阶导数近似:使用梯度与 Hessian 增强拟合稳定性与分裂质量。
* 正则化:对树结构和叶权重都做正则化($\gamma,\lambda,\alpha$),减缓过拟合。
* 可处理缺失值:自动学习缺失方向。
* 灵活的目标函数:支持回归、分类、排序、自定义目标。
* 特征重要性易解释:能输出特征重要性(gain、cover、frequency)。
* 可扩展性好:适合大规模数据与分布式训练。
下面示例演示 XGBoost 如何处理数据、如何计算残差、如何加和树模型。
注意:此示例是讲解流程逻辑 (不是实际训练结果)。
7.1 第一步:构造训练样本
我们有 5 期三位数:
* 236
* 366
* 599
* 688
* 122
目标:预测 下一期(三位数)的第六位数(个位)。
构造输入特征(举例)
假设模型的输入特征为:
* $x_1$:百位
* $x_2$:十位
* $x_3$:个位
用表格表示:
| 期号 | 数字 | 百位($x_1$) | 十位($x_2$) | 个位($x_3$) | 目标 $y$(下一期个位) |
| -- | --- | --------- | --------- | --------- | ------------- |
| 1 | 236 | 2 | 3 | 6 | 6 |
| 2 | 366 | 3 | 6 | 6 | 9 |
| 3 | 599 | 5 | 9 | 9 | 8 |
| 4 | 688 | 6 | 8 | 8 | 2 |
| 5 | 122 | 1 | 2 | 2 | ?(我们要预测) |
所以对于 122 的下一期,我们要预测:
$y_{\text{next}}$
7.2 第二步:XGBoost 的加法模型结构
XGBoost 的核心结构:
$\hat{y} = \sum_{k \,=\, 1}^{K} f_k(x)$
变量逐一解释:
$\hat{y}$:最终模型预测值
$f_k(x)$:第 $k$ 棵树对当前样本的输出(叶子值)
$K$:树的数量(Boosting 轮数)
7.3 第三步:定义损失函数
假设是回归,XGBoost 的目标函数为:
$\mathcal{L} = \text{SUM}_{i \,=\, 1..n} (y_i - \hat{y}\, i)^2 + \text{SUM}_{k \,=\, 1..K} \Omega(f_k)$
逐一说明:
1. $y_i$:真实值
2. $\hat{y}_i$:预测值(所有树输出的和)
3. $(y_i - \hat{y}_i)^2$:平方误差
4. $\Omega(f_k)$:第 $k$ 棵树的复杂度正则化项,防止过拟合
7.4 第四步:Boosting 流程示例(用简单数字演示)
下面用“演示树输出”的方式让你清楚看到 XGBoost 在做什么。
(真实模型会更复杂,这里只展示逻辑)
(1)第 1 棵树训练:拟合真实值
样本真实目标:
| 样本 | 真实 $y$ |
| --------- | ------ |
| 236 → 下一期 | 6 |
| 366 → 下一期 | 9 |
| 599 → 下一期 | 8 |
| 688 → 下一期 | 2 |
假设第一棵树输出:
| 样本 | $f_1(x)$ |
| --- | -------- |
| 236 | 5.5 |
| 366 | 7.8 |
| 599 | 8.2 |
| 688 | 3.1 |
预测值:
$\hat{y}^{(1)} = f_1(x)$
(2)第 2 棵树训练:拟合第一轮残差
计算残差:
$r_i = y_i - \hat{y}^{(1)}_i$
逐一说明:
* $r_i$:当前残差
* $y_i$:真实值
* $\hat{y}^{(1)}_i$:第一棵树的预测
例如第一条样本:
$r_1 = 6 - 5.5 = 0.5$
假设第二棵树输出的是残差的一部分:
| 样本 | $f_2(x)$ |
| --- | -------- |
| 236 | +0.3 |
| 366 | +0.9 |
| 599 | -0.2 |
| 688 | -0.8 |
模型新的预测:
$\hat{y}^{(2)} = f_1(x) + f_2(x)$
(3)若继续添加第 3 棵、第 4 棵树……
每一棵树继续学习新的残差:
$r^{(t)} = y - \hat{y}^{(t-1)}$
7.5 第五步:用训练好的模型预测“122 的下一期个位”
输入 122 → 特征:
$x = (x_1=1,; x_2=2,; x_3=2)$
假设每棵树对 122 的输出如下:
| 树编号 | 树输出 $f_k(x)$ |
| --- | ------------ |
| 树1 | 5.8 |
| 树2 | +0.6 |
| 树3 | +0.1 |
| 树4 | -0.3 |
预测值:
$\hat{y} = 5.8 + 0.6 + 0.1 - 0.3 = 6.2$
最终预测:
$y_{\text{next}} \approx 6$
7.6 完整流程总结(无公式版)
1. 把 236、366、599、688、122 拆成数字特征
2. 真实目标是:该期的下一期个位
3. 第一棵树拟合真实目标
4. 第二棵树拟合第一棵树的残差
5. 第三棵树拟合第二棵树的残差
6. 所有树的输出相加得到最终预测值
7. 对于 122 的特征输入,依次走每棵树,累加输出
8. 得到最终的预测个位 ≈ 6
无