[机器学习] - 树模型 - 提升算法(AdaBoost, 残差树, XgBoost)


提升算法 是在弱学习器基础上, 根据弱学习器的错误情况,改变接下来的训练样本的重要性权重(分错的权重上升,分对的权重下降),然后使用修改权重后的训练样本生成新的 “个体学习器”,然后再次改变权重,生成新的“个体学习器”。 最后将生成的个体学习器结合在一起,生成最终的集成模型。
对于提升算法,有两个问题是核心:1. 如何改变 训练样本的权重 2. 如何将生成的弱学习器合在一起,形成强学习器。(按照怎样的权重)

AdaBoost

AdaBoost很好的实现了以上两个问题。

分类问题算法

具体算法:
对于二分类的训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) T={ (x_1,y_1), (x_2,y_2),\dots, (x_N,y_N) } T=(x1,y1),(x2,y2),,(xN,yN), 其中 x 1 ∈ R n , y i ∈ { − 1 , 1 } x_1 \in R^n,y_i \in \{-1,1 \} x1Rn,yi{1,1}, 最终输出 集成分类器 G ( x ) G(x) G(x),每个分类器是 G m ( x ) G_m(x) Gm(x)

  1. 初始化训练数据的权值分布:
    D 1 = ( w 1 , 1 , w 1 , 2 , … , w 1 , N ) , w 1 , i = 1 N , i = 1 , 2 , … , N D_1=(w_{1,1},w_{1,2},\dots,w_{1,N}), w_{1,i}=\frac{1}{N}, i= 1,2,\dots,N D1=(w1,1,w1,2,,w1,N),w1,i=N1,i=1,2,,N
  2. 对于 m = 1 , 2 , … , M m=1,2,\dots,M m=1,2,,M
  3. 使用具有权重分布 D m D_m Dm的训练数据集进行学习,得到第m个基本分类器:
    G m ( x ) : X → { − 1 , + 1 } G_m(x):X \rightarrow \{-1,+1\} Gm(x):X{1,+1}
    注意: 根据权重计算时 主要体现在 信息增益,增益率,基尼系数计算。
  4. 计算 G m ( x ) G_m(x) Gm(x)在训练数据集上的 分类错误率:
    e m = P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m , i I ( G m ( x i ) ≠ y i ) e_m=P( G_m(x_i) \neq y_i )=\sum_{i=1}^N w_{m,i} I( G_m(x_i) \neq y_i ) em=P(Gm(xi)=yi)=i=1Nwm,iI(Gm(xi)=yi)
  5. 计算 G m ( x ) G_m(x) Gm(x)的系数:
    α m = 1 2 l o g 1 − e m e m \alpha_m=\frac{1}{2}log \frac{1-e_m}{e_m} αm=21logem1em
    当错误率大于50%,系数为负数;错误率低于50%,系数为正数。 此处对数为自然对数。
  6. 根据系数 α \alpha α更新 训练集的权重:
    α m = 1 2 l o g 1 − e m e m \alpha_m = \frac{1}{2} log \frac{1-e_m}{e_m} αm=21logem1em
    系数越大,表示训练准确度越高,数据的权重就会分的越开。
  7. 然后,我们根据 w m + 1 , i = w m , i Z m e − α m y i G m ( x i ) w_{m+1,i}=\frac{w_{m,i}}{Z_m}e^{-\alpha_m y_i G_m(x_i)} wm+1,i=Zmwm,ieαmyiGm(xi) 更新权重。
  8. 最终我们就可以构建出基本分类器的线性组合 f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^M \alpha_m G_m(x) f(x)=m=1MαmGm(x)
  9. 最终的分类器 s i g n ( f ( x ) ) sign(f(x)) sign(f(x))

AdaBoost 原理分析

