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 ) ) L(Y,f(x)) L(Y,f(x))看成整体, f ( x ) f(x) f(x)看成 x x x,利用梯度下降法的思想求解新的弱分类器,即目标是用 f ( x ) f(x) f(x)拟合负梯度。文字叙述略显繁杂,下面看算法框架

2. GBDT框架

2.1 符号标记

  • 训练集样本: T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } T =\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} T={(x1,y1),(x2,y2),...,(xn,yn)}
  • m m m个分类器: G m G_m Gm
  • 迭代次数or基分类器个数: M M M
  • 损失函数: L L L
  • 经过 m m m轮迭代之后的家和分类器: f m ( x ) = f m − 1 ( x ) + α m G m ( x ) = ∑ t = 1 m G t ( x ) {f_m}\left( x \right) = {f_{m - 1}}\left( x \right) + {\alpha _m}{G_m}\left( x \right) = \sum\limits_{t = 1}^m {{G_t}\left( x \right)} fm(x)=fm1(x)+αmGm(x)=t=1mGt(x)
  • 最终的分类器: G ( x ) G(x) G(x)

2.2 算法逻辑

2.2.1 目标函数

  算法的整体逻辑和Adaboost类似,简单的复习下加法模型和前向分步算法。加法模型是各个弱分类器线性加权的形式:
G ( x ) = ∑ m = 1 M α m G m ( x ) G\left( x \right) = \sum\limits_{m = 1}^M {{\alpha _m}{G_m}\left( x \right)} G(x)=m=1MαmGm(x)
记关于 f ( x ) f(x) f(x)和样本 x i x_i xi的损失函数为 L ( y i , f ( x i ) ) {L\left( {{y_i},f\left( {{x_i}} \right)} \right)} L(yi,f(xi)),那么优化目标:
min ⁡ α , γ ∑ i = 1 n L ( y i , f ( x i ) ) \mathop {\min }\limits_{\alpha ,\gamma } \sum\limits_{i = 1}^n {L\left( {{y_i},f\left( {{x_i}} \right)} \right)} α,γmini=1nL(yi,f(xi))
其中 α \alpha α为各个分类器的权重, γ \gamma γ为各个分类器的参数。
显然直接求解这么多参数很困难,前向分步算法每一轮迭代,只训练一个模型,换言之,在前向分步算法中,以迭代方式训练模型,而在每一次迭代中(e.g.第 m m m轮),目标函数如下:
min ⁡ α m , γ m ∑ i = 1 n L ( y i , f m − 1 ( x i ) + α m G m ( x ; γ m ) ) \mathop {\min }\limits_{{\alpha _m},{\gamma _m}} \sum\limits_{i = 1}^n {L\left( {{y_i},{f_{m - 1}}\left( {{x_i}} \right) + {\alpha _m}{G_m}\left( {x;{\gamma _m}} \right)} \right)} αm,γmmini=1nL(yi,fm1(xi)+αmGm(x;γm))

2.2.2 求解-从梯度下降的角度看

  每一轮迭代的目标函数已有,那么下一步就是最小化损失函数,求解 G m ( x ) G_m(x) Gm(x)。先固定 α m {\alpha}_m αm,求使得损失函数最小的 G m ( x ) G_m(x) Gm(x)即弱分类器的参数 γ m \gamma _m γm。损失函数最小化,容易想到梯度下降法,先回忆梯度下降的迭代方式:
θ t + 1 = θ t − α ∂ J ∂ θ {{\theta}_{t + 1}} = {\theta_t} - \alpha \frac{{\partial J}}{{\partial \theta}} θt+1=θtαθJ
其中 J J J为目标函数, α \alpha α为步长, θ \theta θ为待求解参数。
对照梯度下降算法,在求解 G m G_m Gm时,我们可以做如下类比:

J → ∑ i = 1 n L ( y i , f m − 1 ( x i ) ) θ → f m − 1 \begin{array}{l} J \to \sum\limits_{i = 1}^n {L\left( {{y_i},{f_{m - 1}}\left( {{x_i}} \right)} \right)} \\ {\theta} \to {f_{m - 1}} \end{array} Ji=1nL(yi,fm1(xi))θfm1

那么:
f m ( x ) = f m − 1 − α ∂ ∑ i = 1 n L ( y i , f m − 1 ( x i ) ) ∂ f f = f m − 1 { f_{ m } }\left( x \right) ={ f_{ m-1 } }-{ \alpha \frac { { \partial \sum _{ i=1 }^{ n }{ L\left( { { y_{ i } },{ f_{ m-1 } }\left( { { x_{ i } } } \right) } \right) } } }{ { \partial { f } } } }_{ f=f_{ m-1 } } fm(x)=fm1αfi=1nL(yi,fm1(xi))f=fm1
其中第二项为 f = f m − 1 f=f_{m-1} f=fm1时的偏导值

