集成学习学习笔记(1)

集成学习
集成学习,顾名思义就是将多个学习器集成在一起来完成某个任务。其一般结构为:

先产生一组个体学习器;
然后再用某种策略将这些个体学习器结合起来。
但是并不是说把任何的个体学习器结合起来都可以有效果的提升,其对于学习器的准确率和多样性是有一定要求的,如下例所示:

这里写图片描述

我们可以看到,对于第二种学习器集成方式,由于其三个学习器对于测试集的预测结果都是一样的,虽然每个学习器的准确率比较高,但是集合在一起并没有达到我们预想的性能提升的目的;对于第三种学习器的集成,虽然其多样性得到了保证,但是每个学习器的准确率很低,导致在集成之后性能不升反降;而对于第一种学习器的集成,因为其即保证了个体学习器的准确性,又保证了不同学习器之间的差异性,从而在集成之后性能相对于个体学习器有了很大的提升。因此,对于集成学习,想要达到预想中相对于个体学习器性能的提升,我们即需要保证每个个体学习器自身比较高的准确率,还要保证学习器的多样性。但是实际上个体学习器的准确性和多样性是冲突的,即学习器的准确性如果很高的话,要增加多样性就需要牺牲准确性。对于集成学习,如何产生好而不同的个体学习器一直都是集成学习的研究核心。而且通常来说对于弱学习器,其集成后的性能提升是要优于强学习器的。
对于集成学习,个体学习器的差异会带来集成策略的不同。当我们的个体学习器都是同质的(学习器都是同种类型的),此时的个体学习器我们成为基学习器,其主要由两大类集成策略是:Boosting和Bagging;当个体学习器是异质的,集成策略的典型代表是Stacking算法。

Boosting
Boosting是一族可将弱学习器提升为强学习器的算法,该算法的学习机制是:首先基于初始训练集样本训练一个基学习器,然后根据该学习器的表现来对训练集样本的分布进行调整从而使得下一次训练的时候学习器能够更加care前一个学习器学习错误的样本而减少对学习正确样本的关注;然后让调整后的样本作为训练集再训练一个基学习器,重复上面的步骤直至基学习器的个数达到了我们的要求T。我们可以看到boosting算法的核心在于其会不断的依据上一次学习器的训练结果来调整下一次训练的训练集的样本分布从而使得下一次的学习器更加的关注上一次学习器错分的样本,因此boosting算法都是一种强关联算法,即各个学习器之间的依赖性很强,其训练是按照序列化的方式来进行训练的。

AdaBoost
target:求得能够使得在样本分布Dt下关于ht(x)的指数损失函数最小的参数α
AdaBoost是最常用的Boosting算法。在这里先假设我们的真实函数为f(x),第t个基学习器为ht(x),由基学习器组成的集成模型为H(x)=∑Tt=1αtht(x),那么我们学习的目标就是要最小化指数损失函数

l(H|D)=Ex∼D[e−f(x)H(x)]
。我们可以看到当真实函数的值与集成模型预测的值越接近,那么损失函数的值也就越接近于0。那么对于第t个学习器在Dt的样本分布下,其损失函数即为
lt(ht(x)|Dt)=Ex∼Dt[e−f(x)αtht(x)]=e−αtP(f(x)=ht(x))+eαtP(f(x)≠ht(x))

让损失函数关于αt求导并为0有:
αt=12lnP(f(x)=h(x))P(f(x)≠h(x))=12ln1−ϵtϵt
这样我们就得到了使得损失函数最小的第t个分类器权重值。
target:证明在样本分布Dt下的损失函数最小和在原样本分布上的损失函数最小是等价的,并导出样本分布Dt的调整方式
AdaBoost算法在获得第Ht−1之后样本分布将进行调整,使下一轮的基学习器ht能纠正Ht−1的一些错误。最好的情况就是ht学习器纠正了Ht−1所有的错误。因此我们可以设定我们的目标为最小化损失函数

l(Ht−1(x)+ht(x)|D)=E[e−f(x)(Ht−1(x)+ht(x))]
关于该损失函数我们可以做如下变化:
l(Ht−1(x)+ht(x)|D)=E[e−f(x)(Ht−1(x)+ht(x))]=E[e−f(x)Ht−1(x)⋅e−f(x)ht(x)]=E[e−f(x)Ht−1(x)⋅(1−f(x)ht(x)+12]f2(x)h2t(x))=E[e−f(x)Ht−1(x)⋅(32−f(x)ht(x))]≈E[e−f(x)Ht−1(x)Ex∼D[e−f(x)Ht−1(x)]]⋅(32−f(x)ht(x))]

