机器学习相关知识整理系列之三:Boosting算法原理,GBDT&XGBoost
1. Boosting算法基本思路
提升方法思路:对于一个复杂的问题,将多个专家的判断进行适当的综合所得出的判断,要比任何一个专家单独判断好。每一步产生一个弱预测模型(如决策树),并加权累加到总模型中,可以用于回归和分类问题;如果每一步的弱预测模型生成都是依据损失函数的梯度方向,则称之为梯度提升(Gradient boosting)。
梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的弱函数集合(基函数);提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部极小值。这种在函数域的梯度提升观点对机器学习的很多领域有深刻影响。
提升的理论意义:如果一个问题存在弱分类器,则可以通过提升的办法得到强分类器。
2. Boosting算法推导
给定输入向量\(X\)和输出变量\(Y\)组成的若干训练样本,\((x_1,y_1),(x_2,y_2),...,(x_n,y_n)\),目标是找到近似函数\(\hat F(\vec x)\),使得损失函数\(L(y,F(\vec x))\)的损失值最小。
\(L(y,F(\vec x))\)的典型定义为:$$L(y,F(\vec x)) = \frac{1}{2}(y-F(\vec x))^2$$
假定最优函数为\(F^*(\vec x)\),即:$$F^*(\vec x) = \arg\min_F E_{(x,y)}[L(y,F(\vec x))]$$
假定\(F(\vec x)\)是一族基函数\(f_i(\vec x)\)的加权和:
梯度提升方法寻找最优解\(F(\vec x)\),使得损失函数在训练集上的期望最小。
首先,给定常函数\(F_0(\vec x)\):
以贪心思路扩展得到\(F_m(\vec x)\):
贪心法每次选择最优基函数\(f\)时仍然困难,使用梯度下降的方法近似计算。将样本带入基函数\(f\)得到\(f(\vec x_1),f(\vec x_2),...,f(\vec x_n)\),从而\(L\)退化为向量\(L(y_1,f(\vec x_1)),L(y_2,f(\vec x_2)),...,L(y_n,f(\vec x_n))\)
上式中的权值\(\gamma\)为梯度下降的步长,使用线性搜索求最优步长:
步骤如下:
(1)初始给定模型为常数\(F_0(\vec x)\),对于\(m=1\)到\(M\):
(2)计算伪残差:$$\gamma_{im} = \left[\frac{\partial L(y_i,F(\vec x_i))}{\partial F(\vec x_i)}\right]{F(\vec x) = F(\vec x)},i=1,2,...,n$$
(3)使用数据\(\left\{ (\vec x_i,\gamma_{im})\right\}^n_{i=1}\)计算拟合残差的基函数\(f_m(x)\)
(4)计算步长$$\gamma_m = \arg\min_\gamma \sum_{i=1}^{n}L(y_i,F_{m-1}(\vec x_i) - \gamma\cdot f_m(\vec x_i)))$$
(5)更新模型$$F_m(\vec x) = F_{m-1}(\vec x) - \gamma_m f_m(\vec x_i)$$
3. GBDT算法推导
梯度提升的典型基函数即决策树(尤其是CART),在第\(m\)步的梯度提升是根据伪残差数据计算决策树\(T_m(x)\)。令树\(T_m(x)\)的叶结点数目为\(J\),即树\(T_m(x)\)将输入空间划分为\(J\)个不相交区域\(R_{1m},R_{2m},...,R_{Jm}\),并且决策树\(T_m(x)\)可以在每个区域中给出某个类型的确定性预测。使用指示标记\(I(x)\),对于输入\(x\),\(T_m(x)\)为:
进一步,对树的每个区域分别计算步长,从而系数\(b_{jm}\)合并到步长,从而:
当采用平方误差损失函数时,\(L(y,f(\vec x)) = (y-f(\vec x))^2\),其损失变为:
这里,\(r = y- f_m(\vec x)\)。所以,对回归问题的提升树算法来说,只需要简单的拟合当前模型的残差。
4. XGBoost算法推导
目标函数:
根据Taylor展开式:\(f(x+ \Delta x) \approx f(x) + f^\prime(x) \Delta x + \frac{1}{2}f^{\prime\prime}(x)\Delta x^2\),令$$g_i= \frac{\partial L(y_i,\hat y_i^{(t-1)})}{\partial \hat y_i^{(t-1)}}, h_i = \frac{\partial^2 L(y_i,\hat y_i^{(t-1)})}{\partial \hat y_i^{(t-1)}}$$
则:$$J(f_t) \approx \sum_{i=1}^n \left[L(y_i, \hat y_i^{(t-1)}) + g_if_t(x_i) + \frac{1}{2}h_if_i^2(x_i)\right] + \Omega(f_t) + C$$
假定某决策树的叶结点数目为\(T\),每个叶结点的权值为\(\vec w = (w_1,w_2...w_T)\)。决策树的学习过程,就是构造如何使用特征得到划分,从而得到这些权值的过程。样本\(x\)落在叶结点\(q\)中,定义\(f\)为:\(f_t(x) = w_{q(x)}\)。
正则项,决策树的复杂度可考虑叶结点树和叶权值:\(\Omega(f_t) = \gamma^ {T_t} + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2\),其中\(T_t\)为叶结点数,\(w_j\)为\(j\)叶子结点权重。
目标函数计算:$$J(f_t) \approx \sum_{i=1}^n \left[L(y_i, \hat y_i^{(t-1)}) + g_if_t(x_i) + \frac{1}{2}h_if_i^2(x_i)\right] + \Omega(f_t) + C$$
定义:$$G_j = \sum_{i \in I_j}g_i, H_j = \sum_{i \in I_j}h_i$$
从而,$$J(f_t) =\sum_{j=1}^{T_t} \left[G_jw_j + \frac{1}{2}(H_i + \lambda)w_j^2\right] +\gamma^ {T_t} + C$$
对\(w\)求偏导,得:$$\frac{\partial J(f_t)}{\partial w_j} = G_j + (H_j + \lambda) w_j$$令偏导等于0,得到:$$w_j = - \frac {G_j}{H_j + \lambda}$$
代回目标函数,得$$J(f_t) = -\frac{1}{2} \sum_{j=1}{T_t}\frac{G_j2}{H_j+\lambda} + \gamma^{T_t}$$
构造决策树的结构:
- 对于某可行划分,计算划分后的\(J(f)\);
- 对于所有可行划分,选择\(J(f)\)降低最小的分割点。
5. AdaBoost算法推导
假设给定一个二类分类的训练数据集\(T = {(x_1,y_1),(x_2,y_2),...(x_n,y_n)}\) 。
初始化训练数据集的权值分布\(D_1 = (w_{11},w_{12},...,w_{1i},...,w_{1N}) ,w_{1i} = \frac{1}{N}, i=1,2,...,N\)
对于\(m=1,2,...,M\):
(1)使用具有权值分布\(D_m\)的训练数据集学习,得到基本分类器:\(G_m(x): \chi \to \{-1,1\}\)
(2)计算\(G_m(x)\)在训练数据集上的分类误差率:\(e_m = P(G_m(x) \ne y_i) = \sum_{i=1}^N w_{mi}I(G_m(x) \ne y_i)\)
(3)计算\(G_m(x)\)的系数:\(\alpha_m = \frac{1}{2}\log\frac{1-e_m}{e_m}\),底取自然对数。
(4)更新训练数据集的权值分布:$$D_{m+1} = (w_{m+1,1},w_{m+1,2},...,w_{m+1,i},...,w_{m+1,N})$$
说明:计算基本分类器的\(G_{m}{(x)}\)的系数\(\alpha_m\),\(\alpha_m\)表示\(G_{m}{(x)}\)在最终分类器中的重要性。当\(e_m \leq \frac{1}{2}\)时,\(\alpha_m \geq 0\)。并且\(\alpha_m\)随着\(e_m\)的减小而增大,所以分类误差率越小的基本分类器在最终分类器中的作用越大。所有的\(\alpha_m\)之和并不为1。.