前向分布算法、Adaboost算法、提升树算法、梯度提升算法、GBDT(梯度提升决策树)和XGBoost(极限梯度提升)

目标:好好捋一捋跟提升有关的算法,总结实属不易,望点赞或关注,谢谢。

一、前向分布算法

首先必须了解前向分布算法,因为这个算法将提升思想变得更容易实现,它只需求出每一次迭代时的最优弱模型的参数和系数即可,不用一次性求出所有的弱模型。
下面是我的另一篇博客,里面讲解了前向分布算法的思想和实现。
https://blog.csdn.net/watermelon12138/article/details/90370257

二、Adaboost算法

前向分布算法中并没有要求损失函数必须取哪一种(平方损失、指数损失等等),也没有要求基函数(就是弱模型)应该取哪一种(线性回归、svm、决策树等等),所以说前向分布算法更像是一个框架,需要你自己添加血和肉。Adaboost算法就是这样来的,如果将前向分布算法中的损失函数取 指数损失函数,那么前向分布算法就等价于Adaboost算法。
具体的分析和讲解,请看我的另一篇博客:
https://blog.csdn.net/watermelon12138/article/details/90370257

三、提升树算法

如果前向分布算法中的基函数取决策树(一般默认使用CART树,因为它即可做回归也可以做分类),那么该前向分布算法就可以称为提升树算法。针对不同的损失函数和树的类型,提升树有不同的用途,对于前向分布算法来说,当损失函数取指数损失,基函数取二叉分类树,前向分布算法就变成了用于分类的提升树算法; 当损失函数取平方损失,基函数取二叉回归树,前向分布算法就变成了用于回归的提升树算法;

3.1用于分类的提升树算法
这里我就不再啰嗦了,就是将Adaboost算法中的基函数取二叉分类树,算法具体流程和Adaboost一样。

3.2用于回归的提升树算法
前向分步算法中的基函数采用二叉回归树,损失函数采用平方损失,就得到了解决回归问题的提升树。

分析:
假设现在是前向分布算法的第 m 次 迭代,当前模型为 fm-1(x),此时的弱模型未知,我们记为T(x;θ),第m次迭代的目标是找到使得损失函数 L(yi, fm-1(xi) + T(xi;θ))取最小值的 T*(x;θ),然后更新当前模型 fm(x) = fm-1(x) + T*(x;θ)。
因为损失函数采用的是平方损失,所以有:
L(yi, fm-1(xi) + T(xi;θ)) = (yi - fm-1(xi) -T(xi;θ))2 = ( r - T(xi;θ))2
其中 r = yi - fm-1(xi) ,这是当前模型拟合数据的残差。从上面的表达式可以看出弱模型T(xi;θ)的预测值越是接近 r ,损失L的值就越小,所以说每一次迭代过程的弱模型 T(xi;θ) 只需拟合当前模型的残差就可以了,但这只限于损失函数取平方损失的时候。

算法:
在这里插入图片描述
在这里插入图片描述
3.3关于拟合残差,举个简单的栗子

举个栗子:
A、B、C、D四个人的真实年龄分别为14、16、24、26,现在利用提升算法对这四个人的年龄做预测。

第一轮:
初始模型F0(x)取值为常数,这个常数为样本的均值时目标函数能取最小值。
所以F0(x) = 20,即A、B、C、D的预测年龄为20、20、20 、20。
所以得到每个人的年龄预测残差为 -6、-4、4、6,然后用残差数据去拟合一个基函数f1(x),我们就可以得到一个新的模型F1(x) = F0(x) + f1(x),其中这个基函数 f1(x) 对于残差数据的预测值为 -5、-4、3、6。