L ( y i , f m − 1 ( x i ) ) { L\left( { { y_{ i } },{ f_{ m-1 } } \left( { { x_{ i } } } \right) } \right) } L(yi,fm1(xi))

即:
α = α m , G m ( x ) = − ∂ ∑ i = 1 n L ( y i , f m − 1 ( x i ) ) ∂ f f = f m − 1 f m ( x ) = f m − 1 + α m G m ( x ) \begin{array}{l} \alpha ={ \alpha _{ m } }\quad ,\quad { G_{ m } }\left( x \right) =-{ \frac { { \partial \sum _{ i=1 }^{ n }{ L\left( { { y_{ i } },{ f_{ m-1 } } \left( { { x_{ i } } } \right) } \right) } } }{ { \partial { f } } } }_{ f=f_{ m-1 } } \\ { f_{ m } }\left( x \right) ={ f_{ m-1 } }+{ \alpha _{ m } }{ G_{ m } }\left( x \right) \end{array} α=αm,Gm(x)=fi=1nL(yi,fm1(xi))f=fm1fm(x)=fm1+αmGm(x)

这里要做部分说明,负梯度的求解涉及到 y y y,或者通俗(可能并不正确)地说,理想中的 G m ( x ) G_m(x) Gm(x)是一个由 x 、 y x、y xy决定。而在预测时,我们并不知道真实的 y y y,所以这里是用CART树去拟合负梯度。这样,在预测的时候,有 x x x,便能估计负梯度了。
上面解释说不通,对于损失函数来说,减小最快的方向一定是它的负梯度方向。只不过较于简单的梯度下降,这里相当于把参数空间扩展到函数空间
对于参数空间,每次更新参数 θ \theta θ,即向负梯度方向移动
对于函数空间,每次更新参数( 函数 f ( x ) 函数f(x) 函数f(x)),即拟合负梯度( G m ( x ) G_m(x) Gm(x))
f m − 1 ( x ) f_{m-1}(x) fm1(x)都是已知的,所以负梯度也可以求出来。用 G m ( x ) G_m(x) Gm(x)去拟合 { ( x 1 , g 1 ) , ( x 2 , g 2 ) , ( x 3 , g 3 ) . . . } \{(x1,g1),(x2,g2),(x3,g3)...\} {(x1,g1),(x2,g2),(x3,g3)...}

并且这里的 α m \alpha _m αm是这样设计的:
α m = min ⁡ α ∑ i = 1 n L ( y i , f m − 1 ( x i ) − α ∂ ∑ i = 1 n L ( y i , f m − 1 ( x i ) ) ∂ f f = f m − 1 ) { \alpha _{ m } }={ \min }_{ \alpha }\sum _{ i=1 }^{ n }{ L\left( { { y_{ i } },{ f_{ m-1 } }\left( { { x_{ i } } } \right) -\alpha { \frac { { \partial \sum _{ i=1 }^{ n }{ L\left( { { y_{ i } },{ f_{ m-1 } }\left( { { x_{ i } } } \right) } \right) } } }{ { \partial { f } } } }_{ f=f_{ m-1 } } } \right) } αm=minαi=1nL(yi,fm1(xi)αfi=1nL(yi,fm1(xi))f=fm1)

2.2.4 求解-从拟合残差的角度看

  从梯度下降的角度看,上述算法的逻辑还算顺畅。如果从拟合残差的角度看,怎么解释呢?
GBDT的一种通俗解释如下:
假如某个人28岁,我们首先用20岁去拟合,发现损失有8岁,这时我们用4岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
那么,直接拟合残差 y − y ^ y - \hat{y} yy^是符合逻辑的,至于为什么不直接拟合残差,有各种各样的说法。参见下一节2.2.5。GBDT最终是拟合负梯度,那么负梯度和残差有什么关系呢?尝试说明下。

先回忆下泰勒展开式:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ( 2 ) ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + o ( ( x − x 0 ) n ) f\left( x \right) =f\left( x_{ 0 } \right) +{ f }^{ \prime }\left( x_{ 0 } \right) \left( x-x_{ 0 } \right) +\frac { { f }^{ \left( 2 \right) }\left( x_{ 0 } \right) }{ 2! } { \left( x-x_{ 0 } \right) }^{ 2 }+\cdots +\frac { { f }^{ \left( n \right) }\left( x_{ 0 } \right) }{ n! } { \left( x-x_{ 0 } \right) }^{ n }+o\left( { \left( x-x_{ 0 } \right) }^{ n } \right) f(x)=f(x0)+f(x0)(xx0)+2!f(2)(x0)(xx0)2++n!f(n)(x0)(xx0)n+o((xx0)n)

