首页天道酬勤gbdt和adaboost区别,xgboost与gbdt区别

gbdt和adaboost区别,xgboost与gbdt区别

admin 08-19 20:18 377次浏览

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

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损失函数的定义

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

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

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

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

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

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

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

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

展开可以得到:

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

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

3、节点的分割

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

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

 

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

 

上述是简单对 XGBoost的理解

下面对 paper 中的部分内容进行讲解:

1、节点分割点的查找:

上述提到的节点分割只是分割的评判公式,但是具体怎么选取分割点,常见的作法也就是大家所知道的作法就是直接遍历每一个分割点,然后计算上述的公式,找到score最大的分割点,然后在该分割点上进行分割,实际问题是数据量往往很大,全部的计算需要很大的时间和内存空间。所以文章中就提到了一种近似的切分点查找的方法:该方法使用 buckets (桶)的思想,也就是将数据分成 N 个桶里面,然后找到这N 个桶的分割点就行了(其中用到了直方图的思想,同lightGBM)。具体的作法为:先计算每个样本在某个特征上的二阶导数,然后组成(x,h)这样的样本对,定义下述的公式:

这里的参数  在[0,1] 之间,可以人为进行设定,比如我想分成 10个桶,那就定义该值为1/10 = 0.1,所以这样的话我们就可以找到 10个Sk的边界了,这些边界就是桶的边界,然后根据这些桶的边界确定具体的切分点,就可以近似的等于遍历得到的切分点。(关于文章中提到的权重问题,暂时还未十分明了该过程,后续完善)

参考:[论文阅读-XGBoost: A Scalable Tree Boosting System](https://blog.csdn.net/u014411730/article/details/78796890)

2、缺失值的处理

XGBoost对缺失值的处理为:(1)节点的分割:节点分割时需要计算最佳分割点,此时该特征确实的样本不参加计算,也就是不影响计算值(传统的分割会在最后计算(除去缺失样本)得到的值中乘以一个权重)(2)节点分割完毕后,缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。

参考: [决策树、RF、xgboost如何处理缺失值?判断特征重要性?缺失值不敏感? ](https://blog.csdn.net/qq_19446965/article/details/81637199)

可以看paper中计算过程:

 

 

参考文献:

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

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

 

云游戏 UGame签名工具 对象存储 US3【JavaSE】之面向对象编程C++  线程(串行并行同步异步)详解Go语言中怎么使用RedisJavaweb的知识点有哪些CSS中div滚动条样式如何设置系统配置/审计日志备份 堡垒机 UAuditHost
AdaBoost算法,adaboost算法优点 阿里云反向代理服务器,搭建反向代理服务器
相关内容