极限梯度提升 (XGBoost, eXtreme Gradient Boosting)
训练数据集 \(D=[(x_i,y_i)]\), 其中 \(\overrightarrow x_i=(x_1,x_2,..x_m)^T,x_i\in R^m, y_i \in R, |D|=n\),
决策树模型
\[ \begin{equation}\begin{split}
f(x)=w_{q(x)}
\end{split}\end{equation}
\]
其中,\(q:R^T \rightarrow \lbrace 1,...,T \rbrace\) 是由输入x向叶子节点编号的映射, \(w \in R^T ,\overrightarrow w=(w_1,w_2,..w_m)^T\) 是叶子节点向量,w存储的是当前叶子节点存储的输出值,T为决策树叶子节点数。
给一个向量可以通过q映射到那个叶子节点下。
假设树已经生成,如何生成在下面。
提升决策树模型输出
\[ \begin{equation}\begin{split}
\hat y_i = \phi(x_i) = \sum_{k=1}^K f_k(x_i)
\end{split}\end{equation}
\]
其中,\(f_k(x)\) 为第k棵决策树。
加了正则化目标函数
\[ \begin{equation}\begin{split}
\tau(\phi) = \sum_i l(\hat y_i,y_i) + \sum_k \Omega(f_t)
\end{split}\end{equation}
\]
\(f_k\) 是一棵树。正则化项表征当前模型的复杂程度(模型复杂度是指非确定模型的假设空间的大小,假设空间越大,模型越复杂)[1]
\[ \begin{equation}\begin{split}
\Omega(f) = \gamma T+ \frac 1 2 \lambda \lVert w\rVert^2 =\gamma T+ \frac 1 2 \lambda\sum_j^Tw_j^2
\end{split}\end{equation}
\]
T是当前这颗树的叶子节点个数,表征当前模型的复杂程度。叶子节点约少模型约简单。
第t轮目标函数
\[ \begin{equation}\begin{split}
\iota^(t) = \sum_{i=1}^nl(y_i,\hat y_i^{(t-1)}+ f_t(x_i))+\Omega(f_t)
\end{split}\end{equation}
\]
第t轮目标函数\(L^{(t)}\) 在 \(\hat y^(t-1)\)的二阶泰勒展开
\[ \begin{equation}\begin{split}
f(x^t) = f(x^{t-1}+\Delta x )&=f(x^{t-1})+f'(x^{t-1})\Delta x + \frac 1 2f''(x^{t-1})\Delta^2x \\
\hat y_i^{(t-1)} &=x^{t-1}, f_t(x_i)=\Delta x
\end{split}\end{equation}
\]
\[ \begin{equation}\begin{split}
\iota^{(t)} &\approx \sum_{i=1}^n \left[ l(y_i,\hat y^{t-1})+ l'_{y^{t-1}}(y_i,\hat y^{t-1})f_t(x_i) + \frac 1 2 l''_{y^{t-1}}(y_i,\hat y^{t-1}f_t^2(x_i)) \right] +\Omega(f_t)\\
&= \sum_{i=1}^n \left[ l(y_i,\hat y^{t-1}) + g_if_i(x_i) + \frac 1 2h_if_i^2(x_i) \right] + \Omega(f_t)
\end{split}\end{equation}
\]
其中, \(g_i = l'_{\hat y^{t-1}}(y,\hat y^{t-1}) , h_i = l''_{\hat y^{t-1}}(y,\hat y^{t-1})\)
第t轮目标函数 \(\iota^{(t)}\) 的二阶泰勒展开,并移除关于\(f_t(x_t)\)常数项
从第t轮看t-1轮 \(y^{t-1}\) 是已知的,所以剔除 \(l(y_i,y^{t-1})\)
\[ \begin{equation}\begin{split}
\iota^{(t)} &= \sum_{i=1}^n \left[ g_if_i(x_i) + \frac 1 2h_if_i^2(x_i) \right] + \Omega(f_t)\\
&= \sum_{i=1}^n \left[ g_if_i(x_i) + \frac 1 2h_if_i^2(x_i) \right] + \gamma T + \frac 1 2 \gamma\sum_{j=1}^Tw_j^2
\end{split}\end{equation}
\]
n是数据集的个数,第一个累加符号是在整个数据集中计算这个式子。第二个累加符号是在叶子节点累加。
定义叶子节点j上的样本的下标集合 \(I_j= \lbrace i|q(X_i)=j \rbrace\) (关键),则目标函数可表示为按叶子节点累加的形式。
例如遍历一个花名册,念完每个人都遍历到了,或者每个人都被编入到每个小组里面,那么我想要遍历每个人,可以变成我对每个小组里的人进行遍历。两次遍历的结果是一样的。
\[ \begin{equation}\begin{split}
\iota^{(t)} = \sum_{j=1}^T \left[(\sum_{i\in I_j}g_i)w_j + \frac 1 2(\sum_{i\in I_j}h_j+\lambda)w^2_j \right]+\lambda T
\end{split}\end{equation}
\]
为什么 \(f_i(x_i)=w^2_j\) 见公式(20) (精髓啊)
目标函数写完以后,最优解就是使目标函数最小的映射输出。
由于 \(w_j^* = arg\min_{w_j}\hat\iota^{(t)}\)
令 \(\frac {\partial \hat\iota^{(t)}}{\partial w_j}=0\)
\[ \begin{equation}\begin{split}
w_j^* = - \frac {\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i+\lambda}
\end{split}\end{equation}
\]
在将这个最优w(每个叶子节点j的最优分数),得到最优化目标函数值:
\[ \begin{equation}\begin{split}
\hat \iota^{(t)}(q) = -\frac 1 2\sum_{j=1}^T \left[\frac{(\sum_{i\in I_L} g_i)^2}{\sum_{i\in I_L} h_i + \lambda} \right]+\gamma T \end{split}\end{equation}
\]
假设 \(I_L\) 和 \(I_R\) 分别为分裂后左右节点的实例集,令 \(I=I_L \cup I_R\) , 则分裂后损失减少量由下式得出
\[ \begin{equation}\begin{split}
\iota'_{split} =\frac 1 2 \left[ \frac {(\sum_{i\in I_L} g_i)^2 }{\sum_{i\in I_L} h_i + \lambda} + \frac {(\sum_{i\in I_R} g_i)^2 }{\sum_{i\in I_R} h_i + \lambda} - \frac {(\sum_{i\in I_I} g_i)^2 }{\sum_{i\in I_I} h_i + \lambda}\right]-\gamma
\end{split}\end{equation}
\]
左子树的损失值+右子树的损失值-整棵树的损失值,表征当前特征分裂的重要依据
算法:分裂查找的精确贪婪算法
- 输入:当前节点实例集 I;特征维度d = M
- 输出:根据最大分值分裂
(1) \(gain \leftarrow 0\)
(2) \(G \leftarrow \sum_{i\in I}g_i,H \leftarrow \sum{_i\in I} h_i\)
(3) for k = 1 to d do
(3.1) $ G \leftarrow 0 , H_L \leftarrow 0$
(3.2) for j in sorted(I, by \(X_{jk}\)) do
(3.2.1) \(G_L \leftarrow G_L + g_j , H_L \leftarrow H_L + h_j\)
(3.2.2) \(G_R \leftarrow G-G_L, H_R=H-H_L\)
(3.2.3) score \(\leftarrow max(score, \frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda}+\frac{G^2}{H+\lambda})\)
(3.3) end
(4)end
参考文献
【机器学习基础】一文说透正则项与模型复杂度
markdown中公式编辑教程
markdown 数学公式符号大全
【机器学习】经验风险最小化与结构风险最小化
Gradient Boosting 原理、推导及代码实现