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))

写成带有样本的形式,即
minfiL(Yi,f(Xi))(1)

Boosting算法的目的就是为了寻找M个的弱分类器f1,...fM作用在样本上,然后将所有的弱分类的结果组合起来,也就是
f(x)=m=1Mαmfm(X)

于是公式(1)变成
minαm,fmiL(Yi,m=1Mαmfm(X))

采用如下的算法进行求解


Algorithm1

  1. f0(X)=0
  2. form=1,...M
  3. {αm,γm}=argminα,γiL(Yi,fm1(Xi)+αG(Xi;γ))
  4. fm(X)=fm1(X)+αmG(X;γm)
  5. endfor

最终F(X)=sign(fM(X)),通过fM的正负号来判断是否是正例,还是负例。
2.Loss function的选择
针对回归问题来说,我们容易想到使用均方误差作为损失函数,即

L(Y,f(X))=(Yf(X))2

针对分类问题,我们令Y{1,1},我们首先想到的是误判率作为损失函数 , 即
L(Y,f(X))=I(Ysign(f(X)))

但是通常不使用误判率作为损失函数.
那么针对分类问题的话,使用如下两种损失函数
L(Y,f(X))=exp(Yf(X))

L(Y,f(X))=log(1+e2Yf(X))

第一个表示指数型损失函数,第二个表示二项似然损失函数
第一个指数型损失函数到底表示什么意思 ???我们通过如下的推导过程来说明
我们的目的是最小化损失函数,即
minf(X)EY|X(eYf(X))(3)

我们用P(Y=1|X)表示Y取1的概率,P(Y=1|X)表示Y取-1的概率 ,那么(3)等价于
minf(X)P(Y=1|X)ef(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+e2f(X)

然后我们令Y=(Y+1)/2 ,那么二项负似然损失函数为
L(Y,p(X))=Ylogp(X)+(1Y)log(1p(X))

等价的也就是
log(1+e2Yf(X))

其实这两个损失函数都是在对P(Y=1|X)的log-odds进行估计,从而选择概率大的那个类为预测类。
那么是否可以使用均方误差作为分类问题的损失函数, 和指数型损失函数一样,我们首先看一下最小化均方误差函数等价于对哪个值的估计
f(X)=argminf(X)EY|X(Yf(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(j1,...K),然后在每个区块中给定一个值γj(j1,...K),如果一条记录落入改区块中,那么它的取值就是γj,我们把决策树弱分类器记为

T(X;Θ)

其中Θ=Rj,γj,j{1,2...,K}
那么根据algorithm 1,我们需要求解
argminΘiL(Yi,fm1(Xi)+Tm(Xi;Θ))(4)

根据不同的损失函数,有不同的求解方法。
1.均方误差
公式(4)将会转换成
argminΘi(Yifm1(Xi)Tm(Xi;Θ)))2

那么这就相当于拟合一棵决策树,目标值为Yifm1(Xi),这是比较容易实现的
2.指数型损失函数
公式(4)将会转换成
argminΘiexp(Yifm1(Xi)+Tm(Xi;Θ)))

也就是
argminΘiexp(Yifm1(Xi))exp(YiTm(Xi;Θ)))

