梯度提升树(Gradient Boosting Decison Tree, GBDT)

转自:https://www.cnblogs.com/pinard/p/6140514.html

GBDT基本思路

  GBDT也是集成学习Boosting家族的成员。回顾下Adaboost,是利用前一轮迭代弱学习器的误差率来更新训练集的权重。GBDT也是迭代,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
  在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是 ft1(x) f t − 1 ( x ) , 损失函数是 L(y,ft1(x)) L ( y , f t − 1 ( x ) ) , 本轮迭代的目标是找到一个CART回归树模型的弱学习器 ht(x) h t ( x ) ,让本轮的损失损失 L(y,ft(x))=L(y,ft1(x)+ht(x)) L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( x ) ) 最小,本轮迭代找到的决策树,要让样本的损失尽量变得更小。

GBDT求解

  强分类器是由多个弱分类器线性相加而成,那么可以写成如下形式:

F(x;{βm,am}M1)=m=0Mβmh(x;am) F ( x ; { β m , a m } 1 M ) = ∑ m = 0 M β m h ( x ; a m )
这里的 h(x;am) h ( x ; a m ) 指代回归树,例如CART回归树。 am a m 是模型参数,这里指代每个节点的分裂特征(变量),最佳分割点,节点的预测值。M就是弱分类器数目。
  不同于 参数空间的数值优化,GBDT的优化属于 函数空间的优化方法。Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第 t t 轮的第 i i 个样本的损失函数的负梯度表示为
rti=[L(yi,f(xi)))f(xi)]f(x)=ft1(x) r t i = − [ ∂ L ( y i , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x )
利用 (xi,rti)(i=1,2,..m) ( x i , r t i ) ( i = 1 , 2 , . . m ) ,我们可以拟合一颗CART回归树,得到了第 t t 颗回归树,其对应的叶节点区域 Rtj,j=1,2,...,J R t j , j = 1 , 2 , . . . , J 。其中 J J 为叶子节点的个数。
  针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的 ctj c t j 如下:
f0(x)=argminci=1mL(yi,c) f 0 ( x ) = a r g m i n ⏟ c ∑ i = 1 m L ( y i , c )
这样我们就得到了本轮的决策树拟合函数如下:
ht(x)=j=1JctjI(xRtj) h t ( x ) = ∑ j = 1 J c t j I ( x ∈ R t j )
从而本轮最终得到的强学习器的表达式如下:
ft(x)=ft1(x)+j=1JctjI(xRtj) f t ( x ) = f t − 1 ( x ) + ∑ j = 1 J c t j I ( x ∈ R t j )
通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。

GBDT算法

输入是训练集样本 T=(x1,y1),(x2,y2),...(xm,ym) T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) , 最大迭代次数 T T , 损失函数 L L
输出是强学习器 f(x) f ( x )
  1) 初始化弱学习器 f0(x)=argminci=1mL(yi,c) f 0 ( x ) = a r g m i n ⏟ c ∑ i = 1 m L ( y i , c )
  2) 对迭代轮数 t=1,2,...T t = 1 , 2 , . . . T 有:
    a)对样本 i=1,2...m i = 1 , 2 , . . . m ,计算负梯度

rti=[L(yi,f(xi)))f(xi)]f(x)=ft1(x) r t i = − [ ∂ L ( y i , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x )

    b)利用 (xi,rti)(i=1,2,..m) ( x i , r t i ) ( i = 1 , 2 , . . m ) , 拟合一颗CART回归树,得到第t颗回归树,其对应的叶子节点区域为 Rtj,j=1,2,...,J R t j , j = 1 , 2 , . . . , J 。其中 J J 为回归树t的叶子节点的个数。
    c) 对叶子区域 j=1,2,..J j = 1 , 2 , . . J ,计算最佳拟合值 ctj=argmincxiRtjL(yi,ft1(xi)+c) c t j = a r g m i n ⏟ c ∑ x i ∈ R t j L ( y i , f t − 1 ( x i ) + c )
    d) 更新强学习器 ft(x)=ft1(x)+j=1JctjI(xRtj) f t ( x ) = f t − 1 ( x ) + ∑ j = 1 J c t j I ( x ∈ R t j )
  3) 得到强学习器 f(x) f ( x ) 的表达式 f(x)=fT(x)=f0(x)+t=1Tj=1JctjI(xRtj) f ( x ) = f T ( x ) = f 0 ( x ) + ∑ t = 1 T ∑ j = 1 J c t j I ( x ∈ R t j )