在这里说明一下,另t=−f(x)ht(x),那么从e−f(x)ht(x)到1−f(x)ht(x)+12是对函数et在t=0处泰勒展开的结果
那么最小化损失函数l就相当于:
minht(x);DE[e−f(x)Ht−1(x)Ex∼D[e−f(x)Ht−1(x)]]⋅(32−f(x)ht(x))]

如果我们另样本Dt=D⋅e−f(x)Ht−1(x)Ex∼D[e−f(x)Ht−1(x)],那么在样本分布D下的最小化损失函数等价于在样本分布Dt下的样本分布
minht(x);Dtmaxht(x);DtE[32−f(x)ht(x)]E[f(x)ht(x)]或

我们可以看到,在上面的公式中,当真实函数f(x)的值与预测函数ht(x)的值相同的越多,E[f(x)ht(x)]的值就越大,因此上面的目标函数还可以写成
minht(x);DtE[I(f(x)≠ht(x))]

即理想的基学习器
ht(x)=argminhEx∼Dt[I(f(x)≠h(x))]

对于样本分布的变化,有:
Dt+1=D⋅e−f(x)Ht(x)Ex∼D[e−f(x)Ht(x)]=D⋅e−f(x)Ht−1(x)−f(x)αht(x)Ex∼D[e−f(x)Ht(x)]=D⋅e−f(x)Ht−1(x)Ex∼D[e−f(x)Ht−1(x)]⋅e−f(x)αtht(x)⋅Ex∼D[e−f(x)Ht−1(x)]Ex∼D[e−f(x)Ht(x)]=Dt⋅e−f(x)αtht(x)⋅Ex∼D[e−f(x)Ht−1(x)]Ex∼D[e−f(x)Ht(x)]

这样我们就得到了样本的调整方式。通过上面对算法的描述我们可以看到AdaBoost算法的学习方式是一个渐进的过程,即后一个基学习器在学习的时候更加关注前一个基学习器学错的样本。这一点我们通过样本调整公示就可以看到,当真实函数f(x)的值与预测值h(x)不相等的时候,e的值是在不断变大的,当相等的时候,是变小的,因此在样本分布调整之后,我们会看到分错样本的权值会变大而分对样本的权值则会变小。而且由于参数α的存在,使得权重越大的基学习器对样本分布的变化影响越大。而且由于前面学习器学习的结果对于后面学习器学习的偏好有很大的影响,因此我们说AdaBoost算法的学习器之间是强关联的。
这里说到样本,着重说一下样本权值怎么使用的问题,对于可接受样本权值的基学习算法,我们的样本权值对学习器偏好的影响是在损失函数部分,即在计算损失函数的时候,是进行有权运算的,如下所示
J=∑i=1nωiI(f(xi)≠yi)
其中n为样本个数,样本参数ω的初始值为ωi=1n。而对于那些无法使用带权样本的基学习算法,我们通过重采样的方式来影响每个学习器的偏好,我们对每个学习器的训练都是基于全训练集的一个子集进行训练,即我们以样本权值作为是否选取该样本作为本学习器的训练样本的概率值,直到选出K个样本为止。
这里有一点需要注意,那就是我们在训练的每一轮都要检查该学习器的学习性能,如果该学习器的误差ϵ>0.5,那么我们就立即抛弃该学习器并停止学习。这是因为如果误差大于0.5就会导致学习器的权值小于0,这是不可接受的。因此AdaBoost在使用带权样本进行学习时可能会导致早停的现象发生。而对于基于重采样的方式,当该学习器不满足条件的时候,可以重新采样再学习一个新的学习器,因此重采样的方式可以获得重启动的机会从而避免早停问题的发生。因为如果发生早停,可能导致集成的学习器性能不佳,因为目标轮数可能远远未达到。
还有一点就是Boosting算法会更加关注如何降低偏差,我们通过其学习的方式就可以看出来,每一个新的学习器的目标是不断降低残差的,即更关注没有学明白的样本,因此Boosting算法能基于泛化能力非常弱的学习器构建出很强的集成学习器。
AdaBoost伪代码(来源于周志华老师的机器学习书,如果侵权请联系本人删除,谢谢):
这里写图片描述

由于集成学习内容很多,故分成两部分来记笔记。

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/batuwuhanpei/article/details/52045977

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值