GBDT

1、GBDT模型介绍;

2、GBDT回归算法

3、GBDT分类算法

4、GBDT的损失函数

5、正则化

6、GBDT的梯度提升与梯度下降法的梯度下降的关系;

7、GBDT的优缺点

 

1、GBDT模型介绍;

GBDT(Gradient Boosting Decision Tree) 又名:MART(Multiple Additive Regression Tree) 

适用于分类和回归问题;

加法模型(基分类器的线性组合)

根据当前损失函数的负梯度信息来训练新加入的弱分类器,再将训练好的弱分类器以累加的形式结合到现有模型;

以决策树为基学习器的提升方法;一般会选择为CART(无论用于分类还是回归),也可以选择其他弱分类器的,选择的前提是低方差和高偏差,每次走一小步逐渐逼近结果的效果;

在训练过程中希望损失函数能够不断的减小,且尽可能快的减小。所以用的不是单纯的残差,而是损失函数的负梯度方向,这样保证每轮损失函数都在稳定下降,而且递减速度最快,类似于梯度下降法,来求损失函数的极小值;

Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。

 

 

 

2、GBDT回归算法描述

 

步骤:

1、初始化:估计是损失函数极小化的常数值;

2、更新回归树:

数据——训练基分类器1——训练数据的伪残差——训练基分类器2——......

  计算每个样本的损失函数在当前模型的负梯度值,将它作为残差的近似值,即新一轮的训练目标;

  根据残差的近似值,求出使对应的损失函数的和最小的,第m棵回归树(第m个基分类器)$h(x_{i},\alpha )$,$\beta $相当于给梯度了一个步长;**先构造CART树,当CART树的结构定下来之后,再求叶子节点的值;

  根据目标lable,求出使对应经验损失最小的参数$\rho $,来确认第m轮得到的基分类器,在最后的模型中的占比;

  训练模型,直至误差小于要求,或树的个数为M时;

3、输出回归模型;

 

3、GBDT分类算法描述

GBDT分类算法和回归算法思路一样;但类别相减得到的残差并没有意义;

解决方案有两种方法:

一是用指数损失函数,此时GBDT算法退化为AdaBoost算法。

二是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。

  

此处介绍方法二,估计概率的方式;

1)二元分类

输入:训练数据集T=\left \{ (x{_{1},y{_{1}}}),(x{_{2}},y{_{2}}),...,(x{_{N}},y{_{N}}) \right \},损失函数为L(y,f(x))=ln(1+exp(-2yf(x))),y={-1,1}

输出:分类树F(x)

(1)初始化:

                       f{_{0}}(x)=\frac{1}{2}ln\frac{P(y=1|x)}{P(y=-1|x)}

(2)对m=1,2,...,M

  (a)对样本i=1,2,...N,计算伪残差

                      r{_{mi}}=\frac{2y{_{i}}}{1+exp(2y{_{i}}f{_{m-1}}(x{_{i}}))}

  (b)对概率残差\left \{ (x{_{1}},r{_{m1}}),..., (x{_{N}},r{_{mN}})\right \}拟合一个分类树,得到第m棵树的叶节点区域R{_{mj}} ,j=1,2,...,J

  (c)对j=1,2,...,Ji=1,2,...,N,计算

                    c{_{mj}}=\frac{\sum_{x{_{i}}\in R{_{mj}}}r{_{mj}}}{\sum_{x{_{i}}\in R{_{mj}}}|r{_{mj}}|(2-|r{_{mj}}|)}

    **对于(b)(c),这里拟合分类树应该还是首先遍历每个特征,然后对每个特征遍历它所有可能的切分点,然后对该分类树求使经验风险最小的切分及参数(就是叶节点区域的预测值),由于这个式子比较难算,就用(c)来近似了。

 

  (d)更新

                    f{_{m}}(x)=f{_{m-1}}(x)+\sum_{J}^{j=1}c{_{mj}}I(x\in R{_{mj}})

(3)得到最终的分类树

                               F(x)=\sum_{m=1}^{M}\sum_{j=1}^{J}c{_{mj}}I(x\in R{_{mj}})

 

由于我们用的是类别的预测概率值和真实概率值的差来拟合损失,所以最后还要讲概率转换为类别,如下:

P(y=1|x)=\frac{1}{1+exp(-2F(x))}

                               P(y=-1|x)=\frac{1}{1+exp(2F(x))}

最终输出比较类别概率大小,概率大的就预测为该类别。

