Boosting之GBDT原理

  前面介绍了Adaboost的相关原理,实现,应用,本文主要介绍Boosting算法的另外一个重要算法:GBDT(Gradient Boosting Decison Tree)。GBDT有很多简称,有GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其实都是指的同一种算法,本文统一简称GBDT。主要侧重逻辑上能否说得通,理论细节,力有未逮。

1. GBDT概述

  GBDT和Adaboost有很多异同,甚至在损失函数均为指数损失函数时,可以等价(从Sklearn的使用来看)。两者算法细节不尽相同,但是从迭代框架以及加法模型来看大体一致,在每一轮迭代时,有部分不同。在Adaboost中,算法的每一轮迭代,都是利用前一轮迭代弱学习器的误差率来更新训练集的权重,优化目标函数即为加权的分类误差率;而在GBDT中,也是采用加法模型以及前向分步算法,但是具体迭代时,直接拟合负梯度(当损失函数为square-loss,等价于拟合残差)。而优化的方法出发点很直观,把损失函数 L ( Y , f ( x ) ) 看成整体, f ( x ) 看成 x ,利用梯度下降法的思想求解新的弱分类器,即目标是求解负梯度,由于负梯度的求解涉及到 y ,在做预测时 y 未知,所以换了一种思维方式,即利用训练集的特征 x 和负梯度,通过CART回归树进行拟合。如此,做预测时,可以通过 x ,直接估计负梯度进行计算。文字叙述略显繁杂,下面看算法框架

2. GBDT框架

2.1 符号标记

  • 训练集样本: T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) }
  • m 个分类器: G m
  • 迭代次数or基分类器个数: M
  • 损失函数: L
  • 经过 m 轮迭代之后的家和分类器: f m ( x ) = f m 1 ( x ) + α m G m ( x ) = t = 1 m G t ( x )
  • 最终的分类器: G ( x )

2.2 算法逻辑

2.2.1 目标函数

  算法的整体逻辑和Adaboost类似,简单的复习下加法模型和前向分步算法。加法模型是各个弱分类器线性加权的形式:

G ( x ) = m = 1 M α m G m ( x )

记关于 f ( x ) 和样本 x i 的损失函数为 L ( y i , f ( x i ) ) ,那么优化目标:
min α , γ i = 1 n L ( y i , f ( x i ) )

其中 α 为各个分类器的权重, γ 为各个分类器的参数。
显然直接求解这么多参数很困难,前向分步算法每一轮迭代,只训练一个模型,换言之,在前向分步算法中,以迭代方式训练模型,而在每一次迭代中(e.g.第 m 轮),目标函数如下:
min α m , γ m i = 1 n L ( y i , f m 1 ( x i ) + α m G m ( x ; γ m ) )

2.2.2 求解

  每一轮迭代的目标函数已有,那么下一步就是最小化损失函数,求解 G m ( x ) 。先固定 α m ,求使得损失函数最小的 G m ( x ) 即弱分类器的参数 γ m 。损失函数最小化,容易想到梯度下降法,先回忆梯度下降的迭代方式:

x t + 1 = x t α f x

其中 f 为目标函数, α 为步长。
对照梯度下降算法,在求解 G m 时,我们可以做如下类比:

f i = 1 n L ( y i , f m 1 ( x i ) ) x f m 1

那么:
f m ( x ) = f m 1 α i = 1 n L ( y i , f m 1 ( x i ) ) f m 1

即:
α = α m , G m ( x ) = i = 1 n L ( y i , f m 1 ( x i ) ) f m 1 f m ( x ) = f m 1 + α m G m ( x )

并且这里的 α m 是这样设计的:
α m = arg min α i = 1 n L ( y i , f m 1 ( x i ) α i = 1 n L ( y i , f m 1 ( x i ) ) f m 1 )

2.2.3 拟合负梯度

  按照2.2.2节所述,每一轮迭代时直接求解损失函数的负梯度即可,为什么要拟合呢?训练模型的唯一目的是为了预测,而真正的预测 y 是不知道的,但是计算负梯度,即计算 G m ( x ) 时,仍然需要 y 。所以需要换个思路,用已知训练中的 x , y 去计算负梯度,再用CART回归树拟合 x 和负梯度即可。这样一来,真正预测的时候,输出 x ,就可以得到一个负梯度的估计。虽然这个估计未必准确,但是从泛化角度来看,减少过拟合的风险。
  那么,真正的基分类器OR加法模型中的基函数就不是负梯度,而是拟合负梯度的CART回归树。

3 损失函数

  下面对损失函数做一个总结。
1. 分类算法
 a)指数损失函数,表达式为

L ( y , f ( x ) ) = exp [ y f ( x ) ]

在Adaboost原理篇中提过,指数损失函数是符合直觉的,即判断正确,损失小,判断错误损失大。并且损失越小,判断正确的可信度越高。
 b)对数损失函数,表达式为
L ( y , f ( x ) ) = log ( 1 + exp ( y f ( x ) ) )

对数损失函数要谈及逻辑回归,在逻辑回归中,目标函数是似然函数极大化,如果从损失角度看,就是负的似然函数最小化。具体逻辑如下:
S i n c e : { P ( y = 1 | X ) = exp [ f ( x ) ] 1 + exp [ f ( x ) ] P ( y = 0 | X ) = 1 1 + exp [ f ( x ) ] H e n c e : L ( y , P ( y | X ) ) = { log exp [ f ( x ) ] 1 + exp [ f ( x ) ] , y = 1 log 1 1 + exp [ f ( x ) ] , y = 1 S i m p l i f y : L ( y , P ( y | X ) ) = { log ( 1 + exp [ f ( x ) ] ) , y = 1 log ( 1 + exp [ f ( x ) ] ) , y = 1 F i n a l l y : L ( y , P ( y | X ) ) = log ( 1 + exp [ y f ( x ) ] )

这里初看不太容易理解,因为逻辑回归里 y { + 1 , 0 } ,之前都是根据 { 1 , 0 } 来计算的,其实逻辑还是很清晰的。
2. 回归算法
 a)均方差
L ( y , f ( x ) ) = ( y f ( x ) ) 2

 b)绝对损失
L ( y , f ( x ) ) = | y f ( x ) |

还有别的损失函数,不一一介绍了。可以参看 Pinard博客

4 GBDT分类算法

4.1 二元GBDT分类算法

  在二分类的GBDT中,有对数似然损失函数”deviance”和指数损失函数”exponential”两者输入选择。当损失函数为指数损失函数时,GBDT退化为Adaboost。Slearn中默认对数似然函数:

L ( y , f ( x ) ) = log ( 1 + exp [ y f ( x ) ] )

其中 y { + 1 , 0 }
1. 第 m 次迭代时:
 a)计算第 i 个样本负梯度
r m = [ L ( y , f ( x ) ) f ( x ) ] f ( x ) = f m 1 ( x ) = y exp [ y f ( x ) ] 1 + exp [ y f ( x ) ] = y 1 + exp [ y f ( x ) ]

PS:把 f m 1 ( x ) 作为整体求导,不知道数学上是否有相关定义,至少形式上貌似看得过去。真正计算似乎,看成 x 即可,具体不深究了。
r m i = y i 1 + exp [ y i f ( x i ) ]

 b)建立回归树
  利用样本 { ( x 1 , r m 1 ) , ( x 2 , r m 2 ) , . . . , ( x n , r m n ) } 训练CART回归树,记该决策树生成的第 j 叶子节点为 R m j ,各个叶子节点上最佳的残差拟合值为:
c m j = arg min c x i R m j log ( 1 + exp [ y i ( f m 1 ( x i ) + c ) ] )

这里的出处是 Pinard的博客,还是蛮奇怪,为什么不直接用CART回归树的预测结果(此处存疑,待查)。
上式很难优化一般用近似值代替:
c m j = x i R m j r m i x i R m j | r m i | ( 1 | r m i | )

由此第 m 个模型 G m ( x ) 可得
 c)权重确定
α m = arg min α i = 1 n L ( y i , f m 1 ( x i ) + α G m ( x ) )

后续的求解根据损失函数的定义,可以令关于 α 的偏导为0,求 α 即可。

5 正则化

  正则化部分主要参考刘建平的博客。有三种方式备选:
1. 步长 v (learning rate),取值范围为 [ 0 , 1 ] 。步长较小,则需要较大的迭代次数。如果设置这个参数,需要和迭代次数一次调参
2. 子采样比例(subsample),取值范围为 [ 0 , 1 ] ,Sklearn中有这个参数可选。另外这里的子采样是不放回抽样,如果为1,则全部样本都是使用;小于1,则部分样本做GBDT建模,小于1可以减少方差,但是增大了偏差。Whatever,这个调参真的是没头绪
3. 对CART回归树进行正则化剪枝,不赘

6 从梯度来看Adaboost

  上一节提了指数损失函数时,GBDT退化为Adaboost。SKlearn的源码并没有看得很懂,从理论上说Adaboost并不是直接拟合负梯度,这个问题纠结了蛮久,甚至在刘建平的博客下留言询问,以我自己的理解来说,Adaboost可以看做利用梯度信息的另外一种方式。
  如果追根溯源的讲,Adaboost刚开始提出时,并没有想到用梯度来解释。Breiman的Arcing classifier中,甚至比较多种权重更新的方式。大概讲讲Adaboost是怎么利用梯度信息的。

  1. 损失函数
    L ( y , f ( x ) ) = i = 1 n L ( y i , f m 1 ( x i ) ) = i = 1 n exp [ y i f m 1 ( x i ) ]
  2. Taylor展开式
      泰勒公式是将一个在 x = x 0 处具有 n 阶导数的函数 f ( x ) 利用关于 ( x x 0 ) n 次多项式来逼近函数的方法。
    若函数 f ( x ) 在包含 x 0 的某个闭区间 [ a , b ] 上具有 n 阶导数,且在开区间 ( a , b ) 上具有 ( n + 1 ) 阶导数,则对闭区间 [ a , b ] 上任意一点 x ,有下式成立:
    f ( x ) = f ( x 0 ) 0 ! + f ( x 0 ) 1 ! ( x x 0 ) + f ( x 0 ) 2 ! ( x x 0 ) 2 + + f ( n ) ( x 0 ) n ! ( x x 0 ) n + R n ( x )

    其中, f ( n ) ( x ) 表示 f ( x ) n 阶导数,等号后的多项式称为函数 f ( x ) x 0 处的泰勒展开式,剩余的 R n ( x ) 是泰勒公式的余项,是 ( x x 0 ) n 的高阶无穷小。
  3. f m 1 ( x ) 处Taylor展开
      做以下的类比:
    f ( x ) L x 0 f m 1 ( x ) Δ x x x 0 α m G m ( x )

    那么对于整个损失函数,在 f m 1 ( x ) 处进行 T a y l o r 展开,可得:
    L ( y , f ( x ) ) = i = 1 n exp { y f ( x ) } = L ( y , f m 1 ( x ) ) + L ( y , f ( x ) ) f ( x ) f ( x ) = f m 1 ( x ) ( f ( x ) f m 1 ( x ) ) i = 1 n exp { y i f m 1 ( x i ) } y i exp { y i f m 1 ( x i ) } α m G m ( x ) = i = 1 n y i α m G m ( x ) exp { y i f m 1 ( x i ) } s e t exp { y i f m 1 ( x i ) } a s w ¯ m i = i = 1 n y i α m G m ( x ) w ¯ m i
  4. 求解
    arg min G m i = 1 n y i α m G m ( x ) w ¯ m i = arg min G m i = 1 n α m w ¯ m i + 2 G m ( x i ) y i α m w ¯ m i = 2 G m ( x i ) y i α m w ¯ m i = G m ( x i ) y i α m w ¯ m i = i = 1 n α m w ¯ m i I ( G m ( x i ) y i )

    此时 w ¯ m i 缺少一个归一化因子,其余部分和Adaboost一致。

  

7 Summary

  问题汇总:
1. 加法模型的权重似乎没有了,和基函数整体做基分类器
2. 回归树拟合负梯度时候,最终的叶子节点预测值,又重新计算,这个要再确认一下
3. 拟合的回归树最后是预测梯度?那么实际叶节点应该也是预测负梯度,那么二分类中最后预测类别咋么预测?sign似乎没办法用
4. 为什么拟合负梯度解释的还是不够清晰
GBRT的优点:
1. 可以处理多类型的特征
2. 预测效果好
3. 泛化性能好


GBRT的缺点:
1. 难以并行,可扩展性差

                                          2018-05-24 于南京

猜你喜欢

转载自blog.csdn.net/wendaomudong_l2d4/article/details/80433900