参考了统计学习方法,西瓜书,Machine Learnig with python做的总结,还包含自己用sklearn做的一些对比实验,原文是写在jupyter上的,这里是直接转为.md导过来的,所以格式有些问题,有些东西还待完善…
参考的博客https://www.cnblogs.com/pinard/p/6140514.html,
https://blog.csdn.net/qq_22238533/article/details/79185969

集成学习(ensemble learning)

集成学习是通过构建并结合多个学习器来完成学习任务.一般结构:先产生一组“个体学习器”,在以某种策略将他们结合起来.同质个体学习器,也称为基学习器(base learner),相应的算法称为基学习算法.当然也可以是异质的,此时个体学器称为“组件学习器”.
基学习器有时也被称为弱学习器,集成学习通过多个学习器的结合,常常可以获得比单一学习器显著优越的泛化性能,这对弱学习器尤为明显.

误差率

考虑二分类问题y{1,+1}y\in\{-1,+1\},假定基分类器的分类误差率为ϵ\epsilon,即对每一个基分类器GiG_i有:P(Gi(x)y)=ϵP(G_i(x)\neq y)=\epsilon
假定集成通过简单投票法来结合TT个基分类器,若有超过半数的基分类器正确,则集成分类就正确,这里使用符号函数signsign来表示投票过程:G(x)=sign(i=1TGi(x))G(x)=sign(\sum_{i=1}^TG_i(x))
集成学习预测错误的条件是:k个基分类器预测正确,其中kT2k\leq \left \lfloor \frac{T}{2} \right \rfloor,TkT-k个基分类器预测错误.

假设基分类器的错误率相互独立,则集成学习器分类误差率为:p(H(x)y)=k=0T2CTk(1ϵ)kϵ(Tk)1p(H(x)\neq y)=\sum_{k=0}^{\left \lfloor \frac{T}{2} \right \rfloor}C_T^k(1-\epsilon)^k\epsilon^{(T-k)} (1)这里对上式的理解是,每个基分类器误分概率是ϵ\epsilon,所以正确分类的概率为(1ϵ)(1-\epsilon),那么要想求整体误分概率,由于是投票方式集成,因此只需要误分的基分类器数量大于正确分类的基分类器数量就可以,所以是个组合问题.

根据Hoeffding不等式有:p(H(x)y)=k=0T2CTk(1ϵ)kϵ(Tk)exp(12T(12ϵ)2)2p(H(x)\neq y)=\sum_{k=0}^{\left \lfloor \frac{T}{2} \right \rfloor}C_T^k(1-\epsilon)^k\epsilon^{(T-k)}\leq exp(-\frac{1}{2}T(1-2\epsilon)^2) (2)

解释:对于服从伯努利分布(1或0)抛硬币游戏,如果过设置单次抛掷硬币A面向上的概率是pp,则B面向上为1p1-p。那么抛掷nn次,A面朝上的次数不超过kk次的概率为:P(H(n)k)=i=0kCnipi(1p)niP(H(n)\leq k)=\sum_{i=0}^kC_n^ip^i(1-p)^{n-i},这里H(n)H(n)表示n次抛硬币A面向上次数.
对于kk,存在某一γ\gamma,当k=(pγ)nk=(p-\gamma)n时,有:P(H(n)k)=P(H(n)(pγ)n)exp(2γ2n)P(H(n)\leq k)=P(H(n)\leq (p-\gamma)n)\leq exp(-2\gamma^2n)这就是伯努利分布的Hoeffding不等式。

对应(1)式中,把T个分类器的判断看为T次抛硬币,A面向上的次数小于等于T2\frac{T}{2},所以存在有T2=(ϵγ)T\frac{T}{2}=(\epsilon-\gamma)T,解出:γ=ϵ12\gamma=\epsilon-\frac{1}{2}
所以可以改写为P(H(T)T2)exp(2(ϵ12)2T)P(H(T)\leq \frac{T}{2})\leq exp(-2(\epsilon-\frac{1}{2})^2T),所以有(2)式成立.(2)式显示出,随着集成中个体分类器数目TT的增大,集成的误差率将指数级下降(因为误差率的上界是指数函数),最终趋于0,但是这建立在关键性假设上:基学习器的误差相互独立.

