前面介绍了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)=fm−1(x)+αmGm(x)=t=1∑mGt(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=1∑Mα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=1∑nL(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=1∑nL(yi,fm−1(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} J→i=1∑nL(yi,fm−1(xi))θ→fm−1
那么:
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)=fm−1−α∂f∂∑i=1nL(yi,fm−1(xi))f=fm−1
其中第二项为
f
=
f
m
−
1
f=f_{m-1}
f=fm−1时的偏导值
L ( y i , f m − 1 ( x i ) ) { L\left( { { y_{ i } },{ f_{ m-1 } } \left( { { x_{ i } } } \right) } \right) } L(yi,fm−1(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)=−∂f∂∑i=1nL(yi,fm−1(xi))f=fm−1fm(x)=fm−1+αmGm(x)
这里要做部分说明,负梯度的求解涉及到
y
y
y,或者通俗(可能并不正确)地说,理想中的
G
m
(
x
)
G_m(x)
Gm(x)是一个由
x
、
y
x、y
x、y决定。而在预测时,我们并不知道真实的
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)
fm−1(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=1∑nL(yi,fm−1(xi)−α∂f∂∑i=1nL(yi,fm−1(xi))f=fm−1)
2.2.4 求解-从拟合残差的角度看
从梯度下降的角度看,上述算法的逻辑还算顺畅。如果从拟合残差的角度看,怎么解释呢?
GBDT的一种通俗解释如下:
假如某个人28岁,我们首先用20岁去拟合,发现损失有8岁,这时我们用4岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
那么,直接拟合残差
y
−
y
^
y - \hat{y}
y−y^是符合逻辑的,至于为什么不直接拟合残差,有各种各样的说法。参见下一节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)(x−x0)+2!f(2)(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+o((x−x0)n)
对损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))在 f m − 1 f_{m-1} fm−1处进行二阶 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,fm−1(x))+L′(fm−1(x))[f(x)−fm−1(x)]+21L′′(fm−1(x))[f(x)−fm−1(x)]2+o((f(x)−fm−1(x))2)
我们对残差的一般定义为
y
−
y
^
y - \hat{y}
y−y^,由上面的泰勒展开式可以看出,残差为:
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′(fm−1(x))[f(x)−fm−1(x)]+21L′′(fm−1(x))[f(x)−fm−1(x)]2+o((f(x)−fm−1(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′(fm−1(x))[f(x)−fm−1(x)]+21L′′(fm−1(x))[f(x)−fm−1(x)]2
上面这坨写的不对, y − y ^ y-\hat{y} y−y^不是 L ( y , f m − 1 ( x ) ) L(y,f_{ m-1 }(x)) L(y,fm−1(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′(fm−1(x))Gm(x)+21L′′(fm−1(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′(fm−1(x))+L′′(fm−1(x))Gm(x)=0Gm(x)=−L′′(fm−1(x))L′(fm−1(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′(fm−1(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 为什么不直接拟合残差
用泰勒展开去近似残差,为什么不直接拟合残差呢?目前还是一头雾水,记录一些解释:
- 残差 y − y i y-y_i y−yi容易受到异常值的影响
- 直接拟合残差可能造成过拟合
- 为了避免过拟合,损失函数会加上正则项,此时$y= \hat { y } $不一定能达到损失函数最小
- but有说法,xgboost直接拟合残差效果更好
3 损失函数
下面对损失函数做一个总结。
- 分类算法
和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
- 回归算法
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))=(y−f(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))=∣y−f(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}
- 第
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)=fm−1(x)=−1+exp[−yf(x)]−yexp[−yf(x)]=1+exp[yf(x)]y
PS:把 f m − 1 ( x ) f_{m-1}(x) fm−1(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 argminxi∈Rmj∑log(1+exp[−yi(fm−1(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=xi∈Rmj∑∣rmi∣(1−∣rmi∣)xi∈Rmj∑rmi
由此第 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=1∑nL(yi,fm−1(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=1∑mL(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)=ft−1(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
argminxi∈Rtj∑L(yi,ft−1(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=1∑Tj=1∑JctjI(x∈Rtj)
这个流程和二分类差不多
cart树生成时,label为负梯度,叶子点预测值,看原始的损失函数
注意,这里的
f
(
x
)
f(x)
f(x)即最终要求的,二分类则需要sigmoid
6 正则化
正则化部分主要参考刘建平的博客。有三种方式备选:
- 步长 v v v(learning rate),取值范围为 [ 0 , 1 ] [0,1] [0,1]。步长较小,则需要较大的迭代次数。如果设置这个参数,需要和迭代次数一次调参
- 子采样比例(subsample),取值范围为 [ 0 , 1 ] [0,1] [0,1],Sklearn中有这个参数可选。另外这里的子采样是不放回抽样,如果为1,则全部样本都是使用;小于1,则部分样本做GBDT建模,小于1可以减少方差,但是增大了偏差。Whatever,这个调参真的是没头绪
- 对CART回归树进行正则化剪枝,不赘//这里好像是后剪枝,xgb是生成时候就做剪枝操作
7 从梯度来看Adaboost
上一节提了指数损失函数时,GBDT退化为Adaboost。SKlearn的源码并没有看得很懂,从理论上说Adaboost并不是直接拟合负梯度,这个问题纠结了蛮久,甚至在刘建平的博客下留言询问,以我自己的理解来说,Adaboost可以看做利用梯度信息的另外一种方式。
如果追根溯源的讲,Adaboost刚开始提出时,并没有想到用梯度来解释。Breiman的Arcing classifier中,甚至比较多种权重更新的方式。大概讲讲Adaboost是怎么利用梯度信息的。
- 损失函数
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=1∑nL(yi,fm−1(xi))=i=1∑nexp[−yifm−1(xi)] - Taylor展开式
泰勒公式是将一个在 x = x 0 x=x_0 x=x0处具有 n n n阶导数的函数 f ( x ) f(x) f(x)利用关于 ( x − x 0 ) (x-x0) (x−x0)的 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)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)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 (x−x0)n的高阶无穷小。 - 在
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(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)→Lx0→fm−1(x)Δx→x−x0→αmGm(x)
那么对于整个损失函数,在 f m − 1 ( x ) f_{m-1}(x) fm−1(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=1∑nexp{−yf(x)}=L(y,fm−1(x))+f(x)∂L(y,f(x))f(x)=fm−1(x)(f(x)−fm−1(x))≈i=1∑nexp{−yifm−1(xi)}−yiexp{−yifm−1(xi)}∗αmGm(x)=i=1∑n−yiαmGm(x)∗exp{−yifm−1(xi)}setexp{−yifm−1(xi)}aswˉmi=i=1∑n−yiαmGm(x)∗wˉmi - 求解
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=1∑n−yiαmGm(x)∗wˉmi=argGmmini=1∑nαmwˉmi+2Gm(xi)=yi∑αm∗wˉmi=2Gm(xi)=yi∑αm∗wˉmi=Gm(xi)=yi∑αm∗wˉmi=i=1∑nαm∗wˉmiI(Gm(xi)=yi)
此时 w ˉ m i {{{\bar w}_{mi}}} wˉmi缺少一个归一化因子,其余部分和Adaboost一致。
8 Summary
问题汇总:
- 加法模型的权重似乎没有了,和基函数整体做基分类器
- 回归树拟合负梯度时候,最终的叶子节点预测值,又重新计算,这个要再确认一下(尽管可以认为最终目的是拟合目标函数,并不是负梯度)(负梯度是用来生成决策树的,叶子结点预测值使得目标函数最小)
- 拟合的回归树最后是预测梯度?那么实际叶节点应该也是预测负梯度,那么二分类中最后预测类别咋么预测?sigmoid似乎没办法用(分类里的f(x)就是要做sigmoid转换的)
GBRT的优点:
- 可以处理多类型的特征
- 预测效果好
- 泛化性能好
GBRT的缺点:
- 难以并行,可扩展性差
2018-05-24 于南京
2023-03-26 update于南京