对损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x)) f m − 1 f_{m-1} fm1处进行二阶 T a y l o r Taylor Taylor展开,其中 y y y已知:

L ( y , f ( x ) ) = L ( y , f m − 1 ( x ) ) + L ′ ( f m − 1 ( x ) ) [ f ( x ) − f m − 1 ( x ) ] + 1 2 L ′ ′ ( f m − 1 ( x ) ) [ f ( x ) − f m − 1 ( x ) ] 2 + o ( ( f ( x ) − f m − 1 ( x ) ) 2 ) L\left( y,f\left( x \right) \right) =L\left( y,f_{ m-1 }\left( x \right) \right) +{ L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) \left[ f\left( x \right) -f_{ m-1 }\left( x \right) \right] +\frac { 1 }{ 2 } { L }^{ \prime \prime }\left( f_{ m-1 }\left( x \right) \right) { \left[ f\left( x \right) -f_{ m-1 }\left( x \right) \right] }^{ 2 }+o\left( { \left( f\left( x \right) -f_{ m-1 }\left( x \right) \right) }^{ 2 } \right) L(y,f(x))=L(y,fm1(x))+L(fm1(x))[f(x)fm1(x)]+21L′′(fm1(x))[f(x)fm1(x)]2+o((f(x)fm1(x))2)

我们对残差的一般定义为 y − y ^ y - \hat{y} yy^,由上面的泰勒展开式可以看出,残差为:
L ′ ( f m − 1 ( x ) ) [ f ( x ) − f m − 1 ( x ) ] + 1 2 L ′ ′ ( f m − 1 ( x ) ) [ f ( x ) − f m − 1 ( x ) ] 2 + o ( ( f ( x ) − f m − 1 ( x ) ) 2 ) { L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) \left[ f\left( x \right) -f_{ m-1 }\left( x \right) \right] +\frac { 1 }{ 2 } { L }^{ \prime \prime }\left( f_{ m-1 }\left( x \right) \right) { \left[ f\left( x \right) -f_{ m-1 }\left( x \right) \right] }^{ 2 }+o\left( { \left( f\left( x \right) -f_{ m-1 }\left( x \right) \right) }^{ 2 } \right) L(fm1(x))[f(x)fm1(x)]+21L′′(fm1(x))[f(x)fm1(x)]2+o((f(x)fm1(x))2)
这里的高阶无穷小可以忽略,那么现在的残差最小化就转化为:
M i n L ′ ( f m − 1 ( x ) ) [ f ( x ) − f m − 1 ( x ) ] + 1 2 L ′ ′ ( f m − 1 ( x ) ) [ f ( x ) − f m − 1 ( x ) ] 2 Min\quad {L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) \left[ f\left( x \right) -f_{ m-1 }\left( x \right) \right] +\frac { 1 }{ 2 } { L }^{ \prime \prime }\left( f_{ m-1 }\left( x \right) \right) { \left[ f\left( x \right) -f_{ m-1 }\left( x \right) \right] }^{ 2 } MinL(fm1(x))[f(x)fm1(x)]+21L′′(fm1(x))[f(x)fm1(x)]2

上面这坨写的不对, y − y ^ y-\hat{y} yy^不是 L ( y , f m − 1 ( x ) ) L(y,f_{ m-1 }(x)) L(y,fm1(x))

这里的${ L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) 是已知的值, 是已知的值, 是已知的值,\left[ f\left( x \right) -f_{ m-1 }\left( x \right) \right] 则可以看作下一轮迭代要求的 则可以看作下一轮迭代要求的 则可以看作下一轮迭代要求的G_m(x)$。那么进一步改写:
M i n L ′ ( f m − 1 ( x ) ) G m ( x ) + 1 2 L ′ ′ ( f m − 1 ( x ) ) [ G m ( x ) ] 2 Min\quad { L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) G_{ m }\left( x \right) +\frac { 1 }{ 2 }{ L }^{ \prime \prime }\left( f_{ m-1 }\left( x \right) \right) { \left[ G_{ m }\left( x \right) \right] }^{ 2 } MinL(fm1(x))Gm(x)+21L′′(fm1(x))[Gm(x)]2