(用的损失函数使对数损失,所以这里用上面的式子来计算类别;

当y=1时,损失函数最小需要F(X)=正无穷,此时y=1的概率为1,y=0的概率为0;

当y=-1时,损失函数最小需要F(X)=负无穷,此时y=1的概率为0,y=0的概率为1;)

其实二元分类和回归的原理是一样的,只是把分类的lable改成了预测概率,再通过概率来预测类别;

2)多元分类

 

输入:训练数据集T=\left \{ (x{_{1},y{_{1}}}),(x{_{2}},y{_{2}}),...,(x{_{N}},y{_{N}}) \right \},损失函数为L(y{_{k}},f{_{k}}(x))=-\sum_{k=1}^{K}y{_{k}}lnP{_{k}}(x)y{_{k}}={0,1}表示是否属于第k类别,1表示是,0表示否。k=1,2,...,K,表示共有多少分类的类别。

输出:分类树F(x)

相当于在训练的时候,是针对样本 X 每个可能的类都训练一个分类树。

(1)初始化:

                       f{_{k0}}(x)=0k=1,2,...,K

(2)对m=1,2,...,M

 

  (a)计算样本点俗属于每个类别的概率:

                    P{_{k}}(x)=exp(f{_{k}}(x))/\sum_{l=1}^{K}exp(f{_{l}}(x))

  (b)对k=1,2,...,K:zhi

     1) r{_{ki}}=y{_{ki}}-P{_{k}}(x{_{i}})i=1,2,...,N(这是根据损失函数和P(x)求导算出来的,体现了负梯度的概念)

          2)对概率伪残差\left \{ (x{_{1}},r{_{k1}}),..., (x{_{N}},r{_{kN}})\right \}拟合一个分类树

          3)c{_{mkj}}=\frac{K-1}{K}\frac{\sum_{x{_{i}}\in R{_{mkj}}}r{_{ki}}}{\sum_{x{_{i}}\in R{_{mkj}}}|c{_{ki}}|(1-|c{_{ki}}|)}(跟二分类一样,这也是一个近似计算方法)

          4)f{_{mk}}(x)=f{_{k,m-1}}(x)+\sum_{j=1}^{J}c{_{mkj}}I(x\in R{_{mkj}})

(3)得到最终的分类树(这是K类中的第k类的GBDT方法求出来的模型)

                               F{_{Mk}}(x)=\sum_{m=1}^{M}\sum_{j=1}^{J}c{_{mkj}}I(x\in R{_{mkj}})

最后得到的F{_{Mk}}(x)可以被用来去得到分为第k类的相应的概率P{_{Mk}}(x)

                               P{_{Mk}}=exp(F{_{Mk}}(x))/\sum_{l=1}^{K}exp(F{_{Ml}}(x))

相当于对每一类都有一个求GBDT的概念,只是该类的预测值不仅与该类本身有关,还与剩余的K-1个GBDT模型的输出相关;

损失函数的求导:

对于第k类的第i个样本的损失函数为:

$L(y_{ki},f_{k}(x_{i}))=-\sum_{l=1}^{K}y_{li}\ln  P_{li}$对于样本i来说,只有一个类别的y为1,其他的都是0,$\sum_{l=1}^{K}y_{li}=1$;

$P_{ki}=\frac{exp(f_{k}(x_{i}))}{\sum_{l=1}^{K}exp(f_{l}(x_{i}))}$

$L(y_{ki},f_{k}(x_{i}))=-\sum_{l=1}^{K}y_{li}\ln  P_{li}=y_{ki}\ln  P_{ki}+\sum_{l\neq k}^{}y_{li}\ln  P_{li}=y_{ki}\ln \frac{exp(f_{k}(x_{i}))}{\sum_{l=1}^{K}exp(f_{l}(x_{i}))}+\sum_{l\neq k}^{}y_{li}\ln\frac{exp(f_{l}(x_{i}))}{\sum_{l=1}^{K}exp(f_{l}(x_{i}))} $

两项都有$f_{k}(x_{i})$,在分别求导会得到r{_{ki}}=y{_{ki}}-P{_{k}}(x{_{i}})

 

 

 

当损失函数为平方损失函数时,即为残差; 提升树是GBDT的一种,即损失函数为平方损失函数时;

 

 4、GBDT的损失函数

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

(1)exponential:指数损失,表达式如下:

                          L(y,f(x))=exp(-yf(x))

