GBDT与XGBoost分析对比

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30024069/article/details/89243726

       以前总是认为GBDT算法很简单,第t颗树的构建需要拟合前t-1决策树的残差,但是要问我为什么要拟合残差,脑子就一片空白的。这种情况根本不算理解了GBDT,这种了解很肤浅。下面详细分析GBDT算法。

1.GBDT     

  GBDT是boosting算法种的一员,采用加法模型和前向分布算法。其基本思想是第t颗树的构建依赖前t-1颗树。在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x)ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x)ht(x),让本轮的损失函数L(y,ft(x)=L(y,ft−1(x)+ht(x))L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。这颗树需要拟合损失。

        我们介绍了GBDT的基本思路,但是没有解决损失函数拟合方法的问题。针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为

                                                             r_{ti}=-\left [ \frac{\partial L(y,f(x))}{\partial f(x)} \right ]_{f(x)=f_{t-1}(x)}

       如果损失函数为MSE,那么负梯度就等于残差。利用(xi,rti)(i=1,2,..m)(xi,rti)(i=1,2,..m),我们可以拟合一颗CART回归树,得到了第t颗回归树,其对应的叶节点区域Rtj,j=1,2,...,JRtj,j=1,2,...,J。其中J为叶子节点的个数。

        针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值ctjctj如下:

c_{tj}=argmin_c \sum_{x\in R_{tj}}L(y,f_{t-1}(x)+c)

这样我们就得到了本轮的决策树拟合函数如下:

                                                                  h_t(x)=\sum^J_{j=1}c_{tj}I(x\in R_{tj})

       从而本轮最终得到的强学习器的表达式如下:

                                                                      f_t(x)=f_{t-1}(x)+h_t(x)

        通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。

2.XGBoost

Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。下面来自XGBoost官网介绍。https://xgboost.readthedocs.io/en/latest/tutorials/model.html

目标函数如下(总是包含训练损失和正则化):

学习过程中,固定我们已经学到的树,每次添加一颗新的树,那么第t个树的预测值为:

第t颗树的目标对象:

一般化情况,我们采用泰勒二项展开:

去掉一些常量,第t颗树的目标函数成:

                                                                    

树f(x)定义为:

                                              

其中w为叶子上的得分,q是一个映射函数,把数据映射到叶子上,T为叶子数目。XGBoost中定义复杂度为:

                                                         

综上所诉:

                          

                            

                                                   

计算出wj是树中叶子节点的值。采用下式学习到树的结构:

3.GDBT与XGBoost区别:

        a.XGBoost是GDBT算法上进行了优化

        b.GBDT采用CART基分类器,XGBoost采用支持CART,线性分类器

       c.GBDT只采用损失函数的一阶导数信息,而GBDT采用泰勒二阶展开,利用一阶导数信息和二阶导数信息

       d.XGBoost显示加入了正则项来控制模型复杂度,有利于防止过拟合,从而提高模型泛化能力。

猜你喜欢

转载自blog.csdn.net/qq_30024069/article/details/89243726