求极值的一般操作:令一阶导为0(必要不充分条件),求解目标参数:
L ′ ( f m − 1 ( x ) ) + L ′ ′ ( f m − 1 ( x ) ) G m ( x ) = 0 G m ( x ) = − L ′ ( f m − 1 ( x ) ) L ′ ′ ( f m − 1 ( x ) ) { L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) +{ L }^{ \prime \prime }\left( f_{ m-1 }\left( x \right) \right) G_{ m }\left( x \right) =0\\ G_{ m }\left( x \right) \quad =\quad -\frac { { L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) }{ { L }^{ \prime \prime }\left( f_{ m-1 }\left( x \right) \right) } L(fm1(x))+L′′(fm1(x))Gm(x)=0Gm(x)=L′′(fm1(x))L(fm1(x))

如果不考虑二阶信息,则$G_{ m }\left( x \right) =-{ L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) $
终于得到所谓的负梯度,同样的逻辑,负梯度中有 y y y,而预测时候 y y y未知,所以不是求负梯度而是拟合负梯度。

还是有一点小问题,直接不考虑二阶信息,那么目标函数就变成:
L ′ ( f m − 1 ( x ) ) G m ( x ) { L }^{ \prime }\left( f_{ m-1 }\left( x \right) \right) G_{ m }\left( x \right) L(fm1(x))Gm(x)

此时似乎并不能直接得到负梯度,另外一阶导为0时极值的必要不充分条件。但是可以简单的举个例子,尝试说明下。 x = [ 1 , 2 , − 3 ] x=[1,2,-3] x=[1,2,3] y = x f ( x ) y=xf(x) y=xf(x),那么使得 y y y较小的方式是 y = − x 2 y=-x^2 y=x2,即 f ( x ) = [ − 1 , − 2 , 3 ] f(x) = [-1,-2,3] f(x)=[1,2,3]。这样好像还是不直观,暂且这样吧。有想法再补充~

这一节在写个啥玩意,看在公式挺多的面子上,暂时保留

2.2.5 为什么不直接拟合残差

  用泰勒展开去近似残差,为什么不直接拟合残差呢?目前还是一头雾水,记录一些解释:

  1. 残差 y − y i y-y_i yyi容易受到异常值的影响
  2. 直接拟合残差可能造成过拟合
  3. 为了避免过拟合,损失函数会加上正则项,此时$y= \hat { y } $不一定能达到损失函数最小
  4. but有说法,xgboost直接拟合残差效果更好