集成学习大体可以分为两类:
1.个体学习器之间不存在强依赖关系,可以同时生成的并行化方法,代表是Bagging和随机森林(RandomForests)(并行生成)
2.个体学习器之间存在强依赖关系,必须串行生成的序列化方法,每一轮迭代产生一个个体学习器,代表方法是Boosting(串行生成)

一 随机森林(Random Forests)

Why

树模型一般来说是高方差,低偏差的,也就是容易过拟合.而且分类树模型的另一个缺点是它们是不稳定的,也是就是当数据发生微小变化时,会导致另外一个完全不同的树模型.而随机森林是可以解决不稳定性和过拟合的最有效方法之一.

随机森林基于两个基本概念,称为bagging和subspace sampling

Bagging

给定包含mm个样本的数据集,我们先随机选取一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时,该样本仍有可能被选中,这样经过mm次随机采样,我们得到含有mm个样本的采样集.这样有的样本会多次出现.我们可以采集TT个含有mm个样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合.Bagging对于分类通常也是采取简单投票方式来集成基学习器,而对于回归则采取平均来集成基学习器.

随机森林

随机森林是Bagging的一个扩展变体.RF以决策树作为基学习器然后构建Bagging集成。最重要的是在构建决策树过程中,引入随机属性选择,也即是传统决策树选择划分属性时,是在当前节点的属性集合中选择一个最优属性(设总共有dd个属性),而在RF中,对于决策树的每个节点,先从该节点的属性集合中随机选择一个包含kk个属性的子集,然后再从这个子集中选择一个最优属性用于划分.这里参数kk控制随机性程度,当k=dk=d时,与传统构建一样,当k=1k=1时,则是随机选择一个属性划分.一般选取k=log2(d)k=log_2(d)

极致随机森林

在极随机化的树中(参见ExtraTreesClassifier和ExtraTreesRegressor类),随机性在计算分割的方式上更进了一步。 与在随机森林中一样,使用候选特征的随机子集,但是不是寻找最具辨别力的阈值,而是针对每个候选特征随机绘制阈值,并且挑选这些随机生成的阈值中的最佳阈值作为分裂规则。这通常允许更多地减少模型的方差,代价是偏差略微增加(参考Sklearn documentation)

优点

简单,易实现,计算开销小

二 提升方法(Boosting)-AdaBoosting

提升方法就是从弱学习算法出发,反复学习,得到一系弱分类器(基分类器),然后组合这些弱分类器,构成强分类器。大多数提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器

提升方法要解决的两个问题:

1.在每一轮如何改变训练数据的权值或概率分布
2.如何将弱分类器组合成强分类器

AdaBoosting的解决方式:

1.提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值,这样可以加大后一轮的弱分类器对错误分类样本的关注
2.AdaBoosting采用加权多数表决的方法.具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大作用,减小分类误差率大的弱分类器权值,使其在表决中起较小作用.

(一) AdaBoosting算法

AdaBoost二类二分类问题算法