我们可以认为 AdaBoost 是 加法模型, 损失函数为 指数函数, 学习算法是 前向分步算法的分类算法。
f ( x ) = ∑ i = 1 M α m b ( x ; γ m ) f(x)=\sum_{i=1}^M \alpha_m b(x;\gamma_m) f(x)=i=1Mαmb(x;γm)
b ( x ; γ m ) b(x;\gamma_m) b(x;γm)表示基函数, γ m \gamma_m γm表示基函数的参数; α m \alpha_m αm表示基函数的系数。
因此,我们成为了学习:
m i n α m ; γ m ∑ i = 1 N L ( y i , ∑ m = 1 M α m b ( x ; γ m ) ) min_{\alpha_m;\gamma_m} \sum_{i=1}^N L(y_i, \sum_{m=1}^M \alpha_m b(x; \gamma_m) ) minαm;γmi=1NL(yi,m=1Mαmb(x;γm))
对于前向学习算法,因为我们学习的是加法模型,所以我们从前到后 m = 1 , … , M m=1,\dots,M m=1,,M , 每一步都只学习一个基函数和系数,逐渐逼近 目标函数, 从而减少问题的复杂度。 我们每步只需要优化以下损失函数:
m i n α , γ ∑ i = 1 N L ( y i , α b ( x i ; γ ) ) min_{\alpha,\gamma} \sum_{i=1}^N L(y_i, \alpha b(x_i;\gamma)) minα,γi=1NL(yi,αb(xi;γ))
具体来说,就是每次都 极小化损失:
( α m , γ m ) = a r g   m i n α , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + α b ( x i ; γ ) ) (\alpha_m,\gamma_m)=arg \ min_{\alpha,\gamma} \sum_{i=1}^N L(y_i, f_{m-1}(x_i)+\alpha b(x_i;\gamma)) (αm,γm)=arg minα,γi=1NL(yi,fm1(xi)+αb(xi;γ))

( α m , γ m ) = a r g   m i n α , γ ∑ i = 1 N e − y i f m − 1 ( x i ) e − y i α b ( x i ) = a r g   m i n α , γ ∑ i = 1 N w ^ m , i e − y i α b ( x i ) (\alpha_m,\gamma_m)=arg \ min_{\alpha,\gamma} \sum_{i=1}^N e^{- y_i f_{m-1}(x_i)} e^{-y_i \alpha b(x_i)}=arg \ min_{\alpha,\gamma} \sum_{i=1}^N \hat{w}_{m,i} e^{-y_i \alpha b(x_i)} (αm,γm)=arg minα,γi=1Neyifm1(xi)eyiαb(xi)=arg minα,γi=1Nw^m,ieyiαb(xi)

因此在每次,我们只需要求解 α , γ \alpha,\gamma α,γ就可以了。对于 γ \gamma γ的求解,我们可以直接看作求解 b m ( x ) b_m(x) bm(x)
b m ∗ ( x ) = a r g   m i n b ∗ ∑ i = 1 N w ^ m , i I ( y i ≠ b ( x i ) ) = e b^*_m(x)= arg \ min_{b^*} \sum_{i=1}^N \hat{w}_{m,i}I(y_i\neq b(x_i)) =e bm(x)=arg minbi=1Nw^m,iI(yi=b(xi))=e
其中, w ^ m , i = e − y i f m − 1 ( x i ) \hat{w}_{m,i}=e^{-y_i f_{m-1}(x_i)} w^m,i=eyifm1(xi)
这就是使错误率 e m e_m em最小对应的模型。