(2)deviance:对数损失,类似于logistic回归的损失函数,输出的是类别的概率,表达式如下:

                          L(y,f(x))=ln(1+exp(-2yf(x)))

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

(1)平方损失,这是最常见的回归损失函数了,如下:

                  L(y,f(x))=(y-f(x))^2

  导数为y-f(x),即 残差;       

(2)绝对损失

   L(y,f(x))=|y-f(x)|

  对应负梯度为:

        r(y{_{i}},f(x{_{i}}))=sign(y{_{i}}-f(x{_{i}}))

(3)huber损失,对于远离中心的异常点采用绝对损失,而中心附近的点采用平方损失。这个界限一般用分位数点度量。损失函数如下:                       

  L(y,f(x))=\begin{cases} \frac{1}{2}(y-f(x))^2 & \text{ if } |y-f(x)|\leq \delta \\ \delta (|y-f(x)|-\frac{\delta }{2})& \text{ if } |y-f(x)|> \delta \end{cases}

  对应的负梯度为:

        r(y{_{i}},f(x{_{i}}))=\begin{cases} y{_{i}}-f(x{_{i}}) & \text{ if }|y{_{i}}-f(x{_{i}})|\leq \delta \\ \delta sign(y{_{i}}-f(x{_{i}})) & \text{ if } |y{_{i}}-f(x{_{i}})|> \delta \end{cases}

(4)quantile:分位数损失,它对应的是分位数回归的损失函数,表达式如下:

                           L(y,f(x))=\sum_{y\geq f(x)}\theta |y-f(x)|+\sum_{y<f(x)}(1-\theta )|y-f(x)|

其中θ为分位数,需要我们在回归前指定。对应的负梯度为:

                          r(y{_{i}},f(x{_{i}}))=\begin{cases} \theta & \text{ if } y{_{i}}\geq f(x{_{i}}) \\\theta-1 &\text{ if } y{_{i}}< f(x{_{i}}) \end{cases}

对于huber损失和分位数损失主要作用就是减少异常点对损失函数的影响。

                            

5、正则化

方法1:用v来调节补偿和迭代次数,通过选择最合适的v来减少或增加迭代次数;

方法2:CART正则化剪枝

方法3:通过子采样比例(subsample),取值为(0,1],每棵树训练的时候只选取全部数据的一部分训练,来防止过拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。

注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。

例如:每棵树抽样的整体都是100个样本;随机森林抽样是放回的,最极端的可能全部都是重复,即一个样本;无放回抽样主要是样本不会重复;gbdt的子采样比例为0.8时,每棵树都会从100个样本中不放回的选择80个样本来训练;

 

6、GBDT的梯度提升与梯度下降法的梯度下降的关系;

 

 GBDT  VS  梯度下降

都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息对当前模型进行更新;

梯度下降中,模型是以参数化形式表示,更新模型相当于更新参数;

GBDT中,模型不需要进行参数化表示,直接定义在函数空间,扩展了可以使用的模型种类;

 

 7、GBDT的优缺点

 

1、效果确实挺不错。

2、即可以用于分类也可以用于回归。

3、可以筛选特征。(不相关的特征可以不用)

4、可以很好的处理缺失特征的数据,因为决策树的每个节点只依赖一个 feature,如果某个 feature 不存在,这颗树依然可以拿来做决策,只是少一些路径。像逻辑回归,SVM 就没这个好处。

5、可以很好的处理各种类型的特征,包括连续值和离散值,同样逻辑回归和 SVM 没这样的天然特性。

6、对特征空间的异常有鲁棒性,因为每个节点都是 x < ? 的形式,至于大多少,小多少没有区别,outlier 不会有什么大的影响。使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

7、数据规模影响不大,因为我们对弱分类器的要求不高,作为弱分类器的决策树的深度一般设的比较小,即使是大数据量,也可以方便处理。像 SVM 这种数据规模大的时候训练会比较麻烦。

8、数据不需要归一化,特征的作用只是用来分裂结点,叶结点的值与特征值大小无关,是否归一化并不影响叶结点值的大小,也不影响梯度下降的进程;

9、在相对少的调参时间情况下,预测的准确率也可以比较高;

 3-8都是决策树本身的优势。

缺点

由于弱学习器之间存在依赖关系,难以并行训练数据。

                    

https://blog.csdn.net/qq_24519677/article/details/82020863

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

转载于:https://www.cnblogs.com/danniX/p/10628980.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值