参考了统计学习方法,西瓜书,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},假定基分类器的分类误差率为ϵ,即对每一个基分类器Gi有:P(Gi(x)̸=y)=ϵ
假定集成通过简单投票法来结合T个基分类器,若有超过半数的基分类器正确,则集成分类就正确,这里使用符号函数sign来表示投票过程:G(x)=sign(i=1∑TGi(x))
集成学习预测错误的条件是:k个基分类器预测正确,其中k≤⌊2T⌋,T−k个基分类器预测错误.
假设基分类器的错误率相互独立,则集成学习器分类误差率为:p(H(x)̸=y)=k=0∑⌊2T⌋CTk(1−ϵ)kϵ(T−k)(1)这里对上式的理解是,每个基分类器误分概率是ϵ,所以正确分类的概率为(1−ϵ),那么要想求整体误分概率,由于是投票方式集成,因此只需要误分的基分类器数量大于正确分类的基分类器数量就可以,所以是个组合问题.
根据Hoeffding不等式有:p(H(x)̸=y)=k=0∑⌊2T⌋CTk(1−ϵ)kϵ(T−k)≤exp(−21T(1−2ϵ)2)(2)
解释:对于服从伯努利分布(1或0)抛硬币游戏,如果过设置单次抛掷硬币A面向上的概率是p,则B面向上为1−p。那么抛掷n次,A面朝上的次数不超过k次的概率为:P(H(n)≤k)=i=0∑kCnipi(1−p)n−i,这里H(n)表示n次抛硬币A面向上次数.
对于k,存在某一γ,当k=(p−γ)n时,有:P(H(n)≤k)=P(H(n)≤(p−γ)n)≤exp(−2γ2n)这就是伯努利分布的Hoeffding不等式。
对应(1)式中,把T个分类器的判断看为T次抛硬币,A面向上的次数小于等于2T,所以存在有2T=(ϵ−γ)T,解出:γ=ϵ−21
所以可以改写为P(H(T)≤2T)≤exp(−2(ϵ−21)2T),所以有(2)式成立.(2)式显示出,随着集成中个体分类器数目T的增大,集成的误差率将指数级下降(因为误差率的上界是指数函数),最终趋于0,但是这建立在关键性假设上:基学习器的误差相互独立.
集成学习大体可以分为两类:
1.个体学习器之间不存在强依赖关系,可以同时生成的并行化方法,代表是Bagging和随机森林(RandomForests)(并行生成)
2.个体学习器之间存在强依赖关系,必须串行生成的序列化方法,每一轮迭代产生一个个体学习器,代表方法是Boosting(串行生成)
一 随机森林(Random Forests)
Why
树模型一般来说是高方差,低偏差的,也就是容易过拟合.而且分类树模型的另一个缺点是它们是不稳定的,也是就是当数据发生微小变化时,会导致另外一个完全不同的树模型.而随机森林是可以解决不稳定性和过拟合的最有效方法之一.
随机森林基于两个基本概念,称为bagging和subspace sampling
Bagging
给定包含m个样本的数据集,我们先随机选取一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时,该样本仍有可能被选中,这样经过m次随机采样,我们得到含有m个样本的采样集.这样有的样本会多次出现.我们可以采集T个含有m个样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合.Bagging对于分类通常也是采取简单投票方式来集成基学习器,而对于回归则采取平均来集成基学习器.
随机森林
随机森林是Bagging的一个扩展变体.RF以决策树作为基学习器然后构建Bagging集成。最重要的是在构建决策树过程中,引入随机属性选择,也即是传统决策树选择划分属性时,是在当前节点的属性集合中选择一个最优属性(设总共有d个属性),而在RF中,对于决策树的每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分.这里参数k控制随机性程度,当k=d时,与传统构建一样,当k=1时,则是随机选择一个属性划分.一般选取k=log2(d)
极致随机森林
在极随机化的树中(参见ExtraTreesClassifier和ExtraTreesRegressor类),随机性在计算分割的方式上更进了一步。 与在随机森林中一样,使用候选特征的随机子集,但是不是寻找最具辨别力的阈值,而是针对每个候选特征随机绘制阈值,并且挑选这些随机生成的阈值中的最佳阈值作为分裂规则。这通常允许更多地减少模型的方差,代价是偏差略微增加(参考Sklearn documentation)
优点
简单,易实现,计算开销小
二 提升方法(Boosting)-AdaBoosting
提升方法就是从弱学习算法出发,反复学习,得到一系弱分类器(基分类器),然后组合这些弱分类器,构成强分类器。大多数提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器
提升方法要解决的两个问题:
1.在每一轮如何改变训练数据的权值或概率分布
2.如何将弱分类器组合成强分类器
AdaBoosting的解决方式:
1.提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值,这样可以加大后一轮的弱分类器对错误分类样本的关注
2.AdaBoosting采用加权多数表决的方法.具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大作用,减小分类误差率大的弱分类器权值,使其在表决中起较小作用.
(一) AdaBoosting算法
AdaBoost二类二分类问题算法
假设给定一个二分类的训练数据集:T={(x1,y1),(x2,y2),...,(xn,yn)}其中y∈{+1,−1}
输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)};弱学习算法;
输出:最终分类器G(x)
1.初始化训练数据的权值分布D1=w11,...,w1i,...,w1n,w1i=N1,i=1,2,..,N
2.对m=1,2,...,M:
(a).使用具有权值分布Dm的训练数据学习,得到基分类器:Gm(x):X→+1,−1
(b).计算Gm(x)在训练数据集上的分类误差率:em=P(Gm(x)̸=y)=i=1∑NwmiI(Gm(xi)̸=yi)(也就是误分类样本的权值之和)(1)
©.计算Gm(x)的系数:αm=21logem1−em(2)
(d).更新训练数据集的权值分布:D1=wm+1,1,...,wm+1,i,...,wm+1,n wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2..,N(4) 即:wm+1,i={Zmwmie−αm,Gm(xi)=yiZmwmieαm,Gm(xi)̸=yi
相对正确分类样本,误分类样本权值被放大e2αm倍,这里Zm是规范化因子(目的是使权值在0−1之间且和为1)Zm=i=1∑Nwmiexp(−αmyiGm(xi))(5)
3.构建基本分类器的线性组合:f(x)=m=1∑MαmGm(x)(6)注意线性组合实现M个基本分类器的加权表决,其符号表示实例x的类别,f(x)的值表示分类的确信度,αm之和并不为1
得到最终分类器:G(x)=sign(f(x))=sign(m=1∑MαmGm(x))(7)
对于AdaBoost多元分类算法,原理与二元分类似,主要区别在弱分类器系数上.比如AdaBoost SAMME算法,其弱分类器系数:
αm=21log(em1−em)+log(K−1)其中K表示类别数,当为二分类时K=2,此时系数α就和原算法一样了.论文http://web.stanford.edu/~hastie/Papers/samme.pdf
AdaBoost回归问题算法
这里使用AdaBoost R2回归
输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)};弱学习算法;
输出:最终强学习器G(x)
1.初始化训练数据的权值分布D1=w11,...,w1i,...,w1n,w1i=N1,i=1,2,..,N
2.对m=1,2,...,M:
(a).使用具有权值分布Dm的训练数据学习,得到弱分类器Gm(x)
(b).计算Gm(x)在训练数据集上每个样本的相对误差:
线性误差emi=Emyi−Gm(xi),i=1,2,...,N
平方误差emi=Em2(yi−Gm(xi))2,i=1,2,...,N
指数误差emi=1−exp(Em−(yi−Gm(xi))),i=1,2,...,N
其中Em是训练集上最大误差Em=max∣yi−Gm(xi)∣,i=1,2,...,N
©.计算Gm(x)在训练数据集上回归误差率: em=i=1∑Nwmiemi
(d).计算弱学习器权重系数αm=1−emem
(e).更新样本集权重分布wm+1,i=Zmwm,iαm1−emi,i=1,2,...,N
Zm=i=1∑Nwm,iαm1−emi,i=1,2,...,N
3.构建最终强学习器G(x)=m=1∑M(lnαm1)Gm(x)
import sklearn.ensemble
import numpy as np
import matplotlib.pyplot as pl
import math
e=np.arange(0.1,1,0.01)
αm=21logem1−em的图像,em≤21时,α≥0,而且α随着em的减小而增大
a=0.5*np.log((1-e)/(e))
pl.plot(e,a)
pl.show()