假设给定一个二分类的训练数据集:T={(x1,y1),(x2,y2),...,(xn,yn)}T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}其中y{+11}y\in\{+1,-1\}
输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)}T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\};弱学习算法;
输出:最终分类器G(x)G(x)
1.初始化训练数据的权值分布D1=w11,...,w1i,...,w1n,w1i=1N,i=1,2,..,ND_1={w_{11},...,w_{1i},...,w_{1n}},w_{1i}=\frac{1}{N},i=1,2,..,N
2.对m=1,2...Mm=1,2,...,M:
\quad\quad(a).使用具有权值分布DmD_m的训练数据学习,得到基分类器:Gm(x):X+1,1G_m(x):X\rightarrow{+1,-1}
\quad\quad(b).计算Gm(x)G_m(x)在训练数据集上的分类误差率:em=P(Gm(x)y)=i=1NwmiI(Gm(xi)yi)1e_m=P(G_m(x)\neq y)=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\neq y_i)(也就是误分类样本的权值之和) (1)
\quad\quad©.计算Gm(x)G_m(x)的系数:αm=12log1emem2\alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m} (2)
\quad\quad(d).更新训练数据集的权值分布:D1=wm+1,1,...,wm+1,i,...,wm+1,nD_1={w_{m+1,1},...,w_{m+1,i},...,w_{m+1,n}} wm+1,i=wmiZmexp(αmyiGm(xi)),i=1,2..,N4w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)),i=1,2..,N (4) wm+1,i={wmiZmeαm,Gm(xi)=yiwmiZmeαm,Gm(xi)yi即 :w_{m+1,i}=\left\{\begin{matrix} \frac{w_{mi}}{Z_m}e^{-\alpha_m},G_m(x_i)=y_i\\ \frac{w_{mi}}{Z_m}e^{\alpha_m},G_m(x_i)\neq y_i \end{matrix}\right.
\quad\quad相对正确分类样本,误分类样本权值被放大e2αme^{2\alpha_m},这里ZmZ_m是规范化因子(目的是使权值在010-1之间且和为11Zm=i=1Nwmiexp(αmyiGm(xi))5Z_m=\sum_{i=1}^Nw_{mi}exp(-\alpha_my_iG_m(x_i)) (5)
3.构建基本分类器的线性组合:f(x)=m=1MαmGm(x)6f(x)=\sum_{m=1}^M\alpha_mG_m(x) (6)注意线性组合实现MM个基本分类器的加权表决,其符号表示实例xx的类别,f(x)f(x)的值表示分类的确信度,αm\alpha_m之和并不为1
得到最终分类器:G(x)=sign(f(x))=sign(m=1MαmGm(x))7G(x)=sign(f(x))=sign(\sum_{m=1}^M\alpha_mG_m(x)) (7)

对于AdaBoost多元分类算法,原理与二元分类似,主要区别在弱分类器系数上.比如AdaBoost SAMME算法,其弱分类器系数:
αm=12log(1emem)+log(K1)\alpha_m=\frac{1}{2}log(\frac{1-e_m}{e_m})+log(K-1)其中KK表示类别数,当为二分类时K=2K=2,此时系数α\alpha就和原算法一样了.论文http://web.stanford.edu/~hastie/Papers/samme.pdf

AdaBoost回归问题算法

这里使用AdaBoost R2回归
输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)}T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\};弱学习算法;
输出:最终强学习器G(x)
1.初始化训练数据的权值分布D1=w11,...,w1i,...,w1n,w1i=1N,i=1,2,..,ND_1={w_{11},...,w_{1i},...,w_{1n}},w_{1i}=\frac{1}{N},i=1,2,..,N
2.对m=1,2...Mm=1,2,...,M:
\quad\quad(a).使用具有权值分布DmD_m的训练数据学习,得到弱分类器Gm(x)G_m(x)
\quad\quad(b).计算Gm(x)G_m(x)在训练数据集上每个样本的相对误差:
\quad\quad\quad线性误差emi=yiGm(xi)Em,i=1,2,...,Ne_{mi}=\frac{y_i-G_m(x_i)}{E_m},i=1,2,...,N
\quad\quad\quad平方误差emi=(yiGm(xi))2Em2,i=1,2,...,Ne_{mi}=\frac{(y_i-G_m(x_i))^2}{E_m^2},i=1,2,...,N
\quad\quad\quad指数误差emi=1exp((yiGm(xi))Em),i=1,2,...,Ne_{mi}=1-exp(\frac{-(y_i-G_m(x_i))}{E_m}),i=1,2,...,N
\quad\quad\quad其中EmE_m是训练集上最大误差Em=maxyiGm(xi),i=1,2,...,NE_m=max|y_i-G_m(x_i)|,i=1,2,...,N
\quad\quad©.计算Gm(x)G_m(x)在训练数据集上回归误差率: em=i=1Nwmiemie_m=\sum_{i=1}^Nw_{mi}e_{mi}
\quad\quad(d).计算弱学习器权重系数αm=em1em\alpha_m=\frac{e_m}{1-e_m}
\quad\quad(e).更新样本集权重分布wm+1,i=wm,iZmαm1emi,i=1,2,...,Nw_{m+1,i}=\frac{w_{m,i}}{Z_m}\alpha_{m}^{1-e_{mi}},i=1,2,...,N
Zm=i=1Nwm,iαm1emi,i=1,2,...,NZ_m=\sum_{i=1}^Nw_{m,i}\alpha_{m}^{1-e_{mi}},i=1,2,...,N
3.构建最终强学习器G(x)=m=1M(ln1αm)Gm(x)G(x)=\sum_{m=1}^M(ln\frac{1}{\alpha_m})G_m(x)

