20.1 集成学习概论
**集成学习(ensemble learning)**通过某种策略构建并结合多个学习器完成学习任务,如果集成中只包含同种类型的个体学习器,这样的集成是"同质"的(homogeneous)。集成也可包含不同类型的个体学习器,即个体学习器由不同的学习算法生成,这样的集成是"异质"的(heterogenous)。
集成学习常可获得比单一学习器显著优越的泛化性能。一般经验中,把好坏不等的东西掺到一起,通常结果会比最坏的要好一些,比最好的要坏一些。集成学习把多个好坏不等的学习器结合起来,如何能获得比最好的个体学习器更好的性能呢?
++获得泛化性能更好的集成学习,个体学习器要有一定的"准确性",并且要有"多样性"(diversity),即个体学习器之间具有差异 (即每个学习器的强项不同)++。
假设集成学习H(x)通过简单投票法结合T个基分类器hi(x),则有
H(x) = sign(Σ(i=1,T) hi(x))
每个基分类器hi(x)对样本x的预测结果为+1(正类)或−1(负类),若总和为正数(超过半数的基分类器预测为正类),则H(x)=+1;若总和为负数(超过半数的基分类器预测为负类),则H(x)=−1。若这超过半数的基分类器预测正确,则集成分类就正确。
假设基学习器误差率 ε<0.5且相互独立,基于Hoeffding不等式,随着集成中基分类器数目T的增大,集成的错误率将指数级下降(最终趋向于零),且对基分类器的错误率ϵ敏感(ϵ越小,下降越快)。基学习器误差率的独立性假设简化了数学推导,但在现实任务中,为解决同一个问题训练出来的个体学习器,错误模式(误差率)必然相关。事实上,个体学习器的准确性和多样性本身也存在冲突。一般的,准确性很高之后,要增加多样性就需牺牲准确性。
++如何产生"好而不同"的个体学习器,并且如何结合,恰是集成学习研究的核心++。
目前集成学习的算法大致可分为两类:
++++1. 个体学习器++++ ++++之++++ ++++间存在强依赖关系、必须++++ ++++串行生成++++ ++++的序列化方法++++ ++++,++++ ++++代表是Boosting++++;
++++2. 个体学习器++++ ++++之++++ ++++间不存在强依赖关系、可同时生成的并行化方法++++ ++++,++++ ++++代表是Bagging 和**"随机森林"(Random Forest)**++++。
20.2 Boosting集成方法
此族集成学习算法的工作机制类似:++++先从初始训练集训练出一个基学习器,根据基学习器的预测表现对训练样本的分布进行调整,使得基学习器出错的训练样本在后续受到更多关注。然后基于调整后的样本分布训练下一个基学习器;如此重复进行,直至基学习器数量达到T++++ 。++++最终将这T个基学习器的结果进行加权结合++++。
20.2.1 AdaBoost算法流程
Boosting族算法最著名的代表是AdaBoost[Freund and Schapire,1997]
AdaBoost算法推导式 (additive model):
++++AdaBoost算法有多种推导方式,比较容易理解的是基于"++++ ++++加性模型"(additive model),即基学习器 (输出结果)的线性组合++++ ++++最小化指数损失函数++++(exponential loss function)[Friedman et al.,2000]
AdaBoost算法流程解读如下:
1:初始化训练集的样本权值分布 D(0) = 1/m
2:for t = 1, 2, ...,T do <依次生成T个基学习器>
3:基于样本权值分布Dt从训练集训练出分类器ht
4:估计ht的误差
5:if et > 0.5 then break
6:根据其误差 et 计算分类器 ht 的权重
<在AdaBoost算法中,第一个基学习器 h1 是通过基学习算法基于初始数据分布生成;此后迭代生成 ht 和 αt,当 ht 基于数据分布 Dt 生成后,++此基学习器的权重 αt 应使得 αt·ht 最小化指数损失函数++ -- 令
对 αt 求偏导且为零,即可得
>
7:更新样本权值分布
,其中Zt是规范化因子,以确保Dt+1是一个分布。
<注意:更新样本权值分布 Dt+1 与AdaBoost基学习器 ht 的指数损失函数 exp(-αt·f(x)ht(x)) 相关,即"根据基学习器 ht 的预测表现对训练样本的分布进行调整,使得 ht 出错的训练样本在后续受到更多关注">
8:生成T个基学习器的for循环完成
输出:
20.2.2 AdaBoost算法推导
++AdaBoost 基学习器输出结果的线性组合 <即 H(x) = Σ(t=1,T) at·ht(x) > 使指数损失函数最小化++ ,令 对 H(x)求偏导且为零可得


