【三部曲01】从CART到GBDT

参考文献及引用来源:

1.GBDT入门教程之原理、所解决的问题、应用场景讲解
2.《统计学习方法》李航
3.GBDT的小结
4.决策树模型组合之随机森林与GBDT
5.机器学习系列–GBDT算法总结与源码分析
6.Friedman J H . Greedy Function Approximation: A Gradient Boosting Machine[J]. The Annals of Statistics, 2001, 29(5):1189-1232.
7.GBDT原理解析:为什么说GBDT是拟合残差的梯度下降算法
8.CART回归树算法过程
9.简单易学的机器学习算法——梯度提升决策树GBDT
10.机器学习算法GBDT的面试要点总结-上篇
11.GBDT和XGboost区别对比知乎回答
12.李宏毅-机器学习技法-GBDT视频


附:快速思路链接:
根据3张PPT来,目标是通过模型累加来拟合y,通过把这个目标函数进行一阶泰勒展开,可得出h的求取就是在拟合前面t-1轮的残差,具体怎么求h?那就回到了CART的训练上,x还是那个x,y此时更新为了残差y,h的求取过程就是回归树的建立过程,没什么复杂的!在求出h后,就可以接着得到 η ,这是很显然的,因为这就是单变量的二次函数了。


Question1. 首先明确,GBDT是做什么用的??

GBDT (Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。
(归纳:从大类分,GBDT就是一种回归算法;细化一下,GBDT是基于Boosting思想,利用CART回归决策树的算法;)


Question2. GBDT的整体结构是什么样的??

DT+GB+Shrinkage

GBDT主要由三个概念组成:
[1] Gradient Boosting(即GB),
[2] Regression Decision Tree(即DT),
[3] Shrinkage (算法的一个重要演进分枝,目前大部分源码都按该版本实现)。

在这里插入图片描述


Question3. GBDT在机器学习发展脉络中与哪些分支相关??

刚开始在这里迷糊好久,《统计学习方法》倒是看了几遍,但是注意力都在决策树处理分类问题上,完全忘了CART还有回归的用法。实际上无论分类问题还是回归问题,都是预测问题,无非是预测的是连续值还是离散值而已。。。

我们知道CART全名是Classification and Regression Tree。
GBDT里的DT,即decision tree,涉及的是决策树的内容,准确说是回归决策树部分。此外,从思想上来说,GBDT是Boosting思想下的产物(即这里的B),通过新的基学习器对残差的拟合,实现叠加后的模型能够不断靠近目标结果。


Question4. CART回归决策树(DT)是什么??简述一下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面是《统计学习方法》关于回归决策树建立的算法描述。(注意这是个二叉决策树!!

总结起来就是:

【1】首先对于输入的训练数据集,我们知道x是多维度的,不同维度代表不同的特征,那么现在问题就是选择哪个特征作为划分依据?更具体的,选择的这个特征依据哪个值来进行划分?算法的解决方法是:

外层遍历所有的特征,内层在外层特征固定的情况下,遍历不同的取值。

目标函数定义为MSE(最小平方误差),就是当特征j和值s都确定后,数据集可以划分为两个部分,那么这两个部分可以分别计算出y的均值c1和c2。式5.21就是来最小化这个均方误差,以此MSE的值来作为这一层j和s的确定依据。

【2】

第一步确定了划分所选特征以及特征值后,相应的划分后的两个部分,各部分的回归预测值就是属于该部分的样本的输出均值。

【3】重复上述步骤,逐层划分,直到满足停止条件,生成决策树。而后预测用法就是:对于输入的x,在经过回归决策树处理后,对应的输出为M个叶子结点(就是划分的M个区域)的和,其中Cm为所在区域的输出值的平均。(实际上不是和,而是一种定位。因为公式5.16里的I函数并不是在每个叶子结点都有值的,参考文献


Question5. 梯度提升(GB)是什么??

要想理解清楚GBDT,首先要明白Bagging和Boosting的区别与联系。Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类器组装成强分类器的方法。

Bagging即套袋法,其算法过程如下:
A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

在这里插入图片描述

关于Boosting的两个核心问题:
A)在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
B)通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

在这里插入图片描述

两者的区别所在:

总的来说,Bagging的训练样本在每次训练的时候,是通过抽样采取;而Boosting的核心是每次训练样本都是一样的,但是训练时候的训练样本的权重不一样。

关系总结:

1)Bagging + 决策树 = 随机森林