import sklearn.ensemble
import numpy as np
import matplotlib.pyplot as pl
import math
e=np.arange(0.1,1,0.01)

αm=12log1emem\alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m}的图像,em12e_m\leq\frac{1}{2}时,α0\alpha\geq0,而且α\alpha随着eme_m的减小而增大

a=0.5*np.log((1-e)/(e))
pl.plot(e,a)
pl.show()

集成学习(随机森林,提升方法-Adaboosting、Boosting tree、GBDT)

AdaBoost误差分析

定理1 \quad \quadAdaBoost算法最终分类器的训练误差界为:
1Ni=1NI(G(xi)yi)1Ni=1Nexp(yif(xi))=mZm\frac{1}{N}\sum_{i=1}^NI(G(x_i)\neq y_i)\leq\frac{1}{N}\sum_{i=1}^N exp(-y_if(x_i))=\prod_mZ_m这里G(x)G(x)来自式(7),f(x)f(x)来自式(6),ZmZ_m来自(5).这一定理说明可以在每一轮选取适当GmG_m使得ZmZ_m最小,从而使训练误差下降最快

证明:
G(xi)yiG(x_i)\neq y_iI=1I=1yif(xi)<0y_if(x_i)<0,此时exp(yif(xi))1exp(-y_if(x_i))\geq1,当G(xi)yiG(x_i)\neq y_iI=0I=0yif(xi)>0y_if(x_i)>0,此时exp(yif(xi))1exp(-y_if(x_i))\leq1.1Ni=1NI(G(xi)yi)1\frac{1}{N}\sum_{i=1}^NI(G(x_i)\neq y_i)\leq 1由此直接推出前一部分.

后一部分:
根据(4)式我们有wmiexp(αmyiGm(xi))=Zmwm+1,i8w_{mi}exp(-\alpha_my_iG_m(x_i))=Z_mw_{m+1,i}(8)

推导:1NiNexp(yif(xi))=1NiNexp(m=1MαmyiGm(xi))\frac{1}{N}\sum_i^Nexp(-y_if(x_i))=\frac{1}{N}\sum_i^Nexp(-\sum_{m=1}^M\alpha_my_iG_m(x_i))
=1NiNm=1Mexp(αmyiGm(xi))=\frac{1}{N}\sum_i^N\prod_{m=1}^Mexp(-\alpha_my_iG_m(x_i))由于w1,i=1Nw_{1,i}=\frac{1}{N}所以有=iNw1im=1Mexp(αmyiGm(xi))=\sum_i^Nw_{1i}\prod_{m=1}^Mexp(-\alpha_my_iG_m(x_i))再是使用(8)式则有=Z1iNw2im=2Mexp(αmyiGm(xi))=Z_1\sum_i^Nw_{2i}\prod_{m=2}^Mexp(-\alpha_my_iG_m(x_i)) =Z1Z2iNw3im=3Mexp(αmyiGm(xi))=Z_1Z_2\sum_i^Nw_{3i}\prod_{m=3}^Mexp(-\alpha_my_iG_m(x_i))
=...=...
=m=1MZm=\prod_{m=1}^MZ_m

