程序猿日记机器学习机器学习与数据挖掘

从集成学习到GBDT与随机森林

2018-04-03  本文已影响157人  小碧小琳

初步认识GBDT

个人理解:GBDT(Gradient Boosting Decision Tree),梯度提升决策树、再读一遍:梯度,提升,决策树。
所以理解GBDT,拆开理解就行了。

于是,我们得到了,梯度、提升、决策树方法即GBDT。

学习作业部落 Cmd Markdown 编辑阅读器的笔记,帮助理解。

在GBDT的推导中参考机器学习-一文理解GBDT的原理一文。

一、前言

再次推荐看作业部落 Cmd Markdown 编辑阅读器这篇文章,讲的很好。下面很多句子都是摘抄此文的。

另外,并不推荐孤立的学习GBDT,网上一些只是单讲GBDT的,显得没头没尾的,所以还是从集成学习慢慢往下深入比较好。

二、综述:从ensemble learning到Boosting族到Gradient boosting 再到GBDT

集成学习==>提升方法族==>梯度提升方法==>以决策树作为基学习器的梯度提升方法

2.1集成学习

集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。如何产生“好而不同”的个体学习器,是集成学习研究的核心。

根据个体学习器的生成方式,可以将集成学习方法大致分为两大类:

对于adaboost,bagging和随机森林可以参考集成学习方法1

2.2 Boosting

