Boosting算法的思想和随机森林的思想是不同的,随机森林中的每棵树都是一个强分类器(树的深度比较深),那么这样偏差就会小得多,方差就会大的多,为了降低方差,随机森林设计了多棵树,每棵树的样本都是通过重抽样的方式获得,这样相当于综合了数据总体的多个样本进行训练,可以有效的降低方差,这样在测试集中才可以得到较好的效果。Boosting的思想是设计多个弱分类器,弱分类的特点就在于偏差过大,因此需要后续的分类器针对前面的分类器进行修正,将偏差变小。
1.模型的描述
假设我们希望预测的变量为Y,相关变量为X,我们希望得到一个模型F(X),对Y进行预测,即
Y^=F(X)
同时分类问题最终是需要得到一个类别,因此
F(X)=sign(f(X))
针对回归问题,我们直接使用
F(X)=f(X)
模型的训练都需要有一个Loss function 用于衡量Y^和Y之间的差异,模型训练的目的就在于最小化这个差异 ,即
minfL(Y,f(X))
写成带有样本的形式,即
minf∑iL(Yi,f(Xi))(1)
Boosting算法的目的就是为了寻找M个的弱分类器f1,...fM作用在样本上,然后将所有的弱分类的结果组合起来,也就是
f(x)=∑m=1Mαmfm(X)
于是公式(1)变成
minαm,fm∑iL(Yi,∑m=1Mαmfm(X))
采用如下的算法进行求解
Algorithm1
- 令f0(X)=0
-
form=1,...M
-
{αm,γm}=argminα,γ∑iL(Yi,fm−1(Xi)+αG(Xi;γ))
- 令fm(X)=fm−1(X)+αmG(X;γm)
-
endfor
最终F(X)=sign(fM(X)),通过fM的正负号来判断是否是正例,还是负例。
2.Loss function的选择
针对回归问题来说,我们容易想到使用均方误差作为损失函数,即
L(Y,f(X))=(Y−f(X))2
针对分类问题,我们令Y∈{−1,1},我们首先想到的是误判率作为损失函数 , 即
L(Y,f(X))=I(Y≠sign(f(X)))
但是通常不使用误判率作为损失函数.
那么针对分类问题的话,使用如下两种损失函数
L(Y,f(X))=exp(−Yf(X))
L(Y,f(X))=log(1+e−2Yf(X))
第一个表示指数型损失函数,第二个表示二项似然损失函数
第一个指数型损失函数到底表示什么意思 ???我们通过如下的推导过程来说明
我们的目的是最小化损失函数,即
minf(X)EY|X(e−Yf(X))(3)
我们用P(Y=1|X)表示Y取1的概率,P(Y=−1|X)表示Y取-1的概率 ,那么(3)等价于
minf(X)P(Y=1|X)e−f(X)+P(Y=−1|X)ef(X)
从而可以求解出
f∗(X)=12logP(Y=1|X)P(Y=−1|X)
所以我们最终是针对P(Y=1|X)的log-odds的估计,也就是说如果 f∗(X)>0的话,即
P(Y=1|X)>P(Y=−1|X)
我们预测为正例,否则预测为负例。
其实最开始我们的目的就在于解决P(Y=1|X)和P(Y=−1|X)谁大谁小的问题,我们需要一个对log-odds的估计
第二个二项似然损失函数又是如何来的????
我们假设
p(X)=P(Y=1|X)=11+e−2f(X)
然后我们令Y′=(Y+1)/2 ,那么二项负似然损失函数为
L(Y,p(X))=−(Y′logp(X)+(1−Y′)log(1−p(X)))
等价的也就是
log(1+e−2Yf(X))
其实这两个损失函数都是在对P(Y=1|X)的log-odds进行估计,从而选择概率大的那个类为预测类。
那么是否可以使用均方误差作为分类问题的损失函数, 和指数型损失函数一样,我们首先看一下最小化均方误差函数等价于对哪个值的估计
f∗(X)=argminf(X)EY|X(Y−f(X))2=E(Y|X)=2P(Y=1|X)−1
然后通过f∗(X)的正负号进行判断是正例还是负例.如果YF(X)>0 ,也就是准确预测出类别,同时F(X)越大,对应的误差应该越小,但是均方误差却是越大的。这便是均方误差不适于用作分类的loss function。
指数型损失函数和二项负似然函数便是随着YF(X)的增大而减小。
如同回归中均方误差和绝对值误差的区别,即绝对值误差更加稳健,受离群点的影响较小,二项负似然损失同样受离群点的影响较小。而指数型损失函数由于当YF(X)<0时是指数型惩罚,因此受到离群点的影响更大。
弱分类器的选择(boosted Tree)
通常情况下,我们会使用决策树作为弱分类器,原因是决策树便于实现,能够灵活的处理不同类型的数据。(数值型数据,符号型数据)。那么首先我们需要确认使用决策树需要哪些参数。决策树的本质是将自变量空间划分成K不相交的区块Rj(j∈1,...K),然后在每个区块中给定一个值γj(j∈1,...K),如果一条记录落入改区块中,那么它的取值就是γj,我们把决策树弱分类器记为
T(X;Θ)
其中Θ=Rj,γj,j∈{1,2...,K}
那么根据algorithm 1,我们需要求解
argminΘ∑iL(Yi,fm−1(Xi)+Tm(Xi;Θ))(4)
根据不同的损失函数,有不同的求解方法。
1.均方误差
公式(4)将会转换成
argminΘ∑i(Yi−fm−1(Xi)−Tm(Xi;Θ)))2
那么这就相当于拟合一棵决策树,目标值为Yi−fm−1(Xi),这是比较容易实现的
2.指数型损失函数
公式(4)将会转换成
argminΘ∑iexp(−Yi∗(fm−1(Xi)+Tm(Xi;Θ)))
也就是
argminΘ∑iexp(−Yifm−1(Xi))exp(−YiTm(Xi;Θ)))
这个相当于拟合一个加权的决策树,目标值为Yi,样本中的每条记录权重为exp(−Yifm−1(Xi))
这个也是容易实现的
3. 二项负似然损失函数
公式(4)将会转换成
argminΘ∑ilog(1+exp(−2Yi∗(fm−1(Xi)+Tm(Xi;Θ)))
这里就存在一个问题我去拟合一棵树,目标值是什么,这便是二项负似然损失函数的局限的地方,也是algorithm 1局限的地方。
其实还有很多的损失函数都会存在这样的问题。那么这时候就提出了gradientBoosting从而来适应多种损失函数。
(该部分存在疑问,我并没有解释清楚)
gradientBoosting
现在需要重新计算公式(1),我们并不是直接寻找一个弱分类器对当前的拟合值进行提升。而是通过最速下降法来求解。假设目前是第m轮循环,第m-1轮已经确认N个样本点对应的拟合值为{fm−1(X1),fm−1(XN)},那么我们通过
rmi=−[∂L(yi,f(Xi))∂f(Xi)]f(Xi)=fm−1(Xi)
求偏导的方式确定负梯度值,我们记为gmi, 然后确定步长
ρm=argminρ∑i=1NL(yi,fm−1+ρrmi)
从而得到更新
fm=fm−1−ρmgm
其中fm表示一个N维向量.
但是问题是这样得到的fm在测试集上是无法使用的,它只是在训练集上确定了梯度值,那么我们能不能使用训练集的梯度值来估计测试集的梯度值呢?问题就是这样解决的,在每一次求得N个训练集的样本的梯度之后,拟合以一棵回归树用来估计测试集的梯度,这时候选择的便是使用均方误差损失函数来拟合梯度。
所以算法过程如下 :
algorithm2
1.Initialize f0(X)=argminγ∑Ni=1L(Yi,γ)
2. For m=1 to M
(a) For i=1,2,3…N compute
rmi=−[∂L(yi,f(Xi))∂f(Xi)]f=fm−1
(b)Fit a regression tree to the target rim giving terminal regions Rjm,j=1,...Jm ,that is
θm=argminθ∑i=1N[rmi−T(Xi;θ)]2
(c) calculate step length :
ρm=argminρ∑i=1NL(Yi,fm−1−ρT(Xi,θm))
(d) Update fm(Xi)=fm−1(Xi)+ρmT(Xi;θm)
3.Output fM(X)
等价于如下算法

4.常见boosting算法
如果说loss function为均方误差 ,即L(y,f)=1/2(y−f)2,那么
∂L(y,f)∂f=y−f
那么可以得到如下算法
algorithm3(LS_Boost)
f0(x)=y¯ –初始化
For m=1 to M do :
yi~=yi−fm−1(Xi),i=1,...N
{Rjm}J1=J−terminalnodetree(yi~,XiN1)
γjm=1|Rjm|∑xi∈Rjmyi~,j=1,...,J //叶子节点的取值
fm(X)=fm−1(X)+∑Jj=1γjm1X∈Rjm
End For
如果loss function 为LAD (Least absolute deviation),即L(y,f)=|y−f| ,那么
∂L(y,f)∂f=sign(y−f)
algorithm4(LAD_TreeBoost)
f0(x)=median{yi}N1 –初始化
For m=1 to M do :
yi~=sign(yi−fm−1(Xi)),i=1,...N
{Rjm}J1=J−terminalnodetree(yi~,XiN1)
γjm=medianXi∈Rjmyi~,j=1,...,J //叶子节点的取值
fm(X)=fm−1(X)+∑Jj=1γjm1X∈Rjm
End For
如果使用的loss function 是Huber loss funcation ,也就是
L(y,F)={12(y−f)2δ(|y−f|−δ/2)|y−f|<=δ|y−f|>δ
当|y−f|<δ时,便是军方误差,当|y−f|>δ时,为了保证在|y−f|=δ处的一阶导数和函数值相同,并且降低利群点对模型的影响。使用δ(|y−f|−δ/2).
这样
∂L(y,f)∂f={y−fδ∗sign(y−f)|y−f|<=δ|y−f|>δ
这里涉及到两个问题
1. δ的选择,其实它就是确定离群点的位置,在第m轮迭代时,我们可以使用δm=quantileα|yi−fm(Xi)|N1 ,例如可以选择75%分位数。
2. 在第m次迭代时,叶节点的预测值确定,这个无法像均方误差,或者是绝对值误差那样有显性解,需要进行估计,具体估计方式后续补上在这里只给出结果
给出相应的算法
Algorithm 5 M _ TreeBoost
f0(x)=medianyiN1
For m=1 to M do :
rm−1(Xi)=yi−fm−1(xi),i=1,...,N
δm=quantileα|rm−1(Xi)|N1
calculate derivative yi~
yi~={rm−1(Xi)δm∗sign(rm−1(Xi))|rm−1(Xi)|<=δm|rm−1(Xi)|>δm
{Rjm}J1=J−terminalnodetree{yi~,Xi}N1
r~jm=medianXi∈Rjm{rm−1(Xi)},j=1,...J
γjm=r~jm+1Njm∑Xi∈Rjmsign(rm−1(Xi)−t~jm)∗min(δm,abs(rm−1(Xi)−r~jm)),j=1,...,J
fm(X)=fm−1(X)+∑Jj=1γjm1(X∈Rjm)
end For
如果loss function 是负二项对数似然损失,也就是
L(y,f)=log(1+exp(−2yf)),y∈{−1,1}
需要注意的是在叶节点的值确定时,使用了单步的 Newton-Raphson估计,也就是在求
minγ1N∑i=1Nlog(1+exp(−2yi(fm−1(Xi)+γ))
其实是没有解析解的,因此使用了初始化γ0=0,然后进行了一步的Newton_Raphson法,估算出了γjm ,简单说就是
γjm=γ0−∂G/∂γ|γ=γ0∂2G/∂γ2|γ=γ0
其中
G(γ)=1N∑i=1Nlog(1+exp(−2yi(fm−1(Xi)+γ))
我们可以得到如下算法 :
Algorithm 6 (L_K - TreeBoost)
f0(X)=12log1+y¯1−y¯
For m=1,…,M :
y~i=2∗yi/(1+exp(2yifm−1(Xi))),i=1,...,N
{Rjm}J1=J−terminalnodetree({yi~,Xi}N1)
γjm=∑Xi∈Rjmy~i/∑Xi∈Rjm|y~i|(2−|y~i|),j=1,...,J
Fm(X)=Fm−1(X)+∑Jj=1γjm1(X∈Rjm)
end For
如果是多分类逻辑回归和分类,这时候y的取值已经不再是{-1,1},所以需要重新确定loss function
L({yk,fk(X)K1})=−∑k=1Kyklogpk(X)
这里需要注意的是针对K个类,都有一个fk(X)与之对应,而fk与pk之间的关系如下:
fk(X)=logpk(X)−1/K∑l=1
或者
pk(X)=exp(Fk(X))/∑l=1Kexp(Fl(X))
另外yk∈{0,1}
那么
y~k=−[∂L({yk,Fk(X)}K1)∂Fk(Xi)]{Fk(x)=Fk,m−1(X)}K1=yk−Pk,m−1(X)
其中
Pk,m−1(X)=exp(fk,m−1(X))/∑l=1Kexp(Fl,m−1(X))
Fk0(X)=0,k=1,...,K
For m=1 to M :
pk(X)=exp(Fk(X))/∑Kl=1exp(Fl(X)),k=1,...K
For k=1,…, K
y~ik=yik−pk(Xi),i=1,...,N
{Rjkm}Jj=1=J−terminalnodenodetree({y~ik,Xi}N1)
γjkm=K−1K∑xi∈Rjkmy~ik∑Xi∈Rjkm|y~ik|(1−|y~ik|)
Fkm(X)=Ff,m−1(X)+∑Jj=1γjkm1(X∈Rjkm)
end For
5.xgboost
xgboost是在gradient boosting 的基础上进行改进,并且实现了并行化,提高了运算效率 ,更加利于工程学上的使用。
这里只介绍xgboost的原理,针对它的工程学上的实现细节不多做介绍.
我们知道在Gradient boost中需要通过梯度下降的方法来获得一个对树模型的拟合,但是xgboost并不采用梯度下降的方法,而是对损失函数做了二次泰勒展开逼近,从而简化了树模型拟合过程。
首先 在第m次迭代时,我们的目的是
minΘ∑iL(Yi,fm−1(Xi)+Tm(Xi;Θ))
xgboost对L(Y,F)做了二次泰勒展开
minΘ∑iL(Yi,fm−1(Xi))+qmTm(Xi;Θ)+1/2hmT2m(Xi;Θ)(5)
其中qm=[∂L(Yi,f(Xi))∂f(Xi)]f(Xi)=fm−1(Xi)
hm=[∂2L(Yi,f(Xi))∂f(Xi)2]f(Xi)=fm−1(Xi)
xgboost在上述损失函数的基础上添加了正则化项,针对第m轮迭代生成的决策树的相关参数,一个是叶子节点的个数(可以表示树的结构复杂性),一个是在不同的分割区间的取值,这里用w表示。
Ω(T(X;Θ))=γT+1/2λ∑j=1Tw2j
其中T表示树的叶子节点的个数。wj表示在叶子节点中的预测值的取值。
将正则项添加到公式5中,得到下式
minΘ∑i=1N[qmiTm(Xi;Θ)+1/2hmiT2m(Xi;Θ)]+γT+1/2λ∑j=1Tw2j
等价于
minΘ∑j=1T[(∑i∈Ijqmi)wj+1/2(∑i∈Ijhmi+λ)w2j]+γT(6)
当一棵树确定之后,我们便可以解出
w∗j=∑i∈Ijqmi∑i∈Ijhmi+λ+γT(7)
将w∗j带入公式6得到
−1/2∑j=1T(∑i∈Ijqmi)2∑i∈Ijhmi+λ+γT(8)
我们知道了公式7和公式8,自然可以使用于决策树的训练。xgboost指出在决策树的生成过程中的分割函数为
Lsplit=1/2[(∑i∈ILqmi)2∑i∈ILhmi+λ+(∑i∈IRqmi)2∑i∈IRhmi+λ−(∑i∈Iqmi)2∑i∈Ihmi+λ]−γ
其中I表示父节点中的样本点集,IL和IR分别表示由父节点生成的左子节点中的样本点和右子节点的样本数。