首页 > 代码库 > [笔记]Boosting和Bagging

[笔记]Boosting和Bagging

集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。集成学习通过将多个学习器进行结合,常可以获得比单一学习器显著优越的泛化性能。这对“弱学习器”尤为明显,因此集成学习的很多理论研究都是针对弱学习器进行的。

要获得好的集成,个体学习器应该“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有“多样性”,即学习器之间有差异。

根据个体学习器的生成方式,目前的集成学习方法大致可以分为两大类,即个体学习器间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系,可同时生成的并行化方法,前者的代表是boosting,后者的代表是Bagging和随机森林。

1. Boosting

Boosting是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练数据样本分布进行调整,似的先前基学习器做错的训练样本在后续受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。

Boosting算法最著名的代表是AdaBoost,其可以通过“加性模型”(additive model)来推导得到,即基学习器的线性组合为:

技术分享

来最小化指数损失函数(exponential loss function):

技术分享

若H(x)能令指数损失函数最小化,则考虑用损失函数对H(x)求偏导:

技术分享

这意味着sign(H(x))达到了贝叶斯最优错误率。换言之,若指数损失函数最小化,则分类错误率也将最小化;这说明指数损失函数是分类任务原本0/1损失函数的一致的替代损失函数。由于这个替代函数有更好的数学性质,例如它是连续可微函数,因此我们用它来替代0/1损失函数作为优化目标。

在AdaBoost算法中,第一个基分类器是通过直接将基学习器用于初始数据分布而得;此后迭代地生成下一个基分类器以及其对应的加权权重分。当基分类器基于当前的数据分布得到后,该基分类器的权重应使得其最小化指数损失函数:

技术分享

AdaBoost算法在获得 Ht-1后样本分布将进行调整,使得下一轮的基学习器ht能纠正Ht-1的一些错误。理想情况下能纠正全部错误,即最小化:

技术分享

技术分享

由此可见,理想的ht将在分布Dt下最小化分类误差。因此,弱分类器将基于分布Dt来训练,且针对Dt的分类误差应小于0.5.这在一定程度上类似“残差逼近”的思想。考虑Dt和Dt+1的关系,有:

技术分享

于是,我们可以从基于“加性模型”和优化”指数损失函数“的角度推导出AdaBoost算法:

技术分享

 

Boosting算法要求基学习器能对特定数据分布进行学习,这可以通过”重赋权法“或者”重采样法“来处理。

从偏差-方差分解的角度(http://www.cnblogs.com/bentuwuying/p/6654536.html)来看,Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

 

2. Bagging与随机森林

欲得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立;虽然”独立“在现实任务中无法做到,但可以设法使基学习器尽可能具有较大的差异。给定一个训练数据集,一种可能的做法就是对训练样本进行采样,产生出若干个不同的子集,再从每个子集中训练出一个基学习器。由于训练数据的不同,我们获得的基学习器可望具有较大的差异。然而,为获得较好的集成,我们同时还希望个体学习器不能太差。如果采样的每个子集都完全不同,则每个学习器只用到了一小部分训练数据,甚至不足以进行有效学习,这显然无法保证产生出较好的基学习器。为解决这个问题,我们可以考虑使用互相有交集的采样子集。这就是Bagging的思想。

从偏差-方差分解的角度看,Bagging主要关注的是降低方差,因此它在不剪枝决策树,神经网络等易受样本扰动的学习器上效果更为明显。

随机森林(RF)是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入随机属性选择。在RF中,对基决策树的每个结点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。一般情况下,推荐k=log2d,d是所有的属性集合。

随机森林中的基学习器的多样性不仅来自于样本扰动,还来自于属性扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。

 

学习器结合可能会从三方面带来好处。

1. 从统计的方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若使用单学习器可能因误选而导致泛化性能不佳,结合多个学习器可以减小这个风险。

2. 从计算的方面来看,学习算法往往会陷入局部极小,有的局部极小点所对应的泛化性能可能很糟糕,而通过多次运行之后进行结合,可降低陷入糟糕局部极小点的风险。

3. 从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器肯定无效,而通过结合多个学习器,由于相应的假设空间有所扩大,有可能学得更好的近似。

 

[笔记]Boosting和Bagging