这个相当于拟合一个加权的决策树,目标值为Yi,样本中的每条记录权重为exp(Yifm1(Xi))
这个也是容易实现的
3. 二项负似然损失函数
公式(4)将会转换成
argminΘilog(1+exp(2Yi(fm1(Xi)+Tm(Xi;Θ)))

这里就存在一个问题我去拟合一棵树,目标值是什么,这便是二项负似然损失函数的局限的地方,也是algorithm 1局限的地方。
其实还有很多的损失函数都会存在这样的问题。那么这时候就提出了gradientBoosting从而来适应多种损失函数。

gradientBoosting
现在需要重新计算公式(1),我们并不是直接寻找一个弱分类器对当前的拟合值进行提升。而是通过最速下降法来求解。假设目前是第m轮循环,第m-1轮已经确认N个样本点对应的拟合值为{fm1(X1),fm1(XN)},那么我们通过
rmi=[L(yi,f(Xi))f(Xi)]f(Xi)=fm1(Xi)

求偏导的方式确定负梯度值,我们记为gmi, 然后确定步长
ρm=argminρi=1NL(yi,fm1+ρrmi)

从而得到更新
fm=fm1ρ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=fm1

(b)Fit a regression tree to the target rim giving terminal regions Rjm,j=1,...Jm ,that is
θm=argminθi=1N[rmiT(Xi;θ)]2

(c) calculate step length :
ρm=argminρi=1NL(Yi,fm1ρT(Xi,θm))

(d) Update
fm(Xi)=fm1(Xi)+ρmT(Xi;θm)

3.Output fM(X)


等价于如下算法

Boosting算法

4.常见boosting算法
如果说loss function为均方误差 ,即L(y,f)=1/2(yf)2,那么

L(y,f)f=yf
那么可以得到如下算法


algorithm3LS_Boost
f0(x)=y¯ –初始化
For m=1 to M do :
yi~=yifm1(Xi),i=1,...N
{Rjm}J1=Jterminalnodetree(yi~,XiN1)
γjm=1|Rjm|xiRjmyi~,j=1,...,J //叶子节点的取值
fm(X)=fm1(X)+Jj=1γjm1XRjm
End For


如果loss function 为LAD (Least absolute deviation),即L(y,f)=|yf| ,那么

L(y,f)f=sign(yf)


algorithm4LAD_TreeBoost
f0(x)=median{yi}N1 –初始化
For m=1 to M do :
yi~=sign(yifm1(Xi)),i=1,...N
{Rjm}J1=Jterminalnodetree(yi~,XiN1)
γjm=medianXiRjmyi~,j=1,...,J //叶子节点的取值
fm(X)=fm1(X)+Jj=1γjm1XRjm
End For


如果使用的loss function 是Huber loss funcation ,也就是

L(y,F)={12(yf)2δ(|yf|δ/2)|yf|<=δ|yf|>δ

|yf|<δ时,便是军方误差,当|yf|>δ时,为了保证在|yf|=δ处的一阶导数和函数值相同,并且降低利群点对模型的影响。使用δ(|yf|δ/2).
这样
L(y,f)f={yfδsign(yf)|yf|<=δ|yf|>δ

这里涉及到两个问题
1. δ的选择,其实它就是确定离群点的位置,在第m轮迭代时,我们可以使用δm=quantileα|yifm(Xi)|N1 ,例如可以选择75%分位数。
2. 在第m次迭代时,叶节点的预测值确定,这个无法像均方误差,或者是绝对值误差那样有显性解,需要进行估计,在这里只给出结果

给出相应的算法


Algorithm 5 M _ TreeBoost
f0(x)=medianyiN1
For m=1 to M do :
rm1(Xi)=yifm1(xi),i=1,...,N
δm=quantileα|rm1(Xi)|N1
calculate derivative yi~

yi~={rm1(Xi)δmsign(rm1(Xi))|rm1(Xi)|<=δm|rm1(Xi)|>δm

{Rjm}J1=Jterminalnodetree{yi~,Xi}N1
r~jm=medianXiRjm{rm1(Xi)},j=1,...J
γjm=r~jm+1NjmXiRjmsign(rm1(Xi)t~jm)min(δm,abs(rm1(Xi)r~jm)),j=1,...,J
fm(X)=fm1(X)+Jj=1γjm1(XRjm)
end For


如果loss function 是负二项对数似然损失,也就是

L(y,f)=log(1+exp(2yf)),y{1,1}

需要注意的是在叶节点的值确定时,使用了单步的 Newton-Raphson估计,也就是在求
minγ1Ni=1Nlog(1+exp(2yi(fm1(Xi)+γ))

其实是没有解析解的,因此使用了初始化γ0=0,然后进行了一步的Newton_Raphson法,估算出了γjm ,简单说就是
γjm=γ0G/γ|γ=γ02G/γ2|γ=γ0

其中
G(γ)=1Ni=1Nlog(1+exp(2yi(fm1(Xi)+γ))

我们可以得到如下算法 :


Algorithm 6 (L_K - TreeBoost)
f0(X)=12log1+y¯1y¯
For m=1,…,M :
y~i=2yi/(1+exp(2yifm1(Xi))),i=1,...,N
{Rjm}J1=Jterminalnodetree({yi~,Xi}N1)
γjm=XiRjmy~i/XiRjm|y~i|(2|y~i|),j=1,...,J
Fm(X)=Fm1(X)+Jj=1γjm1(XRjm)
end For


如果是多分类逻辑回归和分类,这时候y的取值已经不再是{-1,1},所以需要重新确定loss function

L({yk,fk(X)K1})=k=1Kyklogpk(X)

这里需要注意的是针对K个类,都有一个fk(X)与之对应,而fkpk之间的关系如下:
fk(X)=logpk(X)1/Kl=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,m1(X)}K1=ykPk,m1(X)

其中
Pk,m1(X)=exp(fk,m1(X))/l=1Kexp(Fl,m1(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=yikpk(Xi),i=1,...,N
{Rjkm}Jj=1=Jterminalnodenodetree({y~ik,Xi}N1)
γjkm=K1KxiRjkmy~ikXiRjkm|y~ik|(1|y~ik|)
Fkm(X)=Ff,m1(X)+Jj=1γjkm1(XRjkm)
end For

5.xgboost
xgboost是在gradient boosting 的基础上进行改进,并且实现了并行化,提高了运算效率 ,更加利于工程学上的使用。
这里只介绍xgboost的原理,针对它的工程学上的实现细节不多做介绍.

我们知道在Gradient boost中需要通过梯度下降的方法来获得一个对树模型的拟合,但是xgboost并不采用梯度下降的方法,而是对损失函数做了二次泰勒展开逼近,从而简化了树模型拟合过程。
首先 在第m次迭代时,我们的目的是

minΘiL(Yi,fm1(Xi)+Tm(Xi;Θ))

xgboost对L(Y,F)做了二次泰勒展开
minΘiL(Yi,fm1(Xi))+qmTm(Xi;Θ)+1/2hmT2m(Xi;Θ)(5)

其中
qm=[L(Yi,f(Xi))f(Xi)]f(Xi)=fm1(Xi)

hm=[2L(Yi,f(Xi))f(Xi)2]f(Xi)=fm1(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[(iIjqmi)wj+1/2(iIjhmi+λ)w2j]+γT(6)

当一棵树确定之后,我们便可以解出
wj=iIjqmiiIjhmi+λ+γT(7)

wj带入公式6得到
1/2j=1T(iIjqmi)2iIjhmi+λ+γT(8)

我们知道了公式7和公式8,自然可以使用于决策树的训练。xgboost指出在决策树的生成过程中的分割函数为
Lsplit=1/2[(iILqmi)2iILhmi+λ+(iIRqmi)2iIRhmi+λ(iIqmi)2iIhmi+λ]γ

其中I表示父节点中的样本点集,ILIR分别表示由父节点生成的左子节点中的样本点和右子节点的样本数。

相关文章: