XGBoost

模型概述

* 英文名:XGBoost (eXtreme Gradient Boosting)

* 中文名:极端梯度提升

导数(梯度、Hessian)进行近似优化与高效分裂增益计算,同时加入树结构的正则化以防过拟合。

XGBoost(Extreme Gradient Boosting) 是一种高效的梯度提升决策树算法,通过迭代训练弱决策树并集成,以精准的误差修正和正则化设计成为机器学习领域的经典模型。

XGBoost 用加法模型把多个树组合起来:每一步拟合当前残差(用梯度与二阶信息来做近似),并通过正则化的目标函数来选择树结构与分裂点。训练目标是最小化带正则化项的经验损失(objective)

基础概念

1. 梯度提升框架:基于加法模型,每次训练一棵新的决策树来拟合前一轮模型的预测残差,通过梯度下降最小化损失函数。
2. 关键优化:采用二阶泰勒展开近似损失函数,提升优化效率;引入L1和L2正则化,防止模型过拟合;支持稀疏数据处理和缺失值自动填充。
3. 并行与高效:训练时可对特征进行并行处理,同时通过预排序和缓存机制提升计算速度,适配大规模数据。
本质:一种基于加法模型的梯度提升树(GBDT)实现,侧重于计算效率、正则化和可扩展性。XGBoost 用 CART 决策树作为基学习器,并通过一阶/二阶

关键公式
$加法模型形式(预测值):\hat{y}_i = \sum_{k=1}^K f_k(\mathbf{x}_i)$

* $\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) = \sum_{i=1}^n l!\big(y_i, \hat{y}_i\big) + \sum_{k=1}^K \Omega(f_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 常用形式:
--------------------------------------------------------------------------------

$其中单棵树的复杂度惩罚项(正则化):\Omega(f) = \gamma T + \tfrac{1}{2}\lambda \sum_{j=1}^T w_j^2$

* $\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

动画演示

发现更多可能性

默认固定广告

免费下载 数据序列智能分析

立即体验强大的数字序列预测与分析工具(280MB,推荐天翼网盘下载 访问码:bq4f)

天翼网盘下载 访问码:bq4f 其他下载

推荐内容

默认悬浮广告