定理2 \quad\quad 对于二分类问题的AdaBoost训练误差界有

m=1MZm=m=1M[2em(1em)]=m=1M(14γm2)exp(2m=1Mγm2)\prod_{m=1}^MZ_m=\prod_{m=1}^{M}[2\sqrt {e_m(1-e_m)}]=\prod_{m=1}^{M}\sqrt(1-4\gamma_m^2)\leq exp(-2\sum_{m=1}^M\gamma_m^2)

这里γm=12em\gamma_m=\frac{1}{2}-e_m

证明:由(5)式有:Zm=i=1Nwmiexp(αmyiGm(xi))Z_m=\sum_{i=1}^Nw_{mi}exp(-\alpha_my_iG_m(x_i)) =G(xi)=yiwmieαm+G(xi)yiwmieαm=\sum_{G(x_i)=y_i}w_{mi}e^{-\alpha_m}+\sum_{G(x_i)\neq y_i}w_{mi}e^{\alpha_m} =(1em)eαm+emeαm=(1-e_m)e^{-\alpha_m}+e_me^{\alpha_m} =2em(1em)=14γm2=2\sqrt{e_m(1-e_m)}=\sqrt{1-4\gamma_m^2}

根据ex1xe^x和\sqrt{1-x}在x=0处的泰勒展开式推出不等式(14γm2)exp(2γm2)\sqrt{(1-4\gamma_m^2)}\leq exp(-2\gamma_m^2)
推论\quad\quad如果存在γ>0\gamma>0对所有γ<γm\gamma<\gamma_m1Ni=1NI(G(xi)yi)exp(2Mγ2)\frac{1}{N}\sum_{i=1}^NI(G(x_i)\neq y_i)\leq exp(-2M\gamma^2)

这表明此条件(二分类)下AdaBoost的训练误差是以指数速率下降的,这是训练误差上界是指数函数.

AdaBoost算法的解释

AdaBoost算法另一个解释:AdaBoost是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法的二分类学习方法.

前向分步算法

考虑加法模型:f(x)=m=1Mβmb(x;γm)f(x)=\sum_{m=1}^M\beta_mb(x;\gamma_m)

其中,b(x;γm)b(x;\gamma_m)为基函数,γm\gamma_m为基函数参数,βm\beta_m为基函数系数.显然(6)式:$f(x)=\sum_{m=1}^M\alpha_mG_m(x) $也是一个加法模型

在给定训练数据及损失函数L(y,f(y))L(y,f(y))的条件下,学习加法模型f(x)f(x)的问题,成为经验风险极小化即损失函数极小化问题minβm,γmi=1NL(yi,m=1Mβmb(x;γm))14min_{\beta_m,\gamma_m}\sum_{i=1}^NL(y_i,\sum_{m=1}^M\beta_mb(x;\gamma_m)) (14)

前向分布算法求解这个问题思路:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式(14),那么就可以简化优化的复杂度.具体的,每一步只需要优化如下损失函数:minβ,γi=1NL(yi,βb(xi,γ))15min_{\beta,\gamma}\sum_{i=1}^NL(y_i,\beta b(x_i,\gamma)) (15)