第二轮:
模型 F1(x) 的预测值为15(20-5)、16(20-4)、23(20+3)、26(20+6),
所以得到每个人的年龄预测残差为 -1、0、 1 、0,然后用残差数据去拟合一个基函数f2(x),我们就可以得到一个新的模型F2(x) = F0(x) + f1(x) + f2(x) ,其中这个基函数 f2(x) 对于残差数据的预测值为 -1、0、1、0。
此时,F2(x)已经可以完全预测准确了,它的预测结果是 14(20-5-1)、16(20-4-0)、24(20+3+1)、26(20+6+0)。

四、梯度提升算法

4.1梯度提升的思想
当前向分布算法中的损失函数取平方损失或者指数损失,我们都有比好的优化方法,其中指数损失我们可以采用Adaboost算法,平方损失我们采用拟合当前模型残差的方法,那如果损失函数是其它类型的函数呢?针对这个问题,freidman提出了梯度提升,其关键是用损失函数L( yi, fm-1(xi)) 对 当前模型 fm-1(xi) 的 负梯度值作为残差的近似值,所以可以将该负梯度值称为伪残差
可以这样来想,假设目前损失函数取平方损失函数,即
在这里插入图片描述
该平方损失函数L( yi, fm-1(xi)) 对 当前模型 fm-1(xi) 的 负梯度值为(少个负号哈,不要在意):
在这里插入图片描述
也就是说,损失函数取平方损失的时候,负梯度值就是当前模型的残差,所以当损失函数取其它函数的时候,我可以用负梯度值作为当前模型残差的近似值。

4.2梯度提升的算法
在这里插入图片描述

五、GBDT(梯度提升决策树)

GBDT既可以用来处理回归问题,也可以用来处理分类问题,当梯度提升算法的基函数取二叉回归树,该梯度提升算法就可以称之为GBDT,注意不管GBDT是做回归还是做分类,它的基函数一直都是二叉回归树(默认采用CART回归树)。

CART回归树的形式如下:
在这里插入图片描述
CART的生成过程我就不讲了,自行百度。

GBDT算法如下:
在这里插入图片描述
如上所述,GBDT之所以分类和回归都取二叉回归树,大概是因为二叉回归树叶子结点的权值比较好求出来吧(上述算法流程的倒数第二步),只要叶子节点的权值求出来,该二叉回归树(误差率最小)就算是求出来了。
GBDT做分类:
这个不是本博文的重点,有兴趣的同学请看下面这个博客。
https://www.cnblogs.com/ModifyRong/p/7744987.html

六、XGBoost(极限提升)

下面这个博客对于xgboost有更为通俗的解释:
https://blog.csdn.net/github_38414650/article/details/76061893
https://baijiahao.baidu.com/s?id=1620689507114988717&wfr=spider&for=pc

XGBoost简介:
在这里插入图片描述
XGBoost的目标函数推导:

1、如果XGBoost模型总共学习了K棵树,那目标函数可以如下表示:

在这里插入图片描述
其中L(yi, yi^)表示最终模型的预测误差,fk表示第 k 棵树,Ω(fk)表示第 k 棵树的复杂度,所以Ω函数就是目标表达式的正则项。我们要求出使得目标函数 J 取最小值的XGBoost模型,因为它是最优的。
困难:有点像提升算法遇到的难题,我们如何直接求出 K 棵树呢?这基本上是不可能的,这时就可以采用前向分布算法中的思想,我们不直接求出 K 棵树,我们让它迭代,每次迭代只求出一棵树,然后把它们相加起来,就是贪心算法啦。

2、fk(xi)的解释
我们知道 fk 表示第 k 棵树,那 fk(xi) 就是第 k 棵树对 xi 的预测值,回归树的预测值最终等于某个叶子节点上的权值,所以 fk(x) 就等于 x 所在叶子节点的权值,即 fk(x) = wq(x),如果 fk 有 T 个叶子节点,那 q(x)的取值范围就是1, 2 , … , T,它表示 x 位于哪个叶子节点上。
举个栗子:
在这里插入图片描述
3、树的复杂度 Ω 怎么衡量
在这里插入图片描述
其中 T 为该树的叶子节点个数,wj为每个叶子节点的权值,可见 XGBoost 要求生成的回归树叶子节点不能过多,而且叶子节点权值不能过大,这样XGBoost 的泛化能力就更强,防止过拟合。关于叶子节点权值不了解的可以去看看回归树,因为回归树的每个叶子都会被贴上一个标签,这个标签是一个数值(一般来讲就是该叶子的均值),把这个标签称为权值。