3 损失函数

  下面对损失函数做一个总结。

  1. 分类算法
    和y的取值有关,下面以 y ∈ { − 1 , + 1 } y\in \{-1,+1\} y{1,+1}为例
     a)指数损失函数,表达式为
    L ( y , f ( x ) ) = exp ⁡ [ − y f ( x ) ] L\left( {y,f\left( x \right)} \right) = \exp \left[ { - yf\left( x \right)} \right] L(y,f(x))=exp[yf(x)]
    在Adaboost原理篇中提过,指数损失函数是符合直觉的,即判断正确,损失小,判断错误损失大。并且损失越小,判断正确的可信度越高。
     b)对数损失函数,表达式为
    L ( y , f ( x ) ) = log ⁡ ( 1 + exp ⁡ ( − y f ( x ) ) ) L\left( {y,f\left( x \right)} \right) = \log \left( {1 + \exp \left( { - yf\left( x \right)} \right)} \right) L(y,f(x))=log(1+exp(yf(x)))
    对数损失函数要谈及逻辑回归,在逻辑回归中,目标函数是似然函数极大化,如果从损失角度看,就是负的似然函数最小化。具体逻辑如下:
    $$
    \begin{array}{l}
    Since:\
    \left{ \begin{array}{l}
    P\left( {y = 1|X} \right) = \frac{{\exp \left[ {f\left( x \right)} \right]}}{{1 + \exp \left[ {f\left( x \right)} \right]}}\
    P\left( {y = -1|X} \right) = \frac{1}{{1 + \exp \left[ {f\left( x \right)} \right]}}
    \end{array} \right.\
    Hence:\
    L\left( {y,P\left( {y|X} \right)} \right) = \left{ \begin{array}{l}
  • \log \frac{{\exp \left[ {f\left( x \right)} \right]}}{{1 + \exp \left[ {f\left( x \right)} \right]}},;;y = 1\
  • \log \frac{1}{{1 + \exp \left[ {f\left( x \right)} \right]}},;;y = - 1
    \end{array} \right.\
    Simplify:\
    L\left( {y,P\left( {y|X} \right)} \right) = \left{ \begin{array}{l}
    \log \left( {1 + \exp \left[ { - f\left( x \right)} \right]} \right),;;y = 1\
    \log \left( {1 + \exp \left[ {f\left( x \right)} \right]} \right),;;y = - 1
    \end{array} \right.\
    Finally:\
    L\left( {y,P\left( {y|X} \right)} \right) = \log \left( {1 + \exp \left[ { - yf\left( x \right)} \right]} \right)
    \end{array}
    $$
    这里初看不太容易理解,因为此处 y ∈ { + 1 , − 1 } y \in \left\{ { + 1, -1} \right\} y{+1,1},之前逻辑回归里都是根据 { 1 , 0 } \{1,0\} {1,0}来计算的,其实逻辑还是很清晰的。
    第二步,hence那里,就是对概率取log,再取负,极大似然估计即使得当前样本出现的概率最大,损失函数需要最小化,所以取负,简化计算,所以取log
  1. 回归算法
     a)均方差
    L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L\left( {y,f\left( x \right)} \right) = {\left( {y - f\left( x \right)} \right)^2} L(y,f(x))=(yf(x))2
     b)绝对损失
    L ( y , f ( x ) ) = ∣ y − f ( x ) ∣ L\left( {y,f\left( x \right)} \right) = \left| {y - f\left( x \right)} \right| L(y,f(x))=yf(x)
    还有别的损失函数,不一一介绍了。可以参看Pinard博客

4 GBDT分类算法

4.1 二元GBDT分类算法

这里还是用sigmoid对概率值建模

{ P ( y = 1 ∣ X ) = exp ⁡ [ f ( x ) ] 1 + exp ⁡ [ f ( x ) ] P ( y = − 1 ∣ X ) = 1 1 + exp ⁡ [ f ( x ) ] \left\{ \begin{array}{l} P\left( {y = 1|X} \right) = \frac{{\exp \left[ {f\left( x \right)} \right]}}{{1 + \exp \left[ {f\left( x \right)} \right]}}\\ P\left( {y = -1|X} \right) = \frac{1}{{1 + \exp \left[ {f\left( x \right)} \right]}} \end{array} \right.\\ {P(y=1∣X)=1+exp[f(x)]exp[f(x)]P(y=1∣X)=1+exp[f(x)]1

  在二分类的GBDT中,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。当损失函数为指数损失函数时,GBDT退化为Adaboost。Slearn中默认对数似然函数:
L ( y , f ( x ) ) = log ⁡ ( 1 + exp ⁡ [ − y f ( x ) ] ) L\left( {y,f\left( x \right)} \right) = \log \left( {1 + \exp \left[ { - yf\left( x \right)} \right]} \right) L(y,f(x))=log(1+exp[yf(x)])
其中 y ∈ { + 1 , 0 } y \in \left\{ { + 1, 0} \right\} y{+1,0}

  1. m m m次迭代时:
     a)计算第 i i 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 ) ] \begin{array}{l} {r_m} = - {\left[ {\frac{{\partial L\left( {y,f\left( x \right)} \right)}}{{\partial f\left( x \right)}}} \right]_{f\left( x \right) = {f_{m - 1}}\left( x \right)}}\\ \;\;\;\; = - \frac{{ - y\exp \left[ { - yf\left( x \right)} \right]}}{{1 + \exp \left[ { - yf\left( x \right)} \right]}}\\ \;\;\;\; = \frac{y}{{1 + \exp \left[ {yf\left( x \right)} \right]}} \end{array} rm=[f(x)L(y,f(x))]f(x)=fm1(x)=1+exp[yf(x)]yexp[yf(x)]=1+exp[yf(x)]y
    PS:把 f m − 1 ( x ) f_{m-1}(x) fm1(x)作为整体求导,不知道数学上是否有相关定义,至少形式上貌似看得过去。真正计算似乎,看成 x x x即可,具体不深究了。
    没有问题,不就是复合函数求导吗?链式法则直接干就行
    r m i = y i 1 + exp ⁡ [ y i f ( x i ) ] {r_{mi}} = \frac{{{y_i}}}{{1 + \exp \left[ {{y_i}f\left( {{x_i}} \right)} \right]}} rmi=1+exp[yif(xi)]yi
     b)建立回归树
      利用样本 { ( x 1 , r m 1 ) , ( x 2 , r m 2 ) , . . . , ( x n , r m n ) } \{(x_1,r_{m1}),(x_2,r_{m2}),...,(x_n,r_{mn})\} {(x1,rm1),(x2,rm2),...,(xn,rmn)}训练CART回归树,记该决策树生成的第 j j j叶子节点为 R m j R_{mj} Rmj,各个叶子节点上最佳的残差拟合值为:
    c m j = arg ⁡    min ⁡ ⏟ c ∑ x i ∈ R m j log ⁡ ( 1 + exp ⁡ [ − y i ( f m − 1 ( x i ) + c ) ] ) {c_{mj}} = \underbrace {\arg \;\min }_c\sum\limits_{{x_i} \in {R_{mj}}} {\log \left( {1 + \exp \left[ { - {y_i}\left( {{f_{m - 1}}\left( {{x_i}} \right) + c} \right)} \right]} \right)} cmj=c argminxiRmjlog(1+exp[yi(fm1(xi)+c)])
    这里的出处是Pinard的博客,这里要注意,cart树建立之后,叶子节点预测值和原来定义的损失函数有关,和cart树的label无关!
    上式很难优化一般用近似值代替:
    c m j = ∑ x i ∈ R m j r m i ∑ x i ∈ R m j ∣ r m i ∣ ( 1 − ∣ r m i ∣ ) {c_{mj}} = \frac{{\sum\limits_{{x_i} \in {R_{mj}}} {{r_{mi}}} }}{{\sum\limits_{{x_i} \in {R_{mj}}} {\left| {{r_{mi}}} \right|\left( {1 - \left| {{r_{mi}}} \right|} \right)} }} cmj=xiRmjrmi(1rmi)xiRmjrmi
    由此第 m m m个模型 G m ( x ) G_m(x) Gm(x)可得
     c)权重确定
    α m = arg ⁡ min ⁡ α ∑ i = 1 n L ( y i , f m − 1 ( x i ) + α G m ( x ) ) {\alpha _m} = \arg \mathop {\min }\limits_\alpha \sum\limits_{i = 1}^n {L\left( {{y_i},{f_{m - 1}}\left( {{x_i}} \right) + \alpha {G_m}\left( x \right)} \right)} αm=argαmini=1nL(yi,fm1(xi)+αGm(x))
    后续的求解根据损失函数的定义,可以令关于 α \alpha α的偏导为0,求 α \alpha α即可。

