Datawhale高级算法梳理第六期 【Task2 GBDT算法梳理】3天

一、引言


  在集成学习原理介绍中,简单的介绍了根据个体学习器学习方式不同划分的两大类集成学习方法,个体学习器间存在强依赖关系、必须串行生成的序列化方法,如Boosting;个体学习器间不存在强依赖关系、可同时生成的并行化方法,如Bagging。 
  回顾一下Boosting算法的学习机制:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的的训练样本在后续受到更多关注,然后基于调整后的样本分布训练下一个基学习器;重复进行,直到基学习器数目达到事先指定的值T,最终将这T个基学习器加权结合。 
  在Adaboost算法原理小结,介绍了Boosting家族的一个重要算法Adaboost,今天我们来看一看Boosting家族中另一个更加常用的的算法GBDT。

二、GBDT概述


  GBDT全称Gradient Boosting Decison Tree,同为Boosting家族的一员,它和Adaboost有很大的不同。Adaboost 是利用前一轮弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去,简单的说是Boosting框架+任意基学习器算法+指数损失函数。GBDT也是迭代,也使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同,简单的说Boosting框架+CART回归树模型+任意损失函数。 
  GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。

三、负梯度拟合


  在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是 Ht−1(x)Ht−1(x) , 损失函数是 L(f(x),Ht−1(x))L(f(x),Ht−1(x)) , 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器 ht(x)ht(x) ,让本轮的损失 L(f(x),ht(x)+Ht−1(x))L(f(x),ht(x)+Ht−1(x)) 最小,那么GBDT是如何实现让本轮的损失最小的呢? 
  针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失 L(f(x),ht(x)+Ht−1(x))L(f(x),ht(x)+Ht−1(x)) 的近似值,进而拟合一个CART回归树。第 t 轮的第 i 个样本的损失函数的负梯度表示为 

rti=−∂L(yi,ht−1(xi))∂ht−1(xi)rti=−∂L(yi,ht−1(xi))∂ht−1(xi) 
  利用 (xi,rti),i=1,2,⋯,m(xi,rti),i=1,2,⋯,m ,我们可以拟合一棵CART回归树,得到了第 t 棵回归树,其对应的叶结点区域 Rtj,j=1,2,⋯,JRtj,j=1,2,⋯,J。其中 JJ 为叶子结点的个数。 
  针对每一个叶子结点里的样本,我们求出使损失函数最小,也就是拟合叶子结点最好的输出值 ctjctj 

ctj=argminc∑xi∈RtjL(f(xi),ht−1(xi)+c)ctj=argminc∑xi∈RtjL(f(xi),ht−1(xi)+c) 
这样我们就得到了本轮的决策树拟合函数如下: 

ht(x)=∑Jj=1ctjI(x∈Rtj)ht(x)=∑j=1JctjI(x∈Rtj) 
从而本轮最终得到的强学习器的表达式如下: 

ht(x)=ht−1(x)+∑Jj=1ctjI(x∈Rtj)ht(x)=ht−1(x)+∑j=1JctjI(x∈Rtj) 
  通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。

四、GBDT算法


1.回归算法


输入:训练样本 D={(x1,y1),(x2,y2),⋯,(xm,ym)}D={(x1,y1),(x2,y2),⋯,(xm,ym)},最大迭代次数(基学习器数量) TT,损失函数 LL 
输出:强学习器 H(x)H(x)
算法流程
Step1:初始化基学习器 

h0(x)=argminc∑mi=1L(yi,c)h0(x)=argminc∑i=1mL(yi,c) 
Step2:当迭代次数 t=1,2,⋯,Tt=1,2,⋯,T

(1)计算 t 次迭代的负梯度 

rti=−∂L(yi,ht−1(xi))∂ht−1(xi),i=1,2,⋯,mrti=−∂L(yi,ht−1(xi))∂ht−1(xi),i=1,2,⋯,m 
(2)利用 (xi,rti)(i=1,2,⋯,m)(xi,rti)(i=1,2,⋯,m),拟合第 t 棵CART回归树,其对应的叶子结点区域为 Rtj,j=1,2,⋯,JRtj,j=1,2,⋯,J。 其中 JJ 为回归树的叶子结点的个数 
(3)对叶子结点区域 j=1,2,⋯,Jj=1,2,⋯,J,计算最佳拟合值