∑ i = 1 N w ^ m , i e − y i α b ( x i ) = ∑ y i = b m ( x i ) w ^ m , i e − α + ∑ y i ≠ b m ( x i ) w ^ m , i e α = ( 1 − e m ) e − α + e m e α \sum_{i=1}^N \hat{w}_{m,i} e^{-y_i \alpha b(x_i)}= \sum_{y_i=b_m(x_i)} \hat{w}_{m,i}e^{-\alpha}+\sum_{y_i \neq b_m(x_i)} \hat{w}_{m,i}e^\alpha=(1-e_m)e^{-\alpha}+e_m e^\alpha i=1Nw^m,ieyiαb(xi)=yi=bm(xi)w^m,ieα+yi=bm(xi)w^m,ieα=(1em)eα+emeα
将上式对 α \alpha α求导,使导数为0,就可以得到 α = 1 2 l n ( 1 − e m e m ) \alpha=\frac{1}{2}ln(\frac{1-e_m}{e_m}) α=21ln(em1em)
f m ( x ) = f m − 1 ( x ) + α m b m ( x ) f_m(x)=f_{m-1}(x)+\alpha_m b_m(x) fm(x)=fm1(x)+αmbm(x)
以及 w ^ m + 1 , i = w ^ m , i e − y i α m b m ( x ) \hat{w}_{m+1,i}=\hat{w}_{m,i}e^{-y_i \alpha_m b_m(x)} w^m+1,i=w^m,ieyiαmbm(x)
最终,我们证明了
前向分步算法作为学习算法, 指数函数 e − y f ( x ) e^{-yf(x)} eyf(x)作为损失函数, 加法模型的 算法 就是Ada Boost:
b m ( x ) = a r g   m i n b m ( x ) ∑ i = 1 N w ^ m , i I ( y i ≠ b m ( x ) ) b_m(x)=arg \ min_{b_m(x)} \sum_{i=1}^N \hat{w}_{m,i} I(y_i\neq b_m(x)) bm(x)=arg minbm(x)i=1Nw^m,iI(yi=bm(x))
对应的错误率为 e m = ∑ i = 1 N w m , i I ( b m ( x ) ≠ y i ) e_m = \sum_{i=1}^N w_{m,i}I(b_m(x)\neq y_i) em=i=1Nwm,iI(bm(x)=yi)
从而计算得到 模型系数 α = 1 2 l o g ( 1 − e m e m ) \alpha =\frac{1}{2}log(\frac{1-e_m}{e_m}) α=21log(em1em)
更新 训练样本 权重 w m + 1 , i = w m , i e − α m y i b m ( x i ) / Z m w_{m+1,i}=w_{m,i}e^{-\alpha_m y_i b_m(x_i)} / Z_m wm+1,i=wm,ieαmyibm(xi)/Zm

提升树

Adaboost 只解决了分类问题的提升算法,没有解决回归问题的提升算法。
提升树是指 采用前向分步算法作为学习算法,以加法算法,设定的损失函数(根据自己定义)的提升算法。
如果损失函数是 指数函数,那么 提升树就是 Adaboost。
如果损失函数是 MSE函数,那么 提升树就是 残差树。

残差树算法

f m ( x ) = f m − 1 ( x ) + T ( x ; θ ) f_m(x)=f_{m-1}(x)+T(x;\theta) fm(x)=fm1(x)+T(x;θ)
在第m步时,我们需要求解 a r g min ⁡ θ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x i ; θ ) ) arg \min_{\theta} \sum_{i=1}^N L(y_i, f_{m-1}(x_i)+T(x_i; \theta)) argminθi=1NL(yi,fm1(xi)+T(xi;θ))
使用MSE损失函数时, L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x))=( y-f(x) )^2 L(y,f(x))=(yf(x))2
损失变成了 L = [ y − f m − 1 ( x ) − T ( x ; θ ) ] 2 = [ r − T ( x ; θ ) ] 2 L=[y-f_{m-1}(x)-T(x;\theta)]^2=[r-T(x;\theta)]^2 L=[yfm1(x)T(x;θ)]2=[rT(x;θ)]2
我们在第m步,就将训练样本的 y i y_i yi改成 y i − f m − 1 ( x i ) y_i-f_{m-1}(x_i) yifm1(xi). 所有样本的权重都是相同的。
这就是残差树。

GBDT

当损失函数是指数函数,MSE函数时,优化相对简单,分别是Adaboost / 残差树。 但是如果是一般的损失函数,则每一步的优化不是很容易。
有人提出了 梯度提升 gradient boosting 算法, 利用损失函数的负梯度在当前模型的值:
− [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) -[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} [f(xi)L(y,f(xi))]f(x)=fm1(x)