具体的前向分布算法:
输入:训练数据集T=(x1,y1),(x2,y2),...,(xn,yn)T={(x_1,y_1),(x_2,y_2),...,(x_n,y_n)};损失函数L(y,f(x))L(y,f(x));基本函数集b(x;γ){b(x;\gamma)};
输出:加法模型f(x)f(x).
(1)初始化f0(x)=0f_0(x)=0
(2)对m=1,2,...,Mm=1,2,...,M:
\quad\quada.极小化损失函数argminβ,γi=1NL(yi,fm1(xi)+βb(xi;γ))16argmin_{\beta,\gamma}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) (16) \quad\quad得到参数βm\beta_m,γm\gamma_m
\quad\quadb.更新fm(x)=fm1(x)+βmb(x;γm)17f_m(x)=f_{m-1}(x)+\beta_mb(x;\gamma_m) (17)
(3).得到加法模型f(x)=fM(x)=m=1Mβmb(x;γm)18f(x)=f_M(x)=\sum_{m=1}^M\beta_mb(x;\gamma_m) (18)

AdaBoost与前向分步算法

定理3\quad\quad AdaBoost是前向分步算法的特例.AdaBoost模型是基分类器组成的加法模型,损失函数是指数函数

证明:

由于AdaBoost的最终分类器是f(x)=m=1MαmGm(x)f(x)=\sum_{m=1}^M\alpha_mG_m(x),本身就是一个加法模型,因此我们只需要证明其损失函数是指数函数L(y,f(x))=exp(yf(x))L(y,f(x))=exp(-yf(x))时,其学习的具体操作等价于AdaBoost算法学习的具体操作.

假设经过m1m-1轮迭代前向分布算法已经得到fm1(x)f_{m-1}(x):fm1(x)=fm2(x)+αm1Gm1(x)=α1G1(x)+...+αm1Gm1(x)f_{m-1}(x)=f_{m-2}(x)+\alpha_{m-1}G_{m-1}(x)=\alpha_1G_1(x)+...+\alpha_{m-1}G_{m-1}(x)
第m轮迭代可以得到αm\alpha_mGm(x)G_m(x)fm(x)f_m(x):fm(x)=fm1(x)+αmGm(x)f_m(x)=f_{m-1}(x)+\alpha_mG_m(x)目标是使前向分步算法得到的αm\alpha_mGm(x)G_m(x)使fm(x)f_m(x)在训练数据集TT上的指数损失函数最小,即(αm,Gm(x))=argminα,Gi=1Nexp(yi(fm1(xi)+αG(xi)))20(\alpha_m,G_m(x))=argmin_{\alpha,G}\sum_{i=1}^Nexp(-y_i(f_{m-1}(x_i)+\alpha G(x_i))) (20)

上式可以表示为:(αm,Gm(x))=argminα,Gi=1Nwˉmiexp[yiαG(xi)]21(\alpha_m,G_m(x))=argmin_{\alpha,G}\sum_{i=1}^N\bar{w}_{mi}exp[-y_i\alpha G(x_i)] (21)

其中wˉmi=exp[yifm1(xi)]\bar{w}_{mi}=exp[-y_if_{m-1}(x_i)],因为wˉmi\bar{w}_{mi}既不依赖于α\alpha也不依赖于GG,所以与最小化无关.但是wˉmi\bar{w}_{mi}依赖于fm1(x)f_{m-1}(x),随着每一轮迭代而发生变化

下面证明,使得式(21)式达到最小的αm\alpha^*_m,$G_m^\ast(x) AdaBoost就是AdaBoost算法所得到的\alpha_mG_m(x)$,求解(21)式分两步

首先,求Gm(x)G_m^\ast(x),对任意α>0\alpha>0,使式(21)最小的G(x)G(x)由下式得到:Gm(x)=argminGi=1NwˉmiI(yiG(xi))22G_m^\ast(x)=argmin_G\sum_{i=1}^N\bar{w}_{mi}I(y_i\neq G(x_i))(22)

