GBDT & XGBoost
回归树
单棵回归树可以表示成如下的数学形式
\[f(x) = \sum_j^Tw_j\mathbf{I}(x\in R_j)
\]
其中\(T\)为叶节点的个数,\(\mathbf{I}\)为指示函数。
回归树的参数学习
当给定树的结构的时候,即知道哪些点划分到哪些叶节点后,可以直接优化下式来获得参数
\[\hat{R}(f) = \dfrac{1}{n}\sum_{i=1}^nL\left(y_i, \sum_{j=1}^Tw_j\mathbf{I}(x_i\in R_j)\right)
\]
又有划分的区域是不相交的,所以可以最小化每个区域的损失来求得每个区域\(R_j\)对应的参数\(w_j\)。
回归树的结构学习
上面给出了回归树的结构化损失函数
\[\hat{R}(\hat{f}) = \sum_j^T\sum_{i\in I_j}L(y_i,\hat{w}_j)=\sum_j^T\hat{L}_J
\]
假设现在要对节点\(k\)进行分裂,那么有分裂之前的经验损失为
\[\hat{R}(\hat{f}_{before}) = \hat{L}_k+\sum_{j\not= k}\hat{L}_j
\]
分裂之后的经验损失为
\[\hat{R}(\hat{f}_{after})=\hat{L}_L + \hat{L}_R+\sum_{j\not= k}\hat{L}_j
\]
我们用增益来评价分裂的好坏,其计算如下
\[Gain = \hat{R}(\hat{f}_{before}) - \hat{R}(\hat{f}_{after}) = \hat{L}_k - (\hat{L}_L + \hat{L}_R)
\]
上式本质上是比较划分之后相较于划分前,经验损失可以下降多少。也就是说下降得越多就越好,于是使得上式值最大的划分将会被采纳。
boosting 算法
boosting算法的基本形式如下
\[f(x) = \sum_{m=0}^Mf_m(x)
\]
就是将多个弱学习器(基学习器)通过相加进行组合。可以写成如下的自适应形式
\[f(x) = \theta_0 + \sum_{m=1}^M\theta_m\phi_m(x)
\]
boosting 算法的学习过程是串行的,不断去拟合残差。所以,在任意的第\(m\)步,其所需要优化和学习的东西可以表示成下式
\[\{\hat{\theta}_m, \hat{\phi}_m\}=\arg\min_{\{\theta_m, \phi_m\}}\sum_{i=1}^nL\left(y_i,\hat{f}^{(m-1)}(x_i) + \theta_m\phi_m(x_i)\right)
\]
GBDT
GBDT中选取的弱学习器是回归树,增加树的目的纯粹是为了减少经验损失,所以会有
\[\sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i)) \ge \sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i) + \theta_m\phi_m(x_i))
\]
为了使得上式成立,我们寻找得到的新的树\(\phi_m(x_i)\)必须是在\(L(y_i,\hat{f}^{(m-1)}(x_i))\)的负梯度方向,设\(L(y_i, \hat{f}^{(m-1)}(x_i))\)的负梯度为\(-\hat{g}_m(x_i)\),那么让新加入的弱学习器直接去拟合\(-\hat{g}_m\)即可,于是可得到基学习器的学习公式为
\[\hat{\phi}_m = \arg\min_{\phi\in\Phi}\dfrac{1}{2}\sum_{i=1}^n[-\hat{g}_m-\phi(x_i)]^2
\]
然后使用线性搜,得到
\[\hat{\rho}_m = \arg\min_\rho \sum_{i=1}^nL(y_i, \hat{f}_m^{(m-1)}(x_i)+\rho\hat{\phi}_m(x_i))
\]
最终得到
\[\hat{f}^{m}(x) = \eta\hat{\rho}_m\hat{\phi}_m(x) + \hat{f}^{(m-1)}(x)
\]
下面介绍下如何优化损失函数得到\(\hat{\phi}_m(x)\)
\[\begin{split}
J_m(\theta_m) &= \dfrac{1}{2}\sum_{i=1}^n[-\hat{g}_m-\phi_m(x_i)]^2\\
&= \dfrac{1}{2}\sum_{i=1}^n\hat{g}_m^2(x_i) + \phi_m^2(x_i) + 2\hat{g}_m(x_i)\phi_m(x_i)\\
&= \dfrac{1}{2}\sum_{i=1}^n\sum_{j=1}^Tw_{jm}^2I(x_i\in R_{jm}) + 2\hat{g}_m(x_i)w_{jm}I(x_i\in R_{jm}) + constant\\
&= \dfrac{1}{2}\sum_{j=1}^T\sum_{i\in I_{jm}}w_{jm}^2 + 2\hat{g}_m(x_i)w_{jm} + constant\\
&= \sum_{j=1}^T\dfrac{1}{2}n_{jm}w_{jm}^2+G_{jm}w_{jm} + constant
\end{split}
\]
其中\(n_{jm}\)为第\(j\)个节点的样本数量。对\(w_{jm}\)进行求导并使得导函数为0,解得
\[\hat{w}_{jm} = -\dfrac{G_{jm}}{n_{jm}}
\]
回代得到
\[\hat{J}_m(\hat{\theta}) = -\dfrac{1}{2}\sum_{j=1}^T\dfrac{G_{jm}^2}{n_{jm}}
\]
那么有分裂时的信息增益为
\[Gain = \dfrac{1}{2}\left[\dfrac{G_L^2}{n_L} + \dfrac{G_R^2}{n_R} - \dfrac{G_{jm}^2}{n_{jm}}\right]
\]
XGBoost
XGBoost与GBDT根本不同在于XGBoost使用了损失函数的泰勒二阶展开。同上,我们有
\[J_m(\theta_m) = \sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i) + \phi_m(x_i))
\]
对其进行泰勒二阶展开,于是有
\[J_m(\theta_m) = \sum_{i=1}^nL(y_i, \hat{f}^{(m-1)}(x_i)) + \hat{g}_m(x_i)\phi_m(x_i) + \dfrac{1}{2}\hat{h}_m(x_i)\phi_m(x_i)^2
\]
其中
\[\begin{split}
\hat{g}_m(x_i) &= \left[\dfrac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=\hat{f}^{(m-1)}(x)}\\
\hat{h}_m(x_i) &= \left[\dfrac{\partial^2 L(y_i,f(x_i))}{\partial f(x_i)^2}\right]_{f(x)=\hat{f}^{(m-1)}(x)}\\
\end{split}
\]
于是有
\[\begin{split}
J_m(\theta_m) &= \sum_{i=1}^n\left[\hat{g}_m\phi_m(x_i) + \dfrac{1}{2}\hat{h}_m(x_i)\phi_m(x_i)^2\right] + constant\\
&= \sum_{i=1}^n\left[\hat{g}_m(x_i)\sum_{j=1}^Tw_{jm}I(x_i\in R_{jm}) + \dfrac{1}{2}\hat{h}_m(x_i)\sum_{j=1}^Tw_{jm}^2I(x_i\in R_{jm})\right] + constant\\
&= \sum_{j=1}^T\sum_{i\in I_{jm}}[\hat{g}_m(x_i)w_{jm} + \dfrac{1}{2}\hat{h}_m(x_i)w_{jm}^2] + constant\\
&= \sum_{j=1}^T[G_{jm}w_{jm} + \dfrac{1}{2}H_{jm}w_{jm}^2] + constant
\end{split}
\]
上式对\(w_{jm}\)求导,使其等于0,得到
\[\hat{w}_{jm} = -\dfrac{G_{jm}}{H_{jm}}
\]
回代得到
\[\hat{J}_m(\hat{\theta}) = -\dfrac{1}{2}\sum_{j=1}^T\dfrac{G_{jm}^2}{H_{jm}}
\]
那么有分裂时的信息增益为
\[Gain = \dfrac{1}{2}\left[\dfrac{G_L^2}{H_L} + \dfrac{G_R^2}{H_R} - \dfrac{G_{jm}^2}{H_{jm}}\right]
\]
上面的操作可以得到
\[\hat{f}^{(m)}(x) = \hat{f}^{(m-1)}(x) + \eta\sum_{j=1}^T\hat{w}_{jm}I(x\in R_{jm})
\]