预测时,对各步结果进行累计加权求和,最终需要通过sigmoid转换成0-1之间的值
注意,前期我们定义的 f ( x ) f(x) f(x)就是这里的 f ( x ) f(x) f(x),所以自然需要sigmoid转换

5 回归GBDT算法

回归和分类没啥差别,介绍下流程,来自pinard博客

输入是训练集样本 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } T=\{(x_1,y_1),(x_2,y_2),...(x_m,y_m)\} T={(x1,y1),(x2,y2),...(xm,ym)}, 最大迭代次数 T T T, 损失函数 L L L
输出是强学习器 f ( x ) f(x) f(x)

1)初始化弱学习器
f 0 ( x ) = arg ⁡ min ⁡ ⏟ c ∑ i = 1 m L ( y i , c ) f_{0}(x)=\underbrace{\arg \min }_{c} \sum_{i=1}^{m} L\left(y_{i}, c\right) f0(x)=c argmini=1mL(yi,c)

2)对迭代轮数 t = 1 , 2 , . . . T t=1,2,...T t=1,2,...T有:
 a)对样本 i = 1 , 2 , . . . m i=1,2,...m i=1,2...m,计算负梯度
r t i = − [ ∂ L ( y i , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) r_{t i}=-\left[\frac{\left.\partial L\left(y_{i}, f\left(x_{i}\right)\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{t-1}(x)} rti=[f(xi)L(yi,f(xi)))]f(x)=ft1(x)
 b)利用 ( x i , r t i ) ( i = 1 , 2 , . . m ) (x_i,r_{ti})(i=1,2,..m) (xi,rti)(i=1,2,..m), 拟合一颗CART回归树,得到第t颗回归树,其对应的叶子节点区域为 R t j , j = 1 , 2 , . . . , J R_{tj},j=1,2,...,J Rtj,j=1,2,...,J。其中 J J J为回归树t的叶子节点的个数。

 c) 对叶子区域 j = 1 , 2 , . . J j =1,2,..J j=1,2,..J,计算最佳拟合值
c t j = arg ⁡ min ⁡ ⏟ c ∑ x i ∈ R t j L ( y i , f t − 1 ( x i ) + c ) c_{tj}=\underbrace{\arg \min }_{c} \sum_{x_i \in R_{tj}} L\left(y_{i},f_{t-1}({x_i}) + c\right) ctj=c argminxiRtjL(yi,ft1(xi)+c)

 d)更新强学习器