其中wˉmi=exp[yifm1(xi)]\bar{w}_{mi}=exp[-y_if_{m-1}(x_i)],这里(22)和(21)式实际上是等价的,因为对i=1Nwˉmiexp[yiαG(xi)]\sum_{i=1}^N\bar{w}_{mi}exp[-y_i\alpha G(x_i)]求最小值,α>0\alpha>0,wˉmi\bar{w}_{mi}可看为常量,所以只用每个yiG(xi)y_iG(x_i)最大,那么也就是尽量让I(yiG(xi))I(y_i \neq G(x_i))的在整个数据集上的数量最小.也就是下面这句话

此分类器Gm(x)G_m^\ast(x)即为AdaBoost算法的基分类器Gm(x)G_m(x),因为他是使得第mm轮加权训练数据分类误差率最下的基本分类器.wˉmi\bar{w}_{mi}就是数据权值

然后求解αm\alpha_m^\ast,式(21)可写成如下:i=1Nwˉmiexp[yiαG(xi)]\sum_{i=1}^N\bar{w}_{mi}exp[-y_i\alpha G(x_i)] =Gm(xi)=yiwˉmieα+Gm(xi)yiwˉmieα=\sum_{G_m(x_i)=y_i}\bar{w}_{mi}e^{-\alpha}+\sum_{G_m(x_i)\neq y_i}\bar{w}_{mi}e^{\alpha}
=(eαeα)i=1NwˉmiI(yiG(xi))+eαi=1Nwˉmi=(e^\alpha-e^{-\alpha})\sum_{i=1}^N\bar{w}_{mi}I(y_i\neq G(x_i))+e^{-\alpha}\sum_{i=1}^N\bar{w}_{mi}

将上式对α\alpha求导:简化为((eαeα)h1+eαh2)((e^\alpha-e^{-\alpha})h_1+e^{-\alpha}h_2)'eα=xe^\alpha=x求导并使导数为00可以得x2=h2h1h1x^2=\frac{h_2-h_1}{h_1},然后解出αm=12logh2h1h1\alpha_m^\ast=\frac{1}{2}log\frac{h_2-h_1}{h_1},最后αm=12log1emem\alpha_m^\ast=\frac{1}{2}log\frac{1-e_m}{e_m}

其中em=i=1NwˉmiI(yiG(xi))i=1Nwˉmi=i=1NwmiI(yiGm(xi))e_m=\frac{\sum_{i=1}^N\bar{w}_{mi}I(y_i\neq G(x_i))}{\sum_{i=1}^N\bar{w}_{mi}}=\sum_{i=1}^Nw_{mi}I(y_i\neq G_m(x_i))表示分类误差率,这与AdaBoot的αm\alpha_m完全一样

在看样本权值更新是否与AdaBoost一样

fm(x)=fm1(x)+αmGm(x)f_m(x)=f_{m-1}(x)+\alpha_mG_m(x)wˉmi=exp[yifm1(xi)]\bar{w}_{mi}=exp[-y_if_{m-1}(x_i)],那么有wˉm+1,i=exp[yifm(xi)]=exp[yi(fm1(x)+αmGm(x))]=exp[yifm1(x)]exp[yiαmGm(x)]\bar{w}_{m+1,i}=exp[-y_if_{m}(x_i)]=exp[-y_i(f_{m-1}(x)+\alpha_mG_m(x))]=exp[-y_if_{m-1}(x)]exp[-y_i\alpha_mG_m(x)] wˉm+1,i=wˉm,iexp[yiαmGm(x)]\bar{w}_{m+1,i}=\bar{w}_{m,i}exp[-y_i\alpha_mG_m(x)]

这也与AdaBoost算法权值更新只差了规范化因子,所以等价.
至此证毕

AdaBoost算法的正则化

为了防止AdaBoost过拟合,通常会加入正则化项,通常是加入一个步长vv,即fm(x)=fm1(x)+vαmGm(x)f_m(x)=f_{m-1}(x)+v\alpha_mG_m(x) vv的取值范围(0,1)(0,1),较小的vv意味需要更多弱学习器的迭代次数,通常用步长和最大迭代次数一起决定算法拟合效果

(二)提升树(Boosting Tree)

