XGBOOST的算法原理简单介绍

本章会简单介绍一下XGBoost (Extreme Gradient Boosting)的算法原理与核心思想

一、Xgb的构建思想:

1.构建模型的方法是最小化训练数据的损失函数:

\[\min_{f \in F} \frac{1}{N} \sum_{i=1}^N L\left(y_i, f\left(x_i\right)\right) \]

训练的模型复杂度较高,易过拟合

2.在损失函数中加入正则化项:

\[\min_{f \in F} \frac{1}{N} \sum_{i=1}^N L\left(y_i, f\left(x_i\right)\right) + \Omega(f) \]

提高对未知的测试数据的泛化性能。

二、XGBoost与GBDT的关系

XGBoost(Extreme Gradient Boosting)是对GBDT的改进,并且在损失函数中加入了正则化项

\[\text{obj}(\theta) = \sum_{i}^{n} L\left(y_i, \hat{y}_i\right) + \sum_{k=1}^{K} \Omega\left(f_k\right) \]

  • 正则化项用来降低模型的复杂度

\[\Omega(f) = \gamma T + \frac{1}{2}\lambda \|w\|^2 \]

  • \(\gamma T\) 中的 \(T\) 表示一棵树的叶子结点数量。
  • \(\lambda\|w\|^2\) 中的 \(w\) 表示叶子结点输出值组成的向量\(\|w\|\) 向量的模;\(\lambda\) 对该项的调节系数

三、XGBOOST的公式推导

1.提出目标函数

进行 \(t\) 次迭代的学习模型的目标函数如下为:

\[\begin{aligned} obj^{(t)} &= \sum_{i=1}^{n} L\left(y_i, \hat{y}_i^{(t)}\right) + \sum_{k=1}^{t} \Omega\left(f_k\right) \\ &= \sum_{i=1}^{n} L\left(y_i, \hat{y}_i^{(t-1)} + f_t\left(x_i\right)\right) + \sum_{k=1}^{t-1} \Omega\left(f_k\right) + \Omega\left(f_t\right) \end{aligned} \]

2.对目标函数进行泰勒展开

直接对目标函数求解比较困难,通过泰勒展开将目标函数换一种近似的表示方式

  • 目标函数对 \(\hat{y}_i^{(t-1)}\) 进行泰勒二阶展开,得到如下近似表示的公式:

\[obj^{(t)} \approx \sum_{i=1}^{m} \left[ L\left(y_i, \hat{y}_i^{(t-1)}\right) + g_i f_t\left(x_i\right) + \frac{1}{2} h_i f_t^2\left(x_i\right) \right] + \sum_{k=1}^{t-1} \Omega\left(f_k\right) + \Omega\left(f_t\right) \]

  • 其中\(g_i\)\(h_i\) 的分别为损失函数的一阶导、二阶导:

\[\begin{aligned} g_i &= \partial_{\hat{y}^{t-1}} L\left(y_i, \hat{y}^{(t-1)}\right) \\ h_i &= \partial_{\hat{y}^{(t-1)}}^2 L\left(y_i, \hat{y}^{(t-1)}\right) \end{aligned} \]

  • 观察目标函数,发现以下两项表示\(t-1\)个弱学习器构成学习器的目标函数,都是常数,我们可以将其去掉:

\[obj^{(t)} \approx \sum_{i=1}^{m} \left[ \underbrace{L\left(y_i, \hat{y}_i^{(t-1)}\right)}_{\text{常数项}} + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right] + \underbrace{\sum_{k=1}^{t-1} \Omega(f_k)}_{\text{常数项}} + \Omega(f_t) \]

\[obj^{(t)} \approx \sum_{i=1}^{m} \left[ g_i f_t\left(x_i\right) + \frac{1}{2} h_i f_t^2\left(x_i\right) \right] + \Omega\left(f_t\right) \]

\[obj^{(t)} \approx \sum_{i=1}^{m} \left[ g_i f_t\left(x_i\right) + \frac{1}{2} h_i f_t^2\left(x_i\right) \right] + \gamma T + \frac{1}{2}\lambda \|w\|^2 \]

3.目标函数中的各项可以做以下转换:

\(g_if_t(x_i)\) 表示样本的预测值,表示为:

\[\sum_{i=1}^{m} g_i f_t\left(x_i\right) = \sum_{j=1}^{T} \left( \sum_{i \in I_j} g_i \right) w_j \]

\(h_if_t^2(x_i)\) 转换从叶子结点的问题,表示为:

\[\sum_{i=1}^{m} \frac{1}{2} h_i f_t^2\left(x_i\right) = \frac{1}{2}\sum_{j=1}^{T} \left( \sum_{i \in I_j} h_i \right) w_j^2 \]