GBDT常用损失函数

  • 对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:
      a) 如果是指数损失函数,则损失函数表达式为 L(y,f(x))=exp(yf(x)) L ( y , f ( x ) ) = e x p ( − y f ( x ) )
      b) 如果是对数损失函数,分为二元分类和多元分类两种
      二元: L(y,f(x))=log(1+exp(yf(x))) L ( y , f ( x ) ) = l o g ( 1 + e x p ( − y f ( x ) ) ) ,这里的类别编号是{-1,1}
      按照上面的算法:则此时的负梯度误差为:

    rti=[L(y,f(xi)))f(xi)]f(x)=ft1(x)=yi/(1+exp(yif(xi))) r t i = − [ ∂ L ( y , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) = y i / ( 1 + e x p ( y i f ( x i ) ) )

      对于生成的决策树,我们各个叶子节点的最佳残差拟合值为:
    ctj=argmincxiRtjlog(1+exp(yi(ft1(xi)+c))) c t j = a r g m i n ⏟ c ∑ x i ∈ R t j l o g ( 1 + e x p ( − y i ( f t − 1 ( x i ) + c ) ) )

      多元: L(y,f(x))=k=1Kyklogpk(x) L ( y , f ( x ) ) = − ∑ k = 1 K y k l o g p k ( x ) ,这里的多元类别编号采用one-hot编码形式。

  • 对于回归算法,常用损失函数有如下4种:
      a)均方差,这个是最常见的回归损失函数了 L(y,f(x))=(yf(x))2 L ( y , f ( x ) ) = ( y − f ( x ) ) 2
      b)绝对损失,这个损失函数也很常见 L(y,f(x))=|yf(x)| L ( y , f ( x ) ) = | y − f ( x ) | ,对应负梯度误差为: sign(yif(xi)) s i g n ( y i − f ( x i ) )
      c)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:

    L(y,f(x))={12(yf(x))2δ(|yf(x)|δ2)|yf(x)|δ|yf(x)|>δ L ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2 | y − f ( x ) | ≤ δ δ ( | y − f ( x ) | − δ 2 ) | y − f ( x ) | > δ

      对应的负梯度误差为:
    r(yi,f(xi))={yif(xi)δsign(yif(xi))|yif(xi)|δ|yif(xi)|>δ r ( y i , f ( x i ) ) = { y i − f ( x i ) | y i − f ( x i ) | ≤ δ δ s i g n ( y i − f ( x i ) ) | y i − f ( x i ) | > δ

      d) 分位数损失。它对应的是分位数回归的损失函数,表达式为
    L(y,f(x))=yf(x)θ|yf(x)|+y<f(x)(1θ)|yf(x)| L ( y , f ( x ) ) = ∑ y ≥ f ( x ) θ | y − f ( x ) | + ∑ y < f ( x ) ( 1 − θ ) | y − f ( x ) |

      其中θ为分位数,需要我们在回归前指定。对应的负梯度误差为:
    r(yi,f(xi))={θθ1yif(xi)yi<f(xi) r ( y i , f ( x i ) ) = { θ y i ≥ f ( x i ) θ − 1 y i < f ( x i )

     对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

GBDT的正则化

Adaboost一样,我们也需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有两种方式。

  • 第一种是和Adaboost类似的正则化项,即步长(learning rate)。定义为 ν ν ,对于前面的弱学习器的迭代
    fk(x)=fk1(x)+hk(x) f k ( x ) = f k − 1 ( x ) + h k ( x ) ,如果加上了正则化项,则有 fk(x)=fk1(x)+νhk(x) f k ( x ) = f k − 1 ( x ) + ν h k ( x ) ν ν 的取值范围为 0<ν1 0 < ν ≤ 1 。对于同样的训练集学习效果,较小的 ν ν 意味着我们需要更多的弱学习器。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

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

GBDT总结 

  GDBT本身并不复杂,不过要吃透的话需要对集成学习的原理,决策树原理和各种损失函树有一定的了解。由于GBDT的卓越性能,只要是研究机器学习都应该掌握这个算法,包括背后的原理和应用调参方法。目前GBDT的算法比较好的库是xgboost。当然scikit-learn也可以。
  GBDT主要的优点有:
  1) 可以灵活处理各种类型的数据,包括连续值和离散值。
  2) 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
  3) 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
  
  GBDT的主要缺点:
  由于弱学习器之间存在依赖关系,难以并行训练数据。但可以通过自采样SGBT来达到部分并行。


参考文章:
https://www.cnblogs.com/pinard/p/6140514.html
https://www.cnblogs.com/ScorpioLu/p/8296994.html
sklearn:http://www.cnblogs.com/pinard/p/6143927.html

你可能感兴趣的:(机器学习,笔记)