f ( x ) = f T ( x ) = f 0 ( x ) + ∑ t = 1 T ∑ j = 1 J c t j I ( x ∈ R t j ) f(x)=f_T(x)=f_0(x)+\sum_{t=1}^{T}\sum_{j=1}^{J}c_{tj}I(x \in R_{tj}) f(x)=fT(x)=f0(x)+t=1Tj=1JctjI(xRtj)

这个流程和二分类差不多
cart树生成时,label为负梯度,叶子点预测值,看原始的损失函数
注意,这里的 f ( x ) f(x) f(x)即最终要求的,二分类则需要sigmoid

6 正则化

  正则化部分主要参考刘建平的博客。有三种方式备选:

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

7 从梯度来看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 ) ] \begin{array}{l} L\left( {y,f\left( x \right)} \right) = \sum\limits_{i = 1}^n {L\left( {{y_i},{f_{m - 1}}\left( {{x_i}} \right)} \right)} \\ = \sum\limits_{i = 1}^n {\exp \left[ { - {y_i}{f_{m - 1}}\left( {{x_i}} \right)} \right]} \end{array} L(y,f(x))=i=1nL(yi,fm1(xi))=i=1nexp[yifm1(xi)]
  2. Taylor展开式
      泰勒公式是将一个在 x = x 0 x=x_0 x=x0处具有 n n n阶导数的函数 f ( x ) f(x) f(x)利用关于 ( x − x 0 ) (x-x0) (xx0) n n n次多项式来逼近函数的方法。
    若函数 f ( x ) f(x) f(x)在包含 x 0 x_0 x0的某个闭区间 [ a , b ] [a,b] [a,b]上具有 n n n阶导数,且在开区间 ( a , b ) (a,b) (a,b)上具有 ( n + 1 ) (n+1) (n+1)阶导数,则对闭区间 [ a , b ] [a,b] [a,b]上任意一点 x x 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\left( x \right) = \frac{{f\left( {{x_0}} \right)}}{{0!}} + \frac{{f'\left( {{x_0}} \right)}}{{1!}}\left( {x - {x_0}} \right) + \frac{{f''\left( {{x_0}} \right)}}{{2!}}{\left( {x - {x_0}} \right)^2} + \cdots + \frac{{{f^{\left( n \right)}}\left( {{x_0}} \right)}}{{n!}}{\left( {x - {x_0}} \right)^n} + {R_n}\left( x \right) f(x)=0!f(x0)+1!f(x0)(xx0)+2!f′′(x0)(xx0)2++n!f(n)(x0)(xx0)n+Rn(x)
    其中, f ( n ) ( x ) f^{(n)}(x) f(n)(x)表示 f ( x ) f(x) f(x) n n n阶导数,等号后的多项式称为函数 f ( x ) f(x) f(x) x 0 x_0 x0处的泰勒展开式,剩余的 R n ( x ) Rn(x) Rn(x)是泰勒公式的余项,是 ( x − x 0 ) n (x-x_0)^n (xx0)n的高阶无穷小。
  3. f m − 1 ( x ) f_{m-1}(x) fm1(x)处Taylor展开
      做以下的类比:
    f ( x ) → L x 0 → f m − 1 ( x ) Δ x → x − x 0 → α m G m ( x ) \begin{array}{l} f\left( x \right) \to L\\ {x_0} \to {f_{m - 1}}\left( x \right)\\ \Delta x \to x - {x_0} \to {\alpha _m}{G_m}\left( x \right) \end{array} f(x)Lx0fm1(x)Δxxx0αmGm(x)
    那么对于整个损失函数,在 f m − 1 ( x ) f_{m-1}(x) fm1(x)处进行 T a y l o r Taylor Taylor展开,可得:
    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 \begin{array}{l} L\left( {y,f\left( x \right)} \right) = \sum\limits_{i = 1}^n {\exp \left\{ { - yf\left( x \right)} \right\}} \\ = L\left( {y,{f_{m - 1}}\left( x \right)} \right) + {\frac{{\partial L\left( {y,f\left( x \right)} \right)}}{{f\left( x \right)}}_{f\left( x \right) = {f_{m - 1}}\left( x \right)}}\left( {f\left( x \right) - {f_{m - 1}}\left( x \right)} \right)\\ \approx \sum\limits_{i = 1}^n {\exp \left\{ { - {y_i}{f_{m - 1}}\left( {{x_i}} \right)} \right\}} - {y_i}\exp \left\{ { - {y_i}{f_{m - 1}}\left( {{x_i}} \right)} \right\} * {\alpha _m}{G_m}\left( x \right)\\ = \sum\limits_{i = 1}^n { - {y_i}{\alpha _m}{G_m}\left( x \right) * \exp \left\{ { - {y_i}{f_{m - 1}}\left( {{x_i}} \right)} \right\}} \\ set\;\exp \left\{ { - {y_i}{f_{m - 1}}\left( {{x_i}} \right)} \right\}\;as\;{{\bar w}_{mi}}\\ = \sum\limits_{i = 1}^n { - {y_i}{\alpha _m}{G_m}\left( x \right) * {{\bar w}_{mi}}} \end{array} L(y,f(x))=i=1nexp{yf(x)}=L(y,fm1(x))+f(x)L(y,f(x))f(x)=fm1(x)(f(x)fm1(x))i=1nexp{yifm1(xi)}yiexp{yifm1(xi)}αmGm(x)=i=1nyiαmGm(x)exp{yifm1(xi)}setexp{yifm1(xi)}aswˉmi=i=1nyiαmGm(x)wˉmi
  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 ) \begin{array}{l} \arg \mathop {\min }\limits_{{G_m}} \sum\limits_{i = 1}^n { - {y_i}{\alpha _m}{G_m}\left( x \right) * {{\bar w}_{mi}}} \\ = \arg \mathop {\min }\limits_{{G_m}} \sum\limits_{i = 1}^n {{\alpha _m}{{\bar w}_{mi}}} + 2\sum\limits_{{G_m}\left( {{x_i}} \right) \ne {y_i}} {{\alpha _m} * {{\bar w}_{mi}}} \\ = 2\sum\limits_{{G_m}\left( {{x_i}} \right) \ne {y_i}} {{\alpha _m} * {{\bar w}_{mi}}} \\ = \sum\limits_{{G_m}\left( {{x_i}} \right) \ne {y_i}} {{\alpha _m} * {{\bar w}_{mi}}} = \sum\limits_{i = 1}^n {{\alpha _m} * {{\bar w}_{mi}}I\left( {{G_m}\left( {{x_i}} \right) \ne {y_i}} \right)} \end{array} argGmmini=1nyiαmGm(x)wˉmi=argGmmini=1nαmwˉmi+2Gm(xi)=yiαmwˉmi=2Gm(xi)=yiαmwˉmi=Gm(xi)=yiαmwˉmi=i=1nαmwˉmiI(Gm(xi)=yi)
    此时 w ˉ m i {{{\bar w}_{mi}}} wˉmi缺少一个归一化因子,其余部分和Adaboost一致。

  

8 Summary

  问题汇总:

  1. 加法模型的权重似乎没有了,和基函数整体做基分类器
  2. 回归树拟合负梯度时候,最终的叶子节点预测值,又重新计算,这个要再确认一下(尽管可以认为最终目的是拟合目标函数,并不是负梯度)(负梯度是用来生成决策树的,叶子结点预测值使得目标函数最小)
  3. 拟合的回归树最后是预测梯度?那么实际叶节点应该也是预测负梯度,那么二分类中最后预测类别咋么预测?sigmoid似乎没办法用(分类里的f(x)就是要做sigmoid转换的)

GBRT的优点:

  1. 可以处理多类型的特征
  2. 预测效果好
  3. 泛化性能好

GBRT的缺点:

  1. 难以并行,可扩展性差

                                                2018-05-24 于南京
                                                2023-03-26 update于南京

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GBDT是梯度提升决策树(Gradient Boosting Decision Tree)的缩写,它是一种集成学习算法GBDT原理可以通过以下几个要素来理解:梯度提升(GB)、回归树(DT)和缩减(Shrinkage)。 首先,梯度提升是指通过迭代的方式逐步优化模型的预测结果。每一次迭代都会根据前一次迭代的残差来训练一个新的回归树,然后将新的回归树加到模型中,以降低残差的平方和。通过这种方式,梯度提升逐步逼近最优解。 其次,回归树是GBDT中的基础模型,用于建立预测模型。回归树将数据集划分为多个区域,并对每个区域进行预测。在GBDT中,每个回归树都是在前一次迭代的基础上构建的,它的目标是最小化目标函数的损失。 最后,缩减是指通过缩小每次迭代的步长来降低模型的复杂度。缩减可以有效减少模型的过拟合程度,并提高模型的泛化能力。 通过以上的原理解析,可以看出,GBDT通过不断迭代和加权的方式来逐步逼近最优解,通过组合多个回归树来建立预测模型。同时,通过缩减步长可以控制模型的复杂度和过拟合程度。这使得GBDT在分类和回归问题中都具有良好的应用效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [大白话GBDT算法-通俗理解GBDT原理](https://download.csdn.net/download/weixin_27153203/19761867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [GBDT原理](https://blog.csdn.net/Grateful_Dead424/article/details/122699437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值