Adaboost、GBDT、XGBoost的对比理解

本篇文章重点不在于对三者的解析,主要是作者的一些理解,希望其中的某一点能帮助你更好的理解算法。

1.Adaboost 模型

    首先是Adaboost,它的基本思想是提高前一轮弱分类错误分类样本的权重,降低正确分类样本的权重,因此,在后面的训练中,接下来的分类器就更加“关注”那些分错的样本点,这样,多个弱分类器组合起来就是Adaboost,这是简单的Adaboost的理解,当然也可以从一个我们更加熟悉的角度去理解,那就是前向分步算法,所谓的前向分布算法可以理解为后来的弱分类器在不断的学习上一个分类器的输出的结果和真实label之间的残差。在二分类学习中,我们可以认为Adaboost模型就是加法模型、损失函数为指数函数(损失函数为指数函数这一定理是由推导而来的,而不是定义,后面在GBDT还会涉及到,此外注意这里我说的是二分类问题)、学习算法为前向分布算法;在回归学习中,Adaboost模型就是加法模型、损失函数为平方损失函数、学习算法为前向分布算法。

2.GBDT 模型

    GBDT(gradient boosting desicion tree)是由boosting tree 演变过来的,而boosting tree可以认为是Adaboost的一般方法,也就是说二分类问题的Adaboost模型是损失函数为指数损失函数的boosting tree模型,回归问题的Adaboost模型是损失函数为平方损失函数的boosting tree模型。

    GBDT的关键点就是利用损失函数的负梯度去模拟(代替)残差,这样对于一般的损失函数,只要其一阶可导就行。这里用到了损失函数的一阶导数来得到残差也就是接下来的tree要去拟合的值(记住这里是一阶导数)。

3.XGBoost 模型

    XGBoost是华盛顿大学陈天奇博士提出来的一个算法,最初在kaggle数据比赛上大放异彩,后来因为其实在是太便捷好用了,所以你懂的,都在用。下面就介绍下其中难以理解的部分。

    (1)、首先是XGBoost损失函数的定义

Adaboost、GBDT、XGBoost的对比理解_第1张图片

         主要分为两部分,第一部分类似GBDT 的损失函数,第二部分为树的参数,用来衡量树的复杂度,可以分为 T为树的节点的个数、W为叶子节点的值,因此可以看作加入了正则化项,减少了过拟合。

(2)、XGBoost 的加法模型表达

    其中的加法模型主要体现在损失函数中,和GBDT中的一样。

(3)、XGBoost 的二阶导数问题

       先看下XGBoost 损失函数的二阶导数展开(XGBoost可以自定义损失函数,只要二阶可导便可)

 其中g为一阶导数,h为二阶导数

想过没有,为什么GBDT中用的一阶导数,而XGBoost就要用二阶导数,接下来我们就用对比的方法来理解这两种方式的不同。首先是GBDT的一阶导数主要用来计算残差,然后通过接下来的模型对残差进行学习。XGBoost的二阶导数可以从这里来看:

其中当我们需要拟合当前树(或其他基学习器)的时候,上式中的第一项就是一个常值constant,因此我们的损失函数可以写成:

展开可以得到:

Adaboost、GBDT、XGBoost的对比理解_第2张图片

其中当前模型f t(x)就是当前叶节点w的值,所以替代可以写成w, 很明显是一个二次函数的优化问题,相当于求ax^{2}+bx的极值,就是当x=\frac{-b}{2a}时,对应上式的二次结构,我们可以得到w的最优值(创新点,不同于GBDT的求法):(当前节点的值)

那么在GBDT中当前节点的值是怎么求的呢?直接求平均值。具体的可以查阅参考文献2中的例子,或者小蓝书中的实例。

3、节点的分割

    你以为求的二阶导数到此就没用了么?错了,还有节点的分割也用到了,还看公式:

   为什么分割函数是这样的,而不是GBDT中的平方误差最小的点为分割点,我们看上式中的每一项的格式是不是看起来都很熟悉啊,是的,都和最优w的格式是一样的,因此上述可以表述为:分割后左子树的增益加上右子树的增益再减去分割前树的增益,最终选择增益最大(记住是最大,因为没有负号)的切分点为最优切分点,上式还可以认为加入了剪枝操作。

 

    未完,持续更新。。。。。

 

 

 

 

参考文献:

1、https://arxiv.org/pdf/1603.02754v1.pdf -论文pdf

2、https://www.cnblogs.com/ModifyRong/p/7744987.html  

 

你可能感兴趣的:(机器学习)