提升树模型被认为是统计学习中性能最好的方法之一.

提升树模型

以决策树(回归树)为基分类器的提升方法称为提升树(Boosting Tree).决策树或回归树都是二叉树.提升树模型可以表示为决策树的加法模型:fM(x)=m=1MT(x;Θm)f_M(x)=\sum_{m=1}^MT(x;\Theta_m)其中T(x;Θm)T(x;\Theta_m)表示决策树;Θ\Theta表示决策树参数;M为决策树个数

提升树算法

mm步模型是:fm(x)=fm1(x)+T(x;Θm)f_m(x)=f_{m-1}(x)+T(x;\Theta_m)

经验风险极小化:Θ^m=argminΘmi=1NL(yi,fm1(xi)+T(x;Θm))\hat{\Theta}_m=argmin_{\Theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x;\Theta_m))

提升回归树使用平方误差作为损失函数,提升分类树使用指数损失函数(L(y,f(x))=exp(yf(x))L(y,f(x))=exp(-yf(x)),P145),以及一般损失函数的一般问题

对于二分类问题,提升树算法只需要将AdaBoost算法中基本分类器限制为二分类决策树就可以.虽然损失函数是指数函数,事实上是不用直接计算这个损失函数的

提升回归树

已知训练数据T=(x1,y1),(x2,y2),...,(xN,yN)T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}.

回归问题提升树使用以前向分布算法:f0(x)=0f_0(x)=0 fm(x)=fm1(x)+T(x;Θm),m=1,2,...,Mf_m(x)=f_{m-1}(x)+T(x;\Theta_m),m=1,2,...,M fM(x)=m=1MT(x;Θm)f_M(x)=\sum_{m=1}^MT(x;\Theta_m)

在前向分布算法第m步,给定当前模型fm1(x)f_{m-1}(x)需求解:Θ^m=argminΘmi=1NL(yi,fm1(xi)+T(x;Θm))\hat{\Theta}_m=argmin_{\Theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x;\Theta_m))

其中采用平方误差损失函数时,L(y,f(x))=(yf(y))2L(y,f(x))=(y-f(y))^2

L(y,fm1(x)+T(x;Θm))L(y,f_{m-1}(x)+T(x;\Theta_m)) =[yfm1(x)T(x;Θm)]2=[y-f_{m-1}(x)-T(x;\Theta_m)]^2 =[(rT(x;Θ))]2=[(r-T(x;\Theta))]^2

这里, r=yfm1(x)r=y-f_{m-1}(x)

表示当前模型拟合数据的残差,所以对于回归算法来说,只需要简单拟合当前模型的残差.

提升回归树算法

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN)T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}
输出:提升树fM(x)f_M(x)
(1)初始化f0(x)=0f_0(x)=0
(2)对m=1,2,...,Mm=1,2,...,M
\quad\quada.计算残差rmi=yifm1(xi),i=1,2,...,Nr_{mi}=y_i-f_{m-1}(x_i),i=1,2,...,N
\quad\quadb.拟合残差rmir_{mi}学习一个回归树,得到T(x;Θm)T(x;\Theta_m)
\quad\quadc.更新fm(x)=fm1(x)+T(x;Θm)f_m(x)=f_{m-1}(x)+T(x;\Theta_m)
(3)得到提升回归树fM(x)=m=1MT(x;Θm)f_M(x)=\sum_{m=1}^MT(x;\Theta_m)

(三) 梯度提升(gradient boosting decision tree)

相关文章:

  • 2021-08-03
  • 2022-12-23
  • 2021-09-18
  • 2021-12-21
  • 2021-07-11
  • 2021-07-07
  • 2022-12-23
  • 2021-09-03
猜你喜欢
  • 2021-04-18
  • 2021-06-21
  • 2021-10-06
  • 2021-04-18
  • 2021-06-18
  • 2021-08-14
  • 2021-04-09
相关资源
相似解决方案