2)AdaBoost + 决策树 = 提升树

3)Gradient Boosting + 决策树 = GBDT

(通过这里的分析,又强调了一点:就是说GBDT是一种利用了Boosting思想的算法!)



插播介绍一下最速下降法(梯度下降法):

最速下降法是很常见的也是很熟悉的,首先可以计算损失函数对于参数P的倒数,由于P是多维向量(j):
因此对P的导数表示如下(也就是对各维度求导数):
在这里插入图片描述
求完导数后,相当于确定了负梯度方向;接下来,我们知道还要确定一下步长,才能进行更新。考虑到P的累加表示为:
在这里插入图片描述
下一阶段要累加的部分Pm为:
在这里插入图片描述
对于步长ρ的确定,采用 “线性搜索” 即可获得。之所以叫线性搜索,是因为线性搜索这个叫法来自:
在这里插入图片描述
当Pm-1,gm都已知后,对ρ的计算就相当于对ρ的线性函数。

ρ确定后,方向和步长都有了,我们就得到了P的更新方法,进而得到了模型F的表示。以上就是梯度下降方法的介绍。



Question6. GBDT具体步骤

GBDT算法是通过累进生成一系列的树,最终的结果是这一系列的树的累加和。

GBDT解决的是方程近似问题,这也是ML的根本问题,即预测。就是基于给定输入输出训练数据样本(x,y),得出方程表示输入输出关系y=F(x)的形式。

常规的做法就是最小化目标函数(一般是误差函数),通过最小化y和F(x)间的差值,以达到选取最合适的F的目标。对于模型F的选择,一种很简单的思想是采用“累加表示”的形式,就是一系列函数模型累加组合构成。 这种思想是神经网络、支持向量机、小波等热门技术的核心所在。

【阶段1:直观思维】

&& 前附:声明,训练样本数目为N,基学习器数目为m

模型求取到参数求取的转化思想:
一般来说,当我们需要求取一个具体模型时,模型的选择优化问题,是可以转化为参数优化问题的,这是很明显的,因为模型是由一组参数确定的嘛。
在这里插入图片描述
损失函数设定为:
在这里插入图片描述
我们通过最小化误差函数来学习得到这一组参数P*,这样也就得到了模型的具体表示形式:
在这里插入图片描述
我们说了,对于模型F的选择,一种很简单的思想是采用 “累加表示” 的形式,就是一组函数累加构成。那么相对应的,最终确定的这一组参数P*也是可以由一组P累加得到的:
在这里插入图片描述
其中p0是初始化值,pm是一系列连续的提升,可以认为是steps或boost,每一步都基于上一步。
那么现在模型确定的问题就变为了如何确定参数P的累加的问题。

好了,前面我们才介绍了梯度下降法,基于这一方法,可以进行参数的更新。现在我们将这一方法应用到函数空间。

什么叫应用到函数空间呢?

前面我们说了,有监督问题的模型求取可以转化为模型的参数求取,这一转换之所以可行,是因为我们将模型视为输入到目标输出的映射函数(即F函数),通过给定损失函数,则模型函数F是可以表示出来的。

现在我们从函数空间的角度看模型函数,我们可以将模型F(X)视为函数空间中的一个点,这个点的维度就是样本集中的样本数目(因为对每一个样本,模型都会有一个输出)

这样的话,在下面函数中,F(x)可以视为损失函数的参数:
在这里插入图片描述
我们知道,对于模型F,来一个输入x,就会有一个输出F(x)。那么如果把F(x)视为参数的话,那么这个参数应该是无限的,但是考虑到实际应用场景,无论是训练集还是测试集都是有限数据组成的集合,因此F(x)也是有限的。