所以有 : sign(H(x)) = argmax(y∈{-1,1}) P(f(x)=y | x) <即 模型f(x)最大可能性的输出结果y>
这意味着 sign(H(x)) 达到了贝叶斯最优错误率。也就是说,当指数损失函数最小化,集成学习H(x)分类误差率也将最小化;这说明指数损失函数是分类任务原本0/1损失函数一致的(consistent)替代损失函数。由于这个替代损失函数有更好的数学性质,连续且可微,因此用它替代0/1损失函数作为优化目标。
基于"加性模型"迭代式优化指数损失函数的角度推导AdaBoost算法:
AdaBoost算法在获得 H(t-1) 之后样本分布将进行调整,使下一轮的基学习器 ht 能纠正 H(t-1) 的一些错误。理想的 ht 能纠正 H(t-1) 的全部错误,即最小化
所以,理想的基学习器
... 根据数学期望的定义,可得等价于
由f(x), h(x)∈{-1, +1},有 f(x)h(x) = 1-2I(f(x)≠h(x))
则理想的基学习器
++由此可见,理想的 ht 将在分布 Dt 下最小化分类误差。++ 因此,弱分类器基于分布 Dt 训练,针对 Dt 的分类误差应小于0.5。++这在一定程度上类似**"残差逼近"**的思想++ 。<类似于误差反向传播基于梯度下降法对参数进行调整从而最小化误差函数值。
"残差逼近"是通过分析并最小化观测值与预测值(或目标函数与近似函数)之间的差异(即"残差")优化模型(或方法)的思想,广泛应用于统计学、机器学习、深度学习等工程科学领域。>
20.2.3 重采样法
Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过++"重赋权法"(re-weighting)++ 实施,即在训练过程的每一轮(生成每个基学习器)中,根据更新后的样本分布为每个训练样本重新赋予一个权重。
对无法接受带权样本的基学习算法,则可通过++"重采样法"(re-sampling)++ 处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重新采样而得的样本集对基学习器进行训练。
一般而言,这两种做法没有显著的优劣差别。需注意的是,Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件 (例如检查当前基分类器是否是比随机猜测好)。一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止 <当前生成的基学习器不满足基本条件,无法再更新样本分布>。在此种情形下,初始设置的学习轮数(基学习器数量)T也许还远未达到,可能导致最终集成中只包含很少的基学习器而性能不佳。
若采用"重采样法",可通过"重启动"避免训练过程过早停止[Kohavi and Wolpert,1996],即在抛弃不满足条件的当前基学习器之后,根据当前样本分布对训练样本再重新进行采样,再基于新的采样数据重新训练出基学习器,从而使得学习过程可以持续到预设的T轮(生成T个基学习器)完成。
从++偏差-方差分解++的角度看,Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。以决策树桩为基学习器,在西瓜数据集3.0上运行AdaBoost算法,不同规模(size)的集成及其基学习器所对应的分类边界如图所示:

20.3 Bagging集成方法
希望得到泛化性能强的集成,(集成中的个体学习器应尽可能相互独立,但"独立"在现实任务中无法做到) 可以设法使基学习器尽可能具有较大的差异 -- 一种可能的做法是对给定的训练样本进行采样,产生若干个不同的样本子集,从每个样本子集训练出一个基学习器。由于训练数据不同,可望基学习器具有比较大的差异。然而,如果每个基学习器只用到一小部分训练数据,不足以进行有效学习,这显然无法保证训练出性能比较好的基学习器。为解决这个问题 -
20.3.1 实现Bagging的基本流程
++Bagging[Breiman,1996a]是并行式集成学习方法最著名的代表,它直接基于自助采样法(bootstrap sampling)++
<回顾 "自助采样法":给定包含m个样本的数据集,先随机取得一个样本的复制放入采样集 (下次采样时此样本仍有可能被选中)。经过m次这样的随机采样操作,得到一个包含m个样本的新采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现 (初始训练集中约有63.2%的样本出现在新采样集中)。>
- 可采样T个包含m个训练样本的新样本集,基于每个新样本集训练出一个基学习器,再对预测结果进行结合 (Bagging通常对分类任务使用简单投票,对回归任务使用简单平均),这就是Bagging的基本流程。
若出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可以进一步考察基学习器输出结果的置信度确定最终胜者。
另外,与标准AdaBoost不同,Bagging能不经修改地用于多分类、回归等任务。
<标准AdaBoost采用指数损失函数,是与分类任务原本的0/1损失函数一致的替代损失函数,所以标准AdaBoost用于二分类任务。>
自助采样过程还给Bagging带来另一个优点:采样剩余的约36.8%的样本可用作验证集对Bagging基学习器的泛化性能进行++"包外估计"(out-of-bagestimate)++。
<"包外样本"还有许多其他用途:例如,当基学习器是决策树时,可使用包外样本 (作为验证集) 辅助剪枝 (例如估计决策树各结点的后验概率以对"零训练样本结点"进行处理);当基学习器是神经网络时,可使用包外样本辅助早期停止减小过拟合风险。>
从偏差-方差分解的角度看,Bagging主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。
<回顾"偏差-方差分解":"++偏差++ "度量模型本身(学习算法)对数据的拟合能力;高偏差意味着模型对数据++欠拟合++ (例如算法本身过于简单)。
"++方差++ "度量 (尽管训练集的样本数量相同) 训练集数据的变动所导致的模型性能的变化;高方差意味着模型对训练数据中的细节和噪声++过拟合++>
以基于信息增益划分的决策树为基学习器,在西瓜数据集3.0上运行Bagging算法,不同规模的集成所生成的分类边界如图所示:

20.3.2 随机森林
++随机森林 (Random Forest,简称RF) [Breiman,2001a]是Bagging的一个扩展变体++ 。++RF在以决策树为基学习器的Bagging集成方法的基础上,在决策树的训练过程中引入随机属性选择++。
<传统决策树在训练过程中选择划分属性是在当前属性集合中通过信息增益等准则选择最优属性。>
在RF的训练过程中,个体决策树的每个结点从当前属性集合随机选择k个属性,从这个随机的属性子集中选择最优属性用于划分。这里的参数k控制了随机性的引入程度:若k=d,则基决策树的构建与传统决策树相同;若k=1,则是随机选择一个属性用于划分;一般情况下,推荐值k=log2d[Breiman,2001a]。
随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。值得一提的是,随机森林的训练效率常优于Bagging,因为Bagging个体决策树选择划分属性时,每个结点需要对当前所有属性进行考察,而随机森林只需考察其一个属性子集。