机器学习-XGBoost

        XGBoost 是一种 Boosting 方法,而 Boosting 方法又是集成学习的一个分支,先简单介绍下Boosting的概念。

        Boosting 是一个机器学习技术,可以用于回归和分类问题,它每一步产生一个弱预测模型(准确了率不高),并加权累积到总模型中。采用集成学习方法,其主要思想是将弱分类器组装成一个强分类器。在 PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。

                        图一    Boosting方法示意图

  1. GBDT,Gradient Boosting Decision Trees)

        如果每一步的弱预测模型生成都是移库函数损失的梯度方向,则称之为梯度提升(Gradient Boosting)。梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的弱函数集合(基函数)。提升算法通过迭代选择一个负梯度方向上的基函数来逐渐逼近局部极小值。对分类问题,决策树是二叉分类树,对回归问题决策树是二叉回归树。提升树模型可以表示为决策树的加法模型:

                          \hat y_i&=f_K(x)=\sum_{k=1}^KT(x;\theta_k)=\sum_{k=1}^Kf_k(x;\theta_k)\sum_{k=1}^KT(x;\theta_k)

其中 f_k \in FF 为包含所有回归树的函数空间。因此,我们可以这样认为:回归树是一个将实例的特征向量映射为一个分值的函数。通过经验风险极小化确定下一刻决策树参数\Theta

                                          

梯度提升使用损失函数的负梯度作为回归问题提升树算法中的残差近似值,拟合一个回归树:

                                                            

提升树算法步骤:

      2.  XGBoost 原理详解

       XGBoost 是对GBDT的改进,传统 GBDT 算法的目标函数只有损失函数这一项,而 XGBoost 在此基础上进行了改进,增加了正则项以防止模型过度复杂:

                              Obj=\sum_{i=1}^nl(y_i,\hat y_i) + \sum_{k=1}^K\Omega(f_k) \\&=\sum_{i=1}^nl\bigl(y_i,\hat y_i^{(t-1)}+f_t(x_i)\bigl)+\Omega(f_t) + const ,\quad f_k \in \mathcal F

如果对上式子对\hat y_i^{(t-1)进行二阶泰勒展开:

                                 &g_i=\partial_{\hat y_i^{(t-1)}}l(y_i,\hat y_i^{(t-1)})\\ &h_i=\partial^2_{\hat y_i^{(t-1)}}l(y_i,\hat y_i^{(t-1)})

因此可以得出有:

                       \begin{align} Obj^{(t)} &= \sum_{i=1}^nl\bigl(y_i,\hat y_i^{(t-1)}+f_t(x_i)\bigl)+\Omega(f_t) + const \\&\approx \sum_{i=1}^n\Bigl[l(y_i,\hat y_i^{(t-1)}) +g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)\Bigl]+\Omega(f_t)+const \end{align}

                         

而上式中的正则项\Omega(f_t)的形式为:

                     \Omega(f_t)=\frac{1}{2}\lambda\sum_{j=1}^Tw^2_j+\gamma *T

   

因此Obj可以表示为:

             \begin{align}Obj^{(t)}&\approx\sum_{i=1}^n\Bigl[ g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)\Bigl]+\Omega(f_t)+const\\&=\sum_{i=1}^n\Bigl[g_iw_{q(x_i)}+\frac{1}{2}h_iw^2_{q(x_i)}\Bigl]+\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw^2_j\\&=\sum_{j=1}^T\Bigl[ \bigl(\sum_{i \in j}g_i\bigl)w_i+\frac{1}{2}\bigl(\sum_{i \in I_j}h_i+\lambda\bigl)w^2_j\Bigl]+\gamma T\end{align}

如果对叶子节点做如下定义:

           G_j=\sum_{i \in I_j}g_i  ,  H_j=\sum_{i \in I_j}h_i

则有:

      \begin{align}Obj^{(t)}&=\sum_{j=1}^T\Bigl[\bigl(\sum_{i \in j}g_i\bigl)w_j+\frac{1}{2}\bigl(\sum_{i \in I_j}h_i+\lambda\bigl)w^2_j\Bigl]+\gamma T\\&=\sum_{j=1}^T\Bigl[G_j w_j+\frac{1}{2}\bigl( H_j+\lambda \bigl)w^2_j\Bigl]+\gamma T\end{align}

对于一元二次函数,有如下两条结论:

         \begin{align} & \arg\min_x Gx+\frac{1}{2}Hx^2=-\frac{G}{H},H>0 \\& \min_x Gx+\frac{1}{2}Hx^2=-\frac{1}{2}\frac{G^2}{H} \end{align}

因此对于目标函数进行最小化,当w_j=-\frac{G_j}{H_j+\lambda}时我们得到:

            \begin{align} \min Obj^{(t)} &= \sum_{j=1}^T\Bigl[ G_j w_j+\frac{1}{2} \bigl( H_j+\lambda \bigl)w^2_j \Bigl]+\gamma T \\&=-\frac{1}{2}\sum_{j=1}^T \frac{G_j^2}{H_j+\lambda}+\gamma T \end{align}

刚才所有的过程如下:

于一个叶子节点,如何进行分裂我们需要遵循的原则是分裂后的两颗子树的最优目标函数值之和要小于未分裂之前的父节点,为了叙述方便我们定义如下的目标函数值的 “增益” :

 Gain=\frac{1}{2}\Bigl[ \frac{G^2_L}{H_L+\lambda}+\frac{G^2_R}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}-\gamma \Bigl]

关于XGBoost的代码实例:

http://xgboost.readthedocs.io/en/latest/build.html

https://github.com/dmlc/xgboost/tree/master/demo/guide-python

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值