\(\lambda\|w\|^2\) 由于本身就是从叶子角度来看,表示为:

\[\frac{1}{2}\lambda\|w\|^2 = \frac{1}{2}\lambda \sum_{i=1}^{T} w_i^2 \]

4.将转换后的各项代入原目标函数

\[\begin{aligned} obj^{(t)} &\approx \sum_{i=1}^{m} \left[ g_i f_t\left(x_i\right) + \frac{1}{2} h_i f_t^2\left(x_i\right) \right] + \gamma T + \frac{1}{2}\lambda\|w\|^2 \\ &= \sum_{j=1}^{T} \left[ \left( \sum_{i \in I_j} g_i \right) w_j + \frac{1}{2}\left( \sum_{i \in I_j} h_i \right) w_j^2 \right] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^{T} w_j^2 \\ &= \sum_{j=1}^{T} \left[ \left( \sum_{i \in I_j} g_i \right) w_j + \frac{1}{2}\left( \sum_{i \in I_j} h_i \right) w_j^2 + \frac{1}{2}\lambda w_j^2 \right] + \gamma T \\ &= \sum_{j=1}^{T} \left[ \left( \sum_{i \in I_j} g_i \right) w_j + \frac{1}{2}\left( \sum_{i \in I_j} h_i + \lambda \right) w_j^2 \right] + \gamma T \end{aligned} \]

令:

\[\begin{aligned} G_i &= \sum_{i \in I_j} g_i \quad \text{Gi 表示所有样本的一阶导之和} \\ H_i &= \sum_{i \in I_j} h_i \quad \text{Hi 表示所有样本的二阶导之和} \end{aligned} \]

最终:

\[obj^{(t)} = \sum_{i=1}^{T} \left[ G_i w_i + \frac{1}{2}\left(H_i + \lambda\right) w_i^2 \right] + \gamma T \]

5.求损失函数最小值

\[obj^{(t)} = \sum_{i=1}^{T} \left[ G_i w_i + \frac{1}{2}\left(H_i + \lambda\right) w_i^2 \right] + \gamma T \]

\(w\) 求导并令其等于 0,可得到 \(w\) 的最优值:

\[w_i = -\frac{G_i}{H_i + \lambda} \]

将最优 \(w\) 带入公式可求目标函数的最小值:

\[\begin{aligned} obj^{(t)} &= \sum_{i=1}^{T} \left[ G_i \left(-\frac{G_i}{H_i+\lambda}\right) + \frac{1}{2}(H_i+\lambda) \left(-\frac{G_i}{H_i+\lambda}\right)^2 \right] + \gamma T \\ &= \sum_{i=1}^{T} \left[ G_i \left(-\frac{G_i}{H_i+\lambda}\right) + \frac{1}{2}(H_i+\lambda) \left(-\frac{G_i}{H_i+\lambda}\right)^2 \right] + \gamma T \\ &= \sum_{i=1}^{T} \left[ -\frac{G_i^2}{H_i+\lambda} + \frac{1}{2}\left( \frac{G_i^2}{H_i+\lambda} \right) \right] + \gamma T \\ &= -\frac{1}{2}\sum_{i=1}^{T} \left( \frac{G_i^2}{H_i+\lambda} \right) + \gamma T \end{aligned} \]

6.目标函数最终为:

\[obj^{(t)} = -\frac{1}{2} \sum_{i=1}^{T} \left( \frac{G_i^2}{H_i+\lambda} \right) + \gamma T \]

该公式也叫做打分函数 (scoring function),从损失函数、树的复杂度两个角度来衡量一棵树的优劣。当我们构建树时,可以用来选择树的划分点,具体操作如下式所示:

\[\begin{aligned} \text{Gain} &= Obj_{L+R} - \left( Obj_L + Obj_R \right) \\ &= \left[ -\frac{1}{2} \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} + \gamma T \right] - \left[ -\frac{1}{2}\left( \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} \right) + \gamma(T+1) \right] \\ &= \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 \end{aligned} \]

四、XGBOOST分裂准则

  1. 对树中的每个叶子结点尝试进行分裂
  2. 计算分裂前 - 分裂后的分数:
    1. 如果 \(\text{gain} > 0\),则分裂之后树的损失更小,会考虑此次分裂
    2. 如果 \(\text{gain} < 0\),说明分裂后的分数比分裂前的分数大,此时不建议分裂
  3. 当触发以下条件时停止分裂:
    1. 达到最大深度
    2. 叶子结点样本数量低于某个阈值
    3. 所有的结点再分裂不能降低损失
    4. 等等…
posted @ 2026-06-24 11:34  王新文  阅读(7)  评论(0)    收藏  举报