4、XGBoost模型在第 t 次迭代时的目标函数
由1式中的公式直接推出:
在这里插入图片描述
因为前 t-1 棵树是已知的,所以它的复杂度之和也是已知的,所以我们把它看做常数C放到式子最后,得:
在这里插入图片描述
XGBoost和GBDT一样,它考虑的不是损失函数仅仅取平方损失之类的,它考虑的是普遍情况,就是你选择任意的损失函数XGBoos都可以优化,它做了一个非常巧妙的变化,就是泰勒展开:
在这里插入图片描述
因为yi是已知的,所以下面的式子成立:
在这里插入图片描述
然后上式就可以看作是L(x+△x),其中 x 是yi^(t-1),△x是ft(xi),根据泰勒公式求出一阶导和二阶导如下:
在这里插入图片描述
所以得到泰勒展开式为:
在这里插入图片描述
所以目标函数的近似值为:
在这里插入图片描述
继续化简上式吧:
在这里插入图片描述
第二步解释:因为L(yi,yi^(t-1))是常数,那就把它和常数C归并到一起,然后忽略掉。
第四步解释:因为第三步是对每个xi(1=< i <=n)来计算,遍历所有的样本。因为每个 xi 最终都会落入到一个叶子节点中,所以可以先对每个叶子节点(1=< j <= T)来计算,再对每个叶子节点中的xi (j中的xi) 来计算,这也可以遍历完所有的样本,所以第三步和第四步是等价的。

继续化简得:
在这里插入图片描述
J( ft )对 wj 求导并令导数等于零:
在这里插入图片描述
在这里插入图片描述
上式称为打分函数(scoring function),它是衡量树结构好坏的标准,值越小,代表这样的结构越好 。目前我们只得到了打分函数,它可以衡量树结构的好与坏,但是这棵树应该怎么来构建呢?请看下一小节。

XGBoost 如何构建第 t 棵回归树

首先将所有的训练样本放到一个叶子节点中,计算J1(ft),此时T=1:
在这里插入图片描述
然后遍历所有特征,遍历每个特征所有可行的分割点,将该叶子节点划分成 两个叶子节点,计算 J2(ft),此时T=2:
在这里插入图片描述
如果 J1(ft) - J2(ft) 大于零,我们就说该划分是可行的,因为它使目标函数变小了呀,我们把 J1(ft) - J2(ft) 叫做 增益 用 Gain 表示如下:
在这里插入图片描述
所以最佳的划分点就是就是使得 Gain 最大的划分点,枚举所有的特征及其划分点,找到它就完事了。
对于划分后的 左子节点 和 右子节点 ,重复上述步骤。

总结:

  • XGBoost即可以做分类,也可以做回归

  • XGBoost的每一次迭代时的建树过程

    XGBoost将所有样本数据当做第一个叶子结点,计算这个叶子节点的权值(可以求均 值),然后通过上面的过程选择最佳分割特征将这个叶子结点划分。对于划分得到的2个叶子节点,分别计算其权值(用wj的公式),然后通过同样的方式选择划分特征,达到约束条件就停止划分(比如给定树的最大深度),于是就得到了一棵回归树。

  • XGBoost和GBDT的区别

    • XGBoost目标函数添加了惩罚项,防止过拟合。
    • XGBoost用到了误差函数L的二阶导。
    • XGBoost建树过程中同层的叶子结点在计算G和H时可以并行计算。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章