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分裂准则
- 对树中的每个叶子结点尝试进行分裂
- 计算分裂前 - 分裂后的分数:
- 如果 \(\text{gain} > 0\),则分裂之后树的损失更小,会考虑此次分裂
- 如果 \(\text{gain} < 0\),说明分裂后的分数比分裂前的分数大,此时不建议分裂
- 当触发以下条件时停止分裂:
- 达到最大深度
- 叶子结点样本数量低于某个阈值
- 所有的结点再分裂不能降低损失
- 等等…

浙公网安备 33010602011771号