前面介绍了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={(x1,y1),(x2,y2),...,(xn,yn)}
- 第
m
个分类器:
Gm
- 迭代次数or基分类器个数:
M
- 损失函数:
L
- 经过
m
轮迭代之后的家和分类器:
fm(x)=fm−1(x)+αmGm(x)=∑t=1mGt(x)
- 最终的分类器:
G(x)
2.2 算法逻辑
2.2.1 目标函数
算法的整体逻辑和Adaboost类似,简单的复习下加法模型和前向分步算法。加法模型是各个弱分类器线性加权的形式:
G(x)=∑m=1MαmGm(x)
记关于
f(x)
和样本
xi
的损失函数为
L(yi,f(xi))
,那么优化目标:
minα,γ∑i=1nL(yi,f(xi))
其中
α
为各个分类器的权重,
γ
为各个分类器的参数。
显然直接求解这么多参数很困难,前向分步算法每一轮迭代,只训练一个模型,换言之,在前向分步算法中,以迭代方式训练模型,而在每一次迭代中(e.g.第
m
轮),目标函数如下:
minαm,γm∑i=1nL(yi,fm−1(xi)+αmGm(x;γm))
2.2.2 求解
每一轮迭代的目标函数已有,那么下一步就是最小化损失函数,求解
Gm(x)
。先固定
αm
,求使得损失函数最小的
Gm(x)
即弱分类器的参数
γm
。损失函数最小化,容易想到梯度下降法,先回忆梯度下降的迭代方式:
xt+1=xt−α∂f∂x
其中
f
为目标函数,
α
为步长。
对照梯度下降算法,在求解
Gm
时,我们可以做如下类比:
f→∑i=1nL(yi,fm−1(xi))x→fm−1
那么:
fm(x)=fm−1−α∂∑i=1nL(yi,fm−1(xi))∂fm−1
即:
α=αm,Gm(x)=−∂∑i=1nL(yi,fm−1(xi))∂fm−1fm(x)=fm−1+αmGm(x)
并且这里的
αm
是这样设计的:
αm=argminα∑i=1nL⎛⎝⎜⎜⎜yi,fm−1(xi)−α∂∑i=1nL(yi,fm−1(xi))∂fm−1⎞⎠⎟⎟⎟
2.2.3 拟合负梯度
按照2.2.2节所述,每一轮迭代时直接求解损失函数的负梯度即可,为什么要拟合呢?训练模型的唯一目的是为了预测,而真正的预测
y
是不知道的,但是计算负梯度,即计算
Gm(x)
时,仍然需要
y
。所以需要换个思路,用已知训练中的
x,y
去计算负梯度,再用CART回归树拟合
x
和负梯度即可。这样一来,真正预测的时候,输出
x
,就可以得到一个负梯度的估计。虽然这个估计未必准确,但是从泛化角度来看,减少过拟合的风险。
那么,真正的基分类器OR加法模型中的基函数就不是负梯度,而是拟合负梯度的CART回归树。
3 损失函数
下面对损失函数做一个总结。
1. 分类算法
a)指数损失函数,表达式为
L(y,f(x))=exp[−yf(x)]
在Adaboost原理篇中提过,指数损失函数是符合直觉的,即判断正确,损失小,判断错误损失大。并且损失越小,判断正确的可信度越高。
b)对数损失函数,表达式为
L(y,f(x))=log(1+exp(−yf(x)))
对数损失函数要谈及逻辑回归,在逻辑回归中,目标函数是似然函数极大化,如果从损失角度看,就是负的似然函数最小化。具体逻辑如下:
Since:⎧⎩⎨P(y=1|X)=exp[f(x)]1+exp[f(x)]P(y=0|X)=11+exp[f(x)]Hence:L(y,P(y|X))=⎧⎩⎨−logexp[f(x)]1+exp[f(x)],y=1−log11+exp[f(x)],y=−1Simplify:L(y,P(y|X))={log(1+exp[−f(x)]),y=1log(1+exp[f(x)]),y=−1Finally:L(y,P(y|X))=log(1+exp[−yf(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[−yf(x)])
其中
y∈{+1,0}
1. 第
m
次迭代时:
a)计算第
i
个样本负梯度
rm=−[∂L(y,f(x))∂f(x)]f(x)=fm−1(x)=−−yexp[−yf(x)]1+exp[−yf(x)]=y1+exp[yf(x)]
PS:把
fm−1(x)
作为整体求导,不知道数学上是否有相关定义,至少形式上貌似看得过去。真正计算似乎,看成
x
即可,具体不深究了。
rmi=yi1+exp[yif(xi)]
b)建立回归树
利用样本
{(x1,rm1),(x2,rm2),...,(xn,rmn)}
训练CART回归树,记该决策树生成的第
j
叶子节点为
Rmj
,各个叶子节点上最佳的残差拟合值为:
cmj=argminc∑xi∈Rmjlog(1+exp[−yi(fm−1(xi)+c)])
这里的出处是
Pinard的博客,还是蛮奇怪,为什么不直接用CART回归树的预测结果(此处存疑,待查)。
上式很难优化一般用近似值代替:
cmj=∑xi∈Rmjrmi∑xi∈Rmj|rmi|(1−|rmi|)
由此第
m
个模型
Gm(x)
可得
c)权重确定
αm=argminα∑i=1nL(yi,fm−1(xi)+αGm(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是怎么利用梯度信息的。
- 损失函数
L(y,f(x))=∑i=1nL(yi,fm−1(xi))=∑i=1nexp[−yifm−1(xi)]
- Taylor展开式
泰勒公式是将一个在
x=x0
处具有
n
阶导数的函数
f(x)
利用关于
(x−x0)
的
n
次多项式来逼近函数的方法。
若函数
f(x)
在包含
x0
的某个闭区间
[a,b]
上具有
n
阶导数,且在开区间
(a,b)
上具有
(n+1)
阶导数,则对闭区间
[a,b]
上任意一点
x
,有下式成立:
f(x)=f(x0)0!+f′(x0)1!(x−x0)+f′′(x0)2!(x−x0)2+⋯+f(n)(x0)n!(x−x0)n+Rn(x)
其中,
f(n)(x)
表示
f(x)
的
n
阶导数,等号后的多项式称为函数
f(x)
在
x0
处的泰勒展开式,剩余的
Rn(x)
是泰勒公式的余项,是
(x−x0)n
的高阶无穷小。
- 在
fm−1(x)
处Taylor展开
做以下的类比:
f(x)→Lx0→fm−1(x)Δx→x−x0→αmGm(x)
那么对于整个损失函数,在
fm−1(x)
处进行
Taylor
展开,可得:
L(y,f(x))=∑i=1nexp{−yf(x)}=L(y,fm−1(x))+∂L(y,f(x))f(x)f(x)=fm−1(x)(f(x)−fm−1(x))≈∑i=1nexp{−yifm−1(xi)}−yiexp{−yifm−1(xi)}∗αmGm(x)=∑i=1n−yiαmGm(x)∗exp{−yifm−1(xi)}setexp{−yifm−1(xi)}asw¯mi=∑i=1n−yiαmGm(x)∗w¯mi
- 求解
argminGm∑i=1n−yiαmGm(x)∗w¯mi=argminGm∑i=1nαmw¯mi+2∑Gm(xi)≠yiαm∗w¯mi=2∑Gm(xi)≠yiαm∗w¯mi=∑Gm(xi)≠yiαm∗w¯mi=∑i=1nαm∗w¯miI(Gm(xi)≠yi)
此时
w¯mi
缺少一个归一化因子,其余部分和Adaboost一致。
7 Summary
问题汇总:
1. 加法模型的权重似乎没有了,和基函数整体做基分类器
2. 回归树拟合负梯度时候,最终的叶子节点预测值,又重新计算,这个要再确认一下
3. 拟合的回归树最后是预测梯度?那么实际叶节点应该也是预测负梯度,那么二分类中最后预测类别咋么预测?sign似乎没办法用
4. 为什么拟合负梯度解释的还是不够清晰
GBRT的优点:
1. 可以处理多类型的特征
2. 预测效果好
3. 泛化性能好
GBRT的缺点:
1. 难以并行,可扩展性差
2018-05-24 于南京