AdaBoost误差分析
定理1 AdaBoost算法最终分类器的训练误差界为:
N1i=1∑NI(G(xi)̸=yi)≤N1i=1∑Nexp(−yif(xi))=m∏Zm这里G(x)来自式(7),f(x)来自式(6),Zm来自(5).这一定理说明可以在每一轮选取适当Gm使得Zm最小,从而使训练误差下降最快
证明:
当G(xi)̸=yi时I=1,yif(xi)<0,此时exp(−yif(xi))≥1,当G(xi)̸=yi时I=0,yif(xi)>0,此时exp(−yif(xi))≤1.N1i=1∑NI(G(xi)̸=yi)≤1由此直接推出前一部分.
后一部分:
根据(4)式我们有wmiexp(−αmyiGm(xi))=Zmwm+1,i(8)
推导:N1i∑Nexp(−yif(xi))=N1i∑Nexp(−m=1∑MαmyiGm(xi))
=N1i∑Nm=1∏Mexp(−αmyiGm(xi))由于w1,i=N1所以有=i∑Nw1im=1∏Mexp(−αmyiGm(xi))再是使用(8)式则有=Z1i∑Nw2im=2∏Mexp(−αmyiGm(xi)) =Z1Z2i∑Nw3im=3∏Mexp(−αmyiGm(xi))
=...
=m=1∏MZm
定理2 对于二分类问题的AdaBoost训练误差界有:
m=1∏MZm=m=1∏M[2em(1−em)]=m=1∏M(1−4γm2)≤exp(−2m=1∑Mγm2)
这里γm=21−em
证明:由(5)式有:Zm=i=1∑Nwmiexp(−αmyiGm(xi)) =G(xi)=yi∑wmie−αm+G(xi)̸=yi∑wmieαm =(1−em)e−αm+emeαm =2em(1−em)=1−4γm2
根据ex和1−x在x=0处的泰勒展开式推出不等式(1−4γm2)≤exp(−2γm2)
推论如果存在γ>0对所有γ<γm则:N1i=1∑NI(G(xi)̸=yi)≤exp(−2Mγ2)
这表明此条件(二分类)下AdaBoost的训练误差是以指数速率下降的,这是训练误差上界是指数函数.
AdaBoost算法的解释
AdaBoost算法另一个解释:AdaBoost是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法的二分类学习方法.
前向分步算法
考虑加法模型:f(x)=m=1∑Mβmb(x;γm)
其中,b(x;γm)为基函数,γm为基函数参数,βm为基函数系数.显然(6)式:$f(x)=\sum_{m=1}^M\alpha_mG_m(x) $也是一个加法模型
在给定训练数据及损失函数L(y,f(y))的条件下,学习加法模型f(x)的问题,成为经验风险极小化即损失函数极小化问题:minβm,γmi=1∑NL(yi,m=1∑Mβmb(x;γm))(14)
前向分布算法求解这个问题思路:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式(14),那么就可以简化优化的复杂度.具体的,每一步只需要优化如下损失函数:minβ,γi=1∑NL(yi,βb(xi,γ))(15)
具体的前向分布算法:
输入:训练数据集T=(x1,y1),(x2,y2),...,(xn,yn);损失函数L(y,f(x));基本函数集b(x;γ);
输出:加法模型f(x).
(1)初始化f0(x)=0
(2)对m=1,2,...,M:
a.极小化损失函数argminβ,γi=1∑NL(yi,fm−1(xi)+βb(xi;γ))(16) 得到参数βm,γm
b.更新fm(x)=fm−1(x)+βmb(x;γm)(17)
(3).得到加法模型f(x)=fM(x)=m=1∑Mβmb(x;γm)(18)
AdaBoost与前向分步算法
定理3 AdaBoost是前向分步算法的特例.AdaBoost模型是基分类器组成的加法模型,损失函数是指数函数
证明:
由于AdaBoost的最终分类器是f(x)=∑m=1MαmGm(x),本身就是一个加法模型,因此我们只需要证明其损失函数是指数函数L(y,f(x))=exp(−yf(x))时,其学习的具体操作等价于AdaBoost算法学习的具体操作.
假设经过m−1轮迭代前向分布算法已经得到fm−1(x):fm−1(x)=fm−2(x)+αm−1Gm−1(x)=α1G1(x)+...+αm−1Gm−1(x)
第m轮迭代可以得到αm,Gm(x)和fm(x):fm(x)=fm−1(x)+αmGm(x)目标是使前向分步算法得到的αm和Gm(x)使fm(x)在训练数据集T上的指数损失函数最小,即(αm,Gm(x))=argminα,Gi=1∑Nexp(−yi(fm−1(xi)+αG(xi)))(20)
上式可以表示为:(αm,Gm(x))=argminα,Gi=1∑Nwˉmiexp[−yiαG(xi)](21)
其中wˉmi=exp[−yifm−1(xi)],因为wˉmi既不依赖于α也不依赖于G,所以与最小化无关.但是wˉmi依赖于fm−1(x),随着每一轮迭代而发生变化
下面证明,使得式(21)式达到最小的αm∗,$G_m^\ast(x) 就是AdaBoost算法所得到的\alpha_m和G_m(x)$,求解(21)式分两步:
首先,求Gm∗(x),对任意α>0,使式(21)最小的G(x)由下式得到:Gm∗(x)=argminGi=1∑NwˉmiI(yi̸=G(xi))(22)
其中wˉmi=exp[−yifm−1(xi)],这里(22)和(21)式实际上是等价的,因为对∑i=1Nwˉmiexp[−yiαG(xi)]求最小值,α>0,wˉmi可看为常量,所以只用每个yiG(xi)最大,那么也就是尽量让I(yi̸=G(xi))的在整个数据集上的数量最小.也就是下面这句话
此分类器Gm∗(x)即为AdaBoost算法的基分类器Gm(x),因为他是使得第m轮加权训练数据分类误差率最下的基本分类器.wˉmi就是数据权值
然后求解αm∗,式(21)可写成如下:i=1∑Nwˉmiexp[−yiαG(xi)] =Gm(xi)=yi∑wˉmie−α+Gm(xi)̸=yi∑wˉmieα
=(eα−e−α)i=1∑NwˉmiI(yi̸=G(xi))+e−αi=1∑Nwˉmi
将上式对α求导:简化为((eα−e−α)h1+e−αh2)′令eα=x求导并使导数为0可以得x2=h1h2−h1,然后解出αm∗=21logh1h2−h1,最后αm∗=21logem1−em
其中em=∑i=1Nwˉmi∑i=1NwˉmiI(yi̸=G(xi))=∑i=1NwmiI(yi̸=Gm(xi))表示分类误差率,这与AdaBoot的αm完全一样
在看样本权值更新是否与AdaBoost一样
由fm(x)=fm−1(x)+αmGm(x)和wˉmi=exp[−yifm−1(xi)],那么有wˉm+1,i=exp[−yifm(xi)]=exp[−yi(fm−1(x)+αmGm(x))]=exp[−yifm−1(x)]exp[−yiαmGm(x)] wˉm+1,i=wˉm,iexp[−yiαmGm(x)]
这也与AdaBoost算法权值更新只差了规范化因子,所以等价.
至此证毕
AdaBoost算法的正则化
为了防止AdaBoost过拟合,通常会加入正则化项,通常是加入一个步长v,即fm(x)=fm−1(x)+vαmGm(x) v的取值范围(0,1),较小的v意味需要更多弱学习器的迭代次数,通常用步长和最大迭代次数一起决定算法拟合效果
(二)提升树(Boosting Tree)
提升树模型被认为是统计学习中性能最好的方法之一.
提升树模型
以决策树(回归树)为基分类器的提升方法称为提升树(Boosting Tree).决策树或回归树都是二叉树.提升树模型可以表示为决策树的加法模型:fM(x)=m=1∑MT(x;Θm)其中T(x;Θm)表示决策树;Θ表示决策树参数;M为决策树个数
提升树算法
第m步模型是:fm(x)=fm−1(x)+T(x;Θm)
经验风险极小化:Θ^m=argminΘmi=1∑NL(yi,fm−1(xi)+T(x;Θm))
提升回归树使用平方误差作为损失函数,提升分类树使用指数损失函数(L(y,f(x))=exp(−yf(x)),P145),以及一般损失函数的一般问题
对于二分类问题,提升树算法只需要将AdaBoost算法中基本分类器限制为二分类决策树就可以.虽然损失函数是指数函数,事实上是不用直接计算这个损失函数的
提升回归树
已知训练数据T=(x1,y1),(x2,y2),...,(xN,yN).
回归问题提升树使用以前向分布算法:f0(x)=0 fm(x)=fm−1(x)+T(x;Θm),m=1,2,...,M fM(x)=m=1∑MT(x;Θm)
在前向分布算法第m步,给定当前模型fm−1(x)需求解:Θ^m=argminΘmi=1∑NL(yi,fm−1(xi)+T(x;Θm))
其中采用平方误差损失函数时,L(y,f(x))=(y−f(y))2
即L(y,fm−1(x)+T(x;Θm)) =[y−fm−1(x)−T(x;Θm)]2 =[(r−T(x;Θ))]2
这里, r=y−fm−1(x)
表示当前模型拟合数据的残差,所以对于回归算法来说,只需要简单拟合当前模型的残差.
提升回归树算法
输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN)
输出:提升树fM(x)
(1)初始化f0(x)=0
(2)对m=1,2,...,M:
a.计算残差rmi=yi−fm−1(xi),i=1,2,...,N
b.拟合残差rmi学习一个回归树,得到T(x;Θm)
c.更新fm(x)=fm−1(x)+T(x;Θm)
(3)得到提升回归树fM(x)=m=1∑MT(x;Θm)