机器学习(周志华)- 第8章集成学习笔记
个体与集成
集成学习通过构建并结合多个学习器来完成学习任务,有时也被称作为多分类系统、基于委员会的学习等。
集成学习的一般结构:先生成一组“个体学习器”,再用某种策略将他们结合起来。
集成学习分为同质(同种类型学习器)和异质(不同类型学习器)。
集成学习通过将多个学习器进行结合,常可以获得比单一学习器显著优越的泛化性能,这对“弱学习器”(指泛化性能略优于随机猜测的学习器)尤为明显。
要想获得好的集成,个体学习器应该“好而不同”,即个体学习器要有一定的准确性,并且要有多样性。但是准确性与多样性通常会产生冲突,因为个体学习器往往是为解决同一个问题训练出来的,不可能存在相互独立。如何产生好而不同的学习器是学习研究的核心。
目前集成学习的方法大致可以分为两种:
- 个体学习器之间存在强依赖关系、必须串行生成的序列化方法。(Boosting)
- 个体学习器之间不存在强依赖关系、可同时生成的并行化方法。(Bagging和RF)
Boosting
Boosting是一族将弱学习器提升为强学习器的算法。工作机制如下:
先从初始训练集中训练出一个基学习器,再根据基学习器的表现对训练样本进行调整,使得先前基学习器做的的训练样本在后继受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器的数目达到实现指定的值T,最终将这T个学习器进行加权结合。
AdaBoost
Boosting 族算法最著名的代表是AdaBoost。该算法有多重推导方式,比较容易理解的是“加性模型”,即基学习器的线性组合来最小化指数损失函数。
算法基本流程如下:
- 初始化样本权值分布
- 基于分布Dt从数据集中训练出分类器ht
- 估计ht的误差,若误差>0.5则重新下一轮训练
- 确定分类器ht的权重
- 更新样本分布
- 若未达到预制的训练轮数,则继续进行训练
Boosting算法要求基学习器能对特定的数据分布进行学习,这可以通过“重赋权”实施,即在训练的每一轮中,根据样本为每个训练样本重新赋予一个权重。
对于无法接受带权样本的基学习算法,可以通过“重采样”来处理,再用重采样的样本集对基学习器进行训练。一般而言这两种算法没有优劣差别。
需要注意的是Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(检查基分类器是否比随机猜测好),一旦条件不满足,当前基学习器被抛弃掉,学习过程停止。
在这种情形下,初始设置的学习轮数T也许还远远未达到,可能导致最终集成中只包含很少的基学习器而导致性能不佳。
若采用“重采样”,则可以获得“重启动”机会避免过早停止。即在抛弃不满足条件的当前基学习器之后,根据当前的分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预制的T轮。
从“偏差-方差”分解的角度看,Boosting主要关注降低偏差,因此基于泛化性能相当弱学习器能构建出很强的集成。
标准差也叫标准偏差。
偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据,如下图第二行所示。
方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散,如下图右列所示。
引用来源
Bagging与随机森林
为了训练出独立的学习器,我们可以考虑用不同的样本的子集分别产生学习器,然而这样每个基学习器值用到了一小部分的训练样本,甚至不足以有效学习,无法确保产生较好的基学习器,为解决这个问题,我们考虑使用互相有交叠的采样子集。
Bagging
Bagging是“并行式”集成学习方法中最著名的代表,基于我们之前介绍的自主采样法。
- 给定包含m个样本的数据集,随机取出一个样本放入采样机,再将样本放回初始数据集,使得下次采样仍有可能被选中,经过m次随机采样,得到m个样本的数据集,初始数据集中约63.2%出现在采样集中。
- 我们采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。
- 在对预测输出进行结合的时候,Bagging通常对分类任务采用简单投票法,回归任务采用简单平均法,若遇到相同票数则随机选择一个或者根据投票置信度来选择。
训练一个Bagging集成与直接使用基学习算法训练一个学习器复杂度同阶,说明是一个高效的集成算法,与标准AdaBoost只适用于二分类任务不同,Bagging可以不经修改的用于多分类、回归等任务。
自助采样的优点
由于只用了原始训练集的63.2%样本进行训练,剩下的36.8%可以用作验证集来对泛化性能进行“包外估计”。
包外估计还可以辅助决策树进行剪枝,或者估计决策树中各节点的后验概率用于辅助对零训练样本节点的处理;还可以辅助神经网络早期停止减小过拟合风险。
从“偏差-方差”分解的角度看,Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等易受样本扰动的学习器上效用更为明显。
随机森林(Random Forest,RF)
随机森林是Bagging的一个扩展变体。RF在以决策树为基学习器,构建Bagging的基础上,进一步在决策树的训练过程中引入了随机属性选择。
具体来说,传统的决策树在选择划分属性的时候是在当前节点的属性集合中选择一个最优属性,而在RF中,对基决策树的每个节点,先从该节点的属性集中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
这里的参数k控制了随机性的引入程度,若令k=d,则基决策树的构建与传统决策树相同;
若k=1,则随机选择一个属性进行划分;一般情况下推荐k=log_2 d
随机森林简单,容易实现,计算开销小,令人惊奇的是,在很多现实任务中展现出强大的性能,誉为“代表集成学习技术水平的方法”。
可以看出,随机森林对Bagging只做了微小的改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自于样本扰动,还来自于属性扰动,这就使得最终集成的泛化性能可以通过个体学习器之间的差异度的增加而进一步提升。
随机森林的收敛性与bagging相似,随机森林其实性能很差,随着个体学习器增加,会收敛到更低泛化性能。
随机森林训练效率通常优于bagging,因为在个体决策树的构建过程中,bagging使用的是“确定型”决策树,需要考虑全部属性,但是随机森林使用的是“随机型”只需要考虑一个属性集合。
随机森林的优点
0. 在数据集上表现良好
1. 在当前的很多数据集上,相对其他算法有着很大的优势
2. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择
3. 在训练完后,它能够给出哪些feature比较重要
4. 在创建随机森林的时候,对generlization error使用的是无偏估计
5. 训练速度快
6. 在训练过程中,能够检测到feature间的互相影响
7. 容易做成并行化方法
8. 实现比较简单
RF小结
随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
在建立每一棵决策树的过程中,有两点需要注意 - 采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。
按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。
结合策略
学习器结合可能会从三个方面带来好处。
- 统计方面
由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若使用单学习器可能导致泛化性能不佳。结合多个学习器可以减少这一风险。 - 计算方面
学习算法会陷入局部极小值,有的局部极小值对应的泛化性能可能很糟,多次运行可以降低陷入糟糕局部极小点的风险 - 表示方面
某些学习任务的真实假设可能不在当前学习算法的假设空间中,此时若使用单学习器肯定无效,而应该通过多结合多个学习器,扩大假设空间才能获得更好近似。
平均法(数值型)
- 简单平均法
- 加权平均法
由于加权平均法一般是从训练数据中学习而得,现实任务中训练样本通常不充分或者存在噪声,使得学出来的权值不可靠。同时学习的权重过多会导致过拟合,因此加权平均未必优于简单平均。
一般性能相差大学习器加权平均,相近简单平均。
投票法(分类任务)
- 绝对多数投票法
超过半数预测为该标记 - 相对多数投票法
预测得票最多的为该标记 - 加权投票法
学习法
当训练数据很多的时候,可以通过另一个学习器来进行结合。
代表算法Stacking。把个体学习器称作初级学习器,用于结合的学习器称作次级学习器或者元学习器。
Stacking先从初始数据集中训练出初级学习器,然后生成一个新数据集来训练次级学习器。在这个新数据集里,初级学习器的输出被当成次级学习器的输入,而初始样本的标记仍当做样例标记。
多样性增强
数据样本扰动
通常基于采样法,如Bagging使用自主采样,AdaBoost使用序列采样。
数据样本扰动对“不稳定基学习器”有效,如决策树,神经网络等;对另一些不敏感,如线性学习器、支持向量机、朴素贝叶斯、k近邻等“稳定基学习器”。
输入属性扰动
适用于大量冗余属性的数据,若只有少量数据或者冗余少不适用。
随机子空间法就是随机抽取若干属性自己,分别训练学习器。
输出表示扰动
- 对类标记稍作变得,如“翻转法”
- 对输出进行转化“输出调制法”
- 将原任务拆解为多个可以同时求解的任务,EOCO法
算法参数扰动
神经网络-隐层神经元,初始连接权,“负相关法”显式的通过正则化项强制个体神经网络使用不同参数
交叉验证可以看做不同参数训练多个学习器,最终选一个,而集成是把这些学习器都利用起来。