ctj=argminc∑xi∈RtjL(yi,ht−1(xi)+c)ctj=argminc∑xi∈RtjL(yi,ht−1(xi)+c) 
(4)更新强学习器


ht(x)=ht−1(x)+∑Jj=1ctjI(x∈Rtj)ht(x)=ht−1(x)+∑j=1JctjI(x∈Rtj) 
Step3:得到强学习器


H(x)=h0(x)+∑Tt=1∑Jj=1ctjI(x∈Rtj)H(x)=h0(x)+∑t=1T∑j=1JctjI(x∈Rtj) 


2.分类算法


  GBDT的分类算法从思想上和GBDT的回归算法没有本质区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。 
  为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。本文仅讨论用对数似然损失函数的GBDT分类。而对于对数似然损失函数,我们又有二元分类和多元分类的区别。

2.1二元分类


对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为: 

L(y,h(x))=log(1+exp(−yh(x)))L(y,h(x))=log(1+exp(−yh(x))) 
其中,y∈{−1,+1}y∈{−1,+1}。此时的负梯度误差是 

rti=−∂L(yi,ht−1(xi))∂ht−1(xi)=yi(1+exp(yih(xi))),i=1,2,⋯,mrti=−∂L(yi,ht−1(xi))∂ht−1(xi)=yi(1+exp(yih(xi))),i=1,2,⋯,m 
对于生成的决策树,我们各个叶子节点的最佳残差拟合值为 

ctj=argminc∑xi∈Rtjlog(1+exp(−yih(xi)+c))ctj=argminc∑xi∈Rtjlog(1+exp(−yih(xi)+c)) 
由于上式比较难优化,我们一般使用近似值代替 

ctj=∑xi∈Rtjrti∑xi∈Rtj|rti|(1−|rti|)ctj=∑xi∈Rtjrti∑xi∈Rtj|rti|(1−|rti|) 
除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。

五、GBDT损失函数


这里我们再对常用的GBDT损失函数做一个总结。 


1.对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种: 


(1)如果是指数损失函数,则损失函数表达式为 

L(y,h(x))=exp(−yh(x))L(y,h(x))=exp(−yh(x)) 
其负梯度计算和叶子节点的最佳残差拟合参见Adaboost原理篇。 
(2)如果是对数损失函数,分为二元分类和多元分类两种, 
对于二元分类


L(y,h(x))=log(1+exp(−yh(x)))L(y,h(x))=log(1+exp(−yh(x))) 


 
2.对于回归算法,常用损失函数有如下4种: 


(1)均方差,这个是最常见的回归损失函数了 

L(y,h(x))=(y−h(x))2L(y,h(x))=(y−h(x))2 
(2)绝对损失,这个损失函数也很常见 

L(y,h(x))=|y−h(x)|L(y,h(x))=|y−h(x)| 

对应负梯度误差为: 

sign(yi−h(xi))sign(yi−h(xi))
(3)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。 
(4)分位数损失。它对应的是分位数回归的损失函数。

六、GBDT的正则化


  和Adaboost一样,我们也需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。 
(1)第一种是和Adaboost类似的正则化项,即步长(learning rate)。定义为ν,对于前面的弱学习器的迭代 

Ht(x)=Ht−1(x)+ht(x)Ht(x)=Ht−1(x)+ht(x) 
如果我们加上了正则化项,则有


Ht(x)=Ht−1(x)+αht(x),0<α≤1Ht(x)=Ht−1(x)+αht(x),0<α≤1 
对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

(2)第二种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。 
  使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。 
   
(3)第三种是对于弱学习器即CART回归树进行正则化剪枝。在决策树原理篇里我们已经讲过,这里就不重复了。

GBDT优缺点


GBDT主要的优点有: 
(1)可以灵活处理各种类型的数据,包括连续值和离散值。 
(2)在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。 
(3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。 
GBDT的主要缺点有: 
(1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
 

参考资料:http://www.cnblogs.com/pinard/p/6140514.html

   https://blog.csdn.net/akirameiao/article/details/80009155

猜你喜欢

转载自blog.csdn.net/qq_36671300/article/details/89061046
今日推荐