在这种情况下,参数F(x)就相当于上面介绍的最速下降法里的P啊!!我们说P是可以基于累加思想表示的,那么同样的F也是可以通过累加思想表示的,所以有:
在这里插入图片描述
F0 是初始化值,fm 是一系列提升。

那么直接搬用前面梯度下降法的流程就有了:
在这里插入图片描述
在这里插入图片描述
到这里好像问题已经可以解决了, 但是,这是考虑数据集无穷时的情况。 我们知道,实际场景的训练集是有限的,这造成什么后果?看上面式(7),这个梯度值是基于期望得到的,而期望的求取是基于统计原理,有限的数据集是不能支撑这一求取的。

因此上面这一基于梯度下降的流程在实际场景是用不了的!!!


【阶段2:可行方法】

那么怎么改呢?为了还能使用梯度下降方法,我们需要借助邻近点来增强解的平滑性。具体实现这一思想的方式如下:
在这里插入图片描述

总结这一可行做法,就是:

上一阶段的函数空间的推导都是无参数化的,在有限数据中寻找(近似)最优解F需要对F进行参数化

例如:将F用h进行参数化后,问题变为求解参数,使得损失函数最小,如上面的公式所示:
在这里插入图片描述

用h进行F的参数化表示,本质上也就限定了F的表示形式,也就是说F不再是任意函数形式,而是被限制在了h的函数族内,这一点很重要!!!

类似于gradient decent,使用greedy-stagewise的方法确定每一步m的最优参数:
在这里插入图片描述
之后将h带入得到F:
在这里插入图片描述
注意将stagewise和stepwise区分,stepwise每一步都更改之前的参数值,而stagewise每一步新加一个fm,但是之前确定的Fm-1不变。

下面是理解的关键点!

求解F还是看做一个:在函数空间中,将F看成参数的梯度下降过程但是因为将F用h进行了参数化,所以F受到了限制,其每一步的更新必须在h的函数族内。 而我们在第m步求梯度时得到的梯度方向公式为:
在这里插入图片描述
这是一个不依赖于hm,仅依赖于损失函数L,Fm-1 和 N 个数据点(X,Y)的非参数化的式子。它表明了在每一步,基于已有数据的梯度方向。如果不考虑寻找最佳参数,沿着这个方向下降的损失函数较小最快。但现在参数化的h被限制了,而我们梯度下降时只能沿着hm下降,所以我们希望在hm尽可能地接近gm方向, 也就是hm尽可能让损失函数在m步最小化。 当我们用欧式距离度量 gm 和 hm 时,寻找 hm 最佳参数的问题就变成:
在这里插入图片描述
求得hm 的参数后,用这个被限制了函数形式的hm 代替 gm,进行梯度下降更新。对于步长,同样是在梯度下降更新时使用线搜索:
在这里插入图片描述
得到步长和梯度方向后,更新映射F:
在这里插入图片描述
(论文中的逻辑是:考虑到上面的求梯度的公式,算出的是只在给定数据集的N个点的梯度,这一梯度是不具有推广泛化能力的,因此一种可行的解决方法是使得选择的第m个模型h(x,am) 能够沿着该负梯度方向,所以才有了上面am的公式和ρm的公式。这种想法相当于提供了一种新的思考角度。)

注:在这里,因为gm是非参数化的,完全基于数据的最优梯度方向;计算hm和gm的欧氏距离,并寻找参数使得这一距离最小化,实际上就是用hm去拟合gm,因此可以把gm看成pseudo-response。对于任意可导的损失函数L,可以使用steepest-descent求最佳函数F。

引入决策树,看怎么具体更新