xgboost

在Xgboost中,我们一方面考虑模型预测与实际值的误差,另一方面考虑正则项,树的复杂度惩罚项
L = ∑ i = 1 N l ( y i , y ^ i ) + ∑ k O ( f k ) L=\sum_{i=1}^N l(y_i,\hat{y}_i)+\sum_{k} \Omicron(f_k) L=i=1Nl(yi,y^i)+kO(fk)
前一部分表示每个样本的损失;后一部分表示每个树的复杂度惩罚(正则化项)
我们使用决策树,那么正则化项是叶子节点的个数和叶子节点的分数 O ( f ) = γ T + 1 2 λ ∣ ω ∣ 2 \Omicron(f)=\gamma T+\frac{1}{2} \lambda |\omega|^2 O(f)=γT+21λω2
我们使用前向分步算法可以得到:
L = ∑ i = 1 N l ( y i , f m − 1 + f m ( x i ) ) + γ T + 1 2 ∣ ω ∣ 2 L=\sum_{i=1}^N l(y_i, f_{m-1}+f_m(x_i))+\gamma T +\frac{1}{2}|\omega|^2 L=i=1Nl(yi,fm1+fm(xi))+γT+21ω2
L = ∑ i = 1 N [ l ( y i , f m − 1 ) + g i ( y i , f m − 1 ( x i ) ) f m ( x i ) + 1 2 h i ( y i , f m − 1 ( x i ) ) f m 2 ( x i ) ] + γ T + 1 2 ∣ ω ∣ 2 L=\sum_{i=1}^N [l(y_i,f_{m-1})+g_i(y_i,f_{m-1}(x_i))f_m(x_i)+\frac{1}{2}h_i(y_i,f_{m-1}(x_i))f^2_m(x_i)]+\gamma T+\frac{1}{2} |\omega|^2 L=i=1N[l(yi,fm1)+gi(yi,fm1(xi))fm(xi)+21hi(yi,fm1(xi))fm2(xi)]+γT+21ω2
L = ∑ i = 1 N [ g i f m ( x i ) + 1 2 h i f m 2 ( x i ) ] + γ T + 1 2 ∣ ω ∣ 2 L=\sum_{i=1}^N [g_i f_m(x_i)+\frac{1}{2}h_i f^2_m(x_i)]+\gamma T+\frac{1}{2} |\omega|^2 L=i=1N[gifm(xi)+21hifm2(xi)]+γT+21ω2
我们可以将不同子结点的值合在一起,而不是每个样本进行遍历
L = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T L=\sum_{j=1}^T[ (\sum_{i \in I_j}g_i)w_j +\frac{1}{2}(\sum_{i\in I_j}h_i +\lambda)w_j^2]+\gamma T L=j=1T[(iIjgi)wj+21(iIjhi+λ)wj2]+γT
L = ∑ j = 1 T [ G j w j + 1 2 ( H j + γ ) w j 2 ] + γ T L=\sum_{j=1}^T [G_j w_j + \frac{1}{2}(H_j +\gamma)w_j^2]+\gamma T L=j=1T[Gjwj+21(Hj+γ)wj2]+γT
对于 w w w进行求导,得到每个叶结点的最优预测分数:
w j = − G j H j + λ w_j=-\frac{G_j}{H_j+\lambda} wj=Hj+λGj
最终得到的目标函数是:
L = − 1 2 ∑ j = 1 T G j 2 H j + λ + λ T L=-\frac{1}{2}\sum_{j=1}^T \frac{G_j^2}{H_j+\lambda}+\lambda T L=21j=1THj+λGj2+λT

此时,我们得到了XGboost的打分函数:
G a i n = G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ − λ Gain=\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}-\lambda Gain=HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2λ
我们根据这个函数来对此棵树进行划分。 (XGboost是基于CART树,每次都是二分树)

Xgboost细节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值