Boosting是一族可将弱学习器提升为强学习器的算法。boosting方法通过分步迭代(stage-wise)的方式来构建模型,在迭代的每一步构建的弱学习器都是为了弥补已有模型的不足。(个体学习器之间存在强依赖关系。

boosting族算法的著名代表:AdaBoost。
AdaBoost算法通过给已有模型预测错误的样本更高的权重,使得先前的学习器做错的训练样本在后续受到更多的关注的方式来弥补已有模型的不足。

2.3、相比于AdaBoost,梯度提升方法的优点

虽然同属于Boosting族,但是梯度提升方法的优点比较多。

2.4、GBDT==>选择决策树作为基学习器的梯度提升方法

基于梯度提升算法的学习器叫做GBM(Gradient Boosting Machine)
理论上,GBM可以选择各种不同的学习算法作为基学习器。现实中,用得最多的基学习器是决策树。

2.4.1为什么梯度提升方法倾向于选择决策树(通常是CART树)作为基学习器呢?

这与决策树算法自身的优点有很大的关系:

2.4.2决策树有优点,自然也有缺点,不过,可以通过梯度提升方法解决这个缺点。

单独使用决策树算法时,有容易过拟合缺点。怎么解决呢?

由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。

2.4.3怎么降低单棵决策树的复杂度?

抑制单颗决策树的复杂度的方法有很多:

现在主流的GBDT算法实现中这些方法基本上都有实现,因此GBDT算法的超参数还是比较多的,应用过程中需要精心调参,并用交叉验证的方法选择最佳参数。

2.5、对上面的总结

以上说明了GBDT的由来,以及GBDT采用决策树的好处,抑制决策树单棵拟合能力的方法。一直没有说boosting族最重要的一点,怎么在已有模型的基础上构建下一个基学习器?
对应到GBDT中就是:怎么用梯度提升的方法,在已有模型的基础上,学习到下一个决策树模型?

---------------------------------------------------------------------------------------------------------------------

题外话:理解机器学习的关键因素

目标函数通常定义为如下形式:

其中,第一部分是损失函数,用来衡量模型拟合训练数据的好坏程度;第二部分称之为正则项,用来衡量学习到的模型的复杂度。

比如,在下面会把树的深度、节点数等定义成正则项作为模型的复杂度。

为什么目标函数会定义为损失函数和正则项两部分?

目标函数之所以定义为损失函数和正则项两部分,是为了尽可能平衡模型的偏差和方差(Bias Variance Trade-off)。
最小化目标函数意味着同时最小化损失函数和正则项:

也就是说,优化损失函数尽量使模型走出欠拟合的状态,优化正则项尽量使模型避免过拟合。

---------------------------------------------------------------------------------------------------------------------

三、GBDT的推导

3.1、如何在不改变原有模型的结构上提升模型的拟合能力

不改变原有模型,那么怎么减小误差?==>只能添加别的模型,去拟合误差。注意,这里的拟合,不是以学习误差为目的,而是为了学习已有模型未拟合的样本部分。(虽然结果一样,但是目的不一样)

就比如在回归模型中,预测值是一个实值,令标签值为10,模型F1(x)只能拟合到目标的6,还剩下4没拟合,那我用别的模型去拟合这剩下的4,(旧的模型只需要管好他自己就行),然后两个模型的结果相加。
对于同一个样本标签a,F1(x)拟合到了0.6a,F2(x)拟合到了剩下的0.3a(注意是剩下的,不是重复的)。然后0.6a+0.3a能够得到一个更好的结果0.9a。
相比于只用一个模型,这样的加性模型是不是结果要好很多。

3.2、从基于残差的提升方法引入基于梯度的提升方法(一阶泰勒展开)

按照上面的思想,我们可以举出这样的栗子:

假设现在你有样本集(x1,y1),(x2,y2),(x3,y3)...(xn,yn),用一个模型F(x)去拟合这些数据(即让F(x)输出值逼近标签yi),并且定义目标函数为:

在训练一会后,你发现虽然模型的拟合能力效果不错,但是仍有一些差距。比如预测值F(x1)=0.8,真实值y1=1.0;预测值F(x2)=1.1,真实值y2=1.4。
重点来了:根据上面所说,我们可以构造一个F2(x)模型去拟合已有模型F(x)未能完全拟合的部分。即:y - F(x)。于是,对于F(x2)来说,每个样本需要拟合的值就变成了:(x1, y1 - F1(x)),(x2, y2 - F1(x)),(x3, y3 - F1(x))...(xn, yn - F1(x))。
y值已经改变成残差了。

另外,我们也能发现,我们这里想要拟合的残差,正好是原始模型目标函数的梯度:

也就是说,无意中,我们用损失函数对当前模型的梯度,去构造了新的第 t 个模型。所以,基于残差的提升方法(损失函数是平方差)也是梯度提升方法的一个特例。

到这里,我们认为的梯度提升方法构建新的模型方法,是求得当前损失函数对已有模型的梯度得到的(当L对f可微,f对x不可微时,那么L对x也就不可微,此时用一阶泰勒公式展开,也会用到梯度)。这是基于一阶泰勒公式展开得到的梯度提升方法,可以参考深入理解GBDT一文。

以上是用一阶泰勒展开时,所得到的梯度提升方法 ,下面重点介绍一下二阶泰勒展开所得到的梯度提升方法。不变的是,依然是损失函数对当前模型F(x)进行求导,只不过不止求一阶导,还要求二阶导。

3.3 加法模型

3.3.1、初步认识加法模型

梯度提升方法可以看做是由K个基学习器组成的加法模型:

其中F为所有基学习器模型组成的函数空间。该模型的参数为Θ={f1,f2,f3,....fk},与一般的机器学习算法不同的是,加法模型不是学习单个参数,而是直接学习函数集合。

3.3.2、如何学习加法模型

为了学习到这个模型,可以用前向分步算法。如果能够从前往后每一步只学习一个即函数及其系数,逐步逼近优化目标函数,那么就可以简化复杂度。这一学习过程被称为boosting。

定义模型:
具体的说,我们从一个常量预测开始,每次学习一个新的函数,在一直学习到t个函数,构建模型的过程如下:

那么,如何在每一步,加入合适的函数 f 达到不断逼近目标函数的目的呢?首先定义加法模型的目标函数:
定义目标函数:

其中,后半部分Ω(fi)表示第i个基学习器的复杂度。比如,我们定义树的复杂度为节点数量,树的深度或者叶节点所对应的分数的L2范数等等。

已有了目标函数,我们以最小化目标函数为指导原则构造每一步被加入的函数 f :

因为boosting的个体学习器间存在强依赖关系,串行生成新的模型。这里也是,在前面t-1个基学习器已知的情况下,学习到第t个基学习器。

目标函数可以由 yt-t 和 ft表示。而 yt-t 是已知的,则目标函数就可以用 ft 表示。
我们想要得到 一个ft模型能够使目标函数最小,那么同理,只要我们最小化目标函数,就能得到 ft 模型。
和对于y = x2,我们想要得到一个数x使y最小,那么我们就最小化y,就能得到想要的x。令y’ = 0。求得x等于0,那么0就是我们想要的x。

在第 t 步,对于样本xi的预测值为:

其中,后者ft(xi)就是这一轮迭代中我们要学习的函数模型,这个时候,可以将目标函数写成:

举例说明,假设损失函数为平方损失函数,则目标函数为:

式中第一部分就是损失函数L。

其中,gi是损失函数对模型yt-1的一阶导数,hi是损失函数对模型yt-1的二阶导数。

由于前面模型已知,所以可以求出损失函数相对于当前模型的一阶导数和二阶导数,那么此时的目标函数就只有 一个参数 ft,那么通过在训练样本集上最小化等式(5),就可求得 ft,从而逐步得到加法模型。

3.3 GBDT算法

由于上面所说的决策树的优点,我们经常采用决策树作为梯度提升方法的基学习器,于是我们有了GBDT算法。

对于公式(6)的解释,首先,第一行到第二行,已经说明,决策树定义为ft(x) = wq(x)。第二行到第三行,叶子节点共有 j 个,所以样本会被划分为 j 个子集。而决策树的特点,就在于每个叶子节点上的值是相同的(回归的话就是数值相同,分类的话就是类别相同,比如一个叶节点上的都是好瓜)。所以可以认为wq(x)其实只有 j 个值,分别是wj。再带入上面的正则项定义,于是可以得到第三行的公式。

对公式(7)的解释,定义了G和H以后,目标函数只有一个参数wj了,那么直接对wj求导,并令其为0,即可得到wj的表达式。也就是叶子节点对应的值。

此时,目标函数的值为:

于是单棵决策树的学习过程可以大致描述为:

下面是对如何生成决策树的具体的介绍(并没有看懂多少。。有时间再回来看看)

注意:GBDT的基学习器是分类回归树CART,使用的是CART树中的回归树。分类回归树CART算法是一种基于二叉树的机器学习算法,其既能处理回归问题,又能处理分类为题。

对于单个分类回归树CART算法的具体步骤,参考简单易学的机器学习算法——梯度提升决策树GBDT

image.png
上一篇 下一篇

猜你喜欢

热点阅读