当参数化函数h是树时,假设它有J个叶子节点,则h可以写成:
在这里插入图片描述
这样(b,R)就组成了h的参数。其中b是叶子节点的回归值,R是将点x映射到叶子节点的路径。F变成:
在这里插入图片描述
R是到不同叶子节点的路径,在这里插入图片描述是pseudo-response,ρm 用线搜索得到。F写成:
在这里插入图片描述
其中在这里插入图片描述
由于hm 是树,所以一个hm 可以看成是J个相互隔离的方程,所以寻找最优的hm 就是寻找最优的,相互独立的方程:
在这里插入图片描述
原本的优化问题变成了:
在这里插入图片描述
所以问题就变成了根据Fm-1 和损失函数L,更新树的每个叶子节点的常数值,使得m步的损失最小。


我们总结一下算法:

1.梯度版本(上面就是按这种思想解释的)
在这里插入图片描述
再附说明一下:N为训练样本个数,m为基学习器数目(也就是这里的迭代次数,因为是m个基学习器叠加嘛)

梯度版本
把GBDT说成一个梯度迭代树,使用梯度下降法求解,认为每一棵回归树在学习前N-1棵树的梯度下降值。
本质上来说,这是一个宏观架构,后面的残差版本可以视为该版本的具体化。步骤3那里的称为计算响应,这是个和残差成正比的值。


2.残差版本
在这里插入图片描述
残差版本
把GBDT说成一个残差迭代树,认为每一棵回归树都在学习前N-1棵树的残差,前面所说的主要在描述这一版本。


总结起来即:学习负梯度or拟合上一轮残差(代表两种思想,但意思是一样的)

目前GBDT有上面这两个不同的描述版本,网上写GBDT的大都没有说清楚自己说的是哪个版本,以及不同版本之间的不同是什么,读者看不同的介绍会得到不同的算法描述,实在让人很头痛。

【注:读完greedy function approximation :a gradient boosting machine.后,发现4.1-4.4写的是残差版本的GBDT,这一个版本主要用来回归;4.5-4.6写的是Gradient版本,它在残差版本的GBDT版本上做了Logistic变换,Gradient版本主要是用来分类的。】


Question6. 关于正则化

正则化是针对过拟合问题的常规手段,通过约束拟合过程来抑制过拟合发生。具体操作可以直接控制m的值,也就是模型组成中学习器的个数。
而对于最优m值的确定,需要通过某些模型选择方法(如试触或者交叉验证等)
后期研究发现,通过收缩(Shrinkage)操作的正则化比通过限制组件数量M获得的结果更好。(具体针对算法1中的line 6,相当于控制学习率)
在这里插入图片描述

论文中对v和m的值的关系进行了实验分析,结论是:
【1】较小的v效果更好;
【2】v越小使得m越大,并且能够产生越高的精确度(这是显然的,因为v越小,说明单棵回归树起到的作用越有限,因而需要越多的回归树共同作用以保证性能)

这种收缩相较于下面在整体模型上的收缩,效果要好。
在这里插入图片描述

其他方法:
【1】使用缩减训练集
Friedman提出在每次迭代时对基学习器,从原始训练集中随机抽取一部分(a subsample of the training set drawn at random without replacement)作为本次基学习器去拟合的样本集,这样可以提高算法最后的准确率。

【2】限制叶节点中样本的数目
这个在决策树中已经提到过。

【3】剪枝
这个在决策树中已经提到过。

【4】限制每颗树的深度
树的深度一般取的比较小,需要根据实际情况来定。



附:李宏毅-机器学习技法PPT(GBDT推导部分)

下面三张PPT可以是整个GBDT的核心部分:
【1】首先最开始的公式是最初的目标函数,本意表达的就是一种累加式的改进策略;
【2】而后通过利用泰勒公式进行目标函数的一阶展开,对应到泰勒公式:f(x)=(sn-yn)2, △x=x-x0;这里的h(xn)就相当于err函数一阶泰勒展开中的△x啊!!!
【3】考虑到如果对h(xn)没有约束的话,这一最小化h的函数不太合理,因此加入了正则化项h(xn),这样组合成了h(xn)和残差的关系式,说明是在找h来贴近这一残差;
【4】同样的,对于 η 的计算,也可以得到类似的结论;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值