【机器学习】之第八章——集成学习
西瓜书机器学习中的集成学习章节学习记录
8.1、个体与集成
集成学习通过构建并结合多个学习器来完成学习任务,其一般结构为:
即先产生一组个体学习器,再通过某种策略将它们结合起来。
若集成中只包含同种类型的个体学习器,则称这样的集成是同质的,否则则称集成是异质的。
集成学习通过将多个学习器进行结合,常可以获得比单一学习器更加优越的泛化性能,这对于弱学习器(泛化性能略优于随机猜测的学习器)来说更加明显。而如何保证集成学习能够获得更好的性能呢?通过以下例子来体现:
从图中可以看出,要获得好的集成,个体学习器应具有一定的准确性,同时个体学习器之间存在一定的差异。
通过数学的角度来说,对于二分类问题,假设每一个基分类器的错误率为ε\varepsilonε,集成发生错误的情况为超过半数的基分类器都发生错误,因此则可以证明:
即随着个体分类器数目TTT的增大,集成的错误率将呈现指数级下降,并且最终趋向于零。
但上述分析的关键假设是基学习器的误差相互独立,即各个基学习器在相同的数据集上获得的误差是不相关的。但现实中无法实现,因为个体学习器是为了解决同一个问题训练出来的,不可能互相独立。事实上准确性和多样性本身就存在冲突,无法同时实现。
根据个体学习器的生成方式,集成方法大致上可以分为两类:
- 个体学习器之间存在强依赖关系,必须串行生成的序列化方法,例如Boosting
- 个体学习器之间不存在强依赖关系,可以同时生成的并行化方法,例如Bagging和随机森林
8.2、Boosting
Boosting是一族可以将弱学习器提升为强学习器的算法,不是单个算法。
其算法机制为:先从初始训练集训练处一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到更多关注,然后基于调整后的样本分布来训练下一个基学习器,如此重复,直到基学习器的数目达到指定数目为止,最终再将这T个基学习器进行加权结合。
最具有代表性的为AdaBoost算法,其具体流程为:
- 初始化样本的权重,一开始样本的权重都是相等的,那么第一次训练则一视同仁
- 循环T次,生成T个基分类器
- 根据学习算法对当前循环轮次的训练集进行学习,获得基学习器hth_tht
- 计算基学习器hth_tht的误差
- 如果误差大于0.5,说明该基学习器不具有准确性,那么就需要剔除,同时也要停止循环,因为无法更新后面的权重了
- 计算更新权重中的重要参数αt\alpha_tαt,这个参数也是后面对基分类器加权和时每个基分类器的权重
- 更新样本的权重,这会使得本轮分类错误的样本权重增大,而分类正确的样本权重减小
AdaBoost算法的具体形式可以理解为是基学习器的线性组合,对于分类任务则加上一个sign函数,即:
而基分类器的学习过程则是最小化指数损失函数来实现,即:
可以证明若指数损失函数最小化,则分类错误率也将最小化,这说明指数损失函数是分类任务0/1损失函数的一致的替代损失函数,同时指数损失函数具有更好的数学特性。
Boosting算法要求既学习器能对特性的数据分布进行学习,这可以通过重赋权法来实现,例如上述的AdaBoost算法,在训练过程的每一轮中根据样本分布为每个训练样本重新赋予一个权重。而对于无法接受带权样本的基学习算法,则可通过重采样法来处理,即在每一轮学习中都更新样本分布DtD_tDt,再根据这个新的样本分布去训练数据集中进行采样,得到新的采样样本集,用这个采样样本集来训练基学习器。这两种方法的主要区别在于,重赋权法中如果某一个基学习器不满足准确性要求,会导致迭代停止,很可能基学习器个数达不到要求,集成性能降低,而重采样法对此的处理方法为:抛弃不满足条件的基学习器后根据当前分布重新对训练样本进行采样,再根据新的采样结果来训练处新的基学习器,从而可以继续迭代。
而从偏差-方差的角度来理解,Boosting方法更关注于降低偏差,因为在不断地迭代过程中,新的基分类器都是更加关注于前面基分类器分类错误的训练样本,那么不断迭代可使得对于训练样本的偏差越来越小。而由于这种序列化生成的强相关性,因此它们之间简单的加权和并不能显著的将低方差。
8.3、Bagging和随机森林
由上述分析可知,要得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,但在现实中无法实现,因此换思路为尽可能让基学习器具有较大的差异。具体的做法为:给定一个训练数据集,对其进行采样,产生出若干个不同的子集,再用每一个子集去训练出一个基学习器,这样由于子集的不同将会导致基分类器之间具有差异性。但如果每个子集都不相同,每个基分类器只学习到训练数据集的一小部分,则准确性较差。因此可以考虑采用相互有交叠的采样子集。
8.3.1、Bagging
此算法对于数据集的处理方法为:对于包含m个样本的数据集,每次从中随机选取一个,再将其放回,使其有可能再次被选中,那么重复m次,就构成了一个采样子集,会有部分样本重复出现在子集中也有部分样本不出现在子集中。
重复T次以上操作即可得T个采样子集,然后用每一个采样子集训练一个基分类器,再将基分类器进行结合,就是Bagging的基本流程。
在面对分类任务时,Bagging通常是采用简单投票法,而在面对回归任务时则采用简单平均法。
从偏差-方差的角度来理解,Bagging主要关注降低方差,因为基学习器一般都是相同的,那么其方差和偏差则具有相似性,因此E[∑XiT]=E[Xi]E[\frac{\sum{X_i}}{T}]=E[X_i]E[T∑Xi]=E[Xi],即Bagging并不能显著地降低偏差;而若各基学习器相互独立,则有Var[∑XiT]=Var[Xi]TVar[\frac{\sum{X_i}}{T}] = \frac{Var[X_i]}{T}Var[T∑Xi]=TVar[Xi],若基学习器完全相同,则Var[∑XiT]=Var[Xi]Var[\frac{\sum{X_i}}{T}] = Var[X_i]Var[T∑Xi]=Var[Xi],而Bagging的情况位于两者之间,因此它可以显著降低方差。
8.3.2、随机森林
随机森林(RF)在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择,即:传统决策树在选择划分属性时都是在当前结点的属性集合中选择一个最优属性;而在RF中,对基决策树的每个结点是先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里参数k控制的是随机性的引入程度,如果k=dk=dk=d则退化成传统的决策树,如果k=1k=1k=1即完全随机,没有最优属性的选择。
随机森林在很多任务都能够展现出强大的性能,因为它不仅仅是通过样本扰动(对初始训练集采样),更是加入了属性扰动,这使得基分类器的多样性增加,也就使得集成的泛化性能进一步提升。
8.4、结合策略
学习器的结合能够从以下三个方面带来好处:
- 从统计的角度:学习算法的本质是在假设空间中寻找那个最优假设,但当样本数据与假设空间中的假设相比太小时将会出现统计上的问题,就是很多个假设都能够对此样本给出很好的准确率,以至于我们不知道该挑选哪一个假设。而如果采用集成这些假设的方法,用这些准确率高的假设来构造成集合,那么多数投票的方式就可以减少我们选择到错误假设的风险
例如在图中寻找到h1到h4的假设,用集成的思想则可以更好的拟合理想假设f
- 从可计算性的角度:许多学习算法的学习过程是进行局部搜索,这很容易陷入局部最优,而且例如神经网络的梯度下降和决策树的选择决策过程,这在数据量很大的时候计算量是非常大的,即是一个NP-hard问题。而集成的方法可以通过从多个不同的起点进行局部搜索而进行构建集成,那么可能会提供对于理想假设更好的近似
- 从表示性的角度:在许多问题中理想假设的形式是无法通过当前假设空间中的任何假设来表示的,那么通过加权和形式的集成方法,就可以拓展可表示函数的集合,即可以表示出更多形式的未知函数,那么就有可能可以更加接近理想假设
假设集成包含TTT个基学习器(h1,h2,...,hT)(h_1,h_2,...,h_T)(h1,h2,...,hT),下面介绍几种常见的结合策略:
8.4.1、平均法
对于数值型的输出,最常见的策略就是直接平均:
由于加权平均法的权重一般是从训练数据中学习得到的,而在现实中训练样本常常存在不充分和噪声的问题,因此学习得到的权重并不完全可靠,因此加权平均法未必一定优于简单平均法。一般来说,在个体学习器性能相差较大时就采用加权平均法,在个体学习器性能接近时采用简单平均法
8.4.2、投票法
对于分类任务来说,最简答的策略就是投票法:
上述分析中没有限制个体学习器输出值的类型,在现实中个体学习器可能产生不同类型的输出值:
- 类标记:hij(x)∈{0,1}h^j_i(x)\in \{0,1\}hij(x)∈{0,1},若hih_ihi将样本xxx划分到类别cjc_jcj则输出为1,否则输出为0。这种称为硬投票
- 类概率:hij(x)∈[0,1]h^j_i(x)\in [0,1]hij(x)∈[0,1],相当于对于后验概率P(cj∣x)P(c_j \mid x)P(cj∣x)的一个估计。称为软投票
不同类型的输出值不能够混用,即不能直接代入上述计算之中。
8.4.3、学习法
当训练数据很多时,一种更为强大的结合策略是学习法,通过另一个学习器完成结合的过程。Stacking为其中的典型代表,其具体流程为:
Stacking先从初始数据集训练出初级学习器(基学习器),然后“生成”一个新数据集来训练次级学习器(用于结合的学习器)。在此新数据集中,初级学习器的输出被当成样例输入的特征,而初始样本的标记仍被当做样例标记。
如果次级学习器的训练阶段使用的样本和初级学习器学习时的样本相同(只是转换成各个初级学习器的输出),那么将会有很大可能造成过拟合。因此要用训练初级学习器时未使用的样本来产生次级学习器的训练样本。
以k折交叉验证为例:
- 初始训练集DDD被随机划分成k个大小相似的集合D1−DkD_1 - D_kD1−Dk,令DjD_jDj和Djˉ=D∖Dj\bar{D_j}=D\setminus D_jDjˉ=D∖Dj分别表示第j折的测试集和训练集
- 给定T个初级学习算法,初级学习器ht(j)h^{(j)}_tht(j)通过在Djˉ\bar{D_j}Djˉ(训练集)上使用第ttt个学习算法习得
- 对于DjD_jDj(测试集)中的每个样本xix_ixi,令zit=ht(j)(xi)z_{it}=h^{(j)}_t(x_i)zit=ht(j)(xi),作为新数据集中样本ziz_izi的第jjj个属性,则由xix_ixi所产生的的次级学习器的样例为zi=(zi1,zi2...ziT)z_i=(z_{i1},z_{i2}...z_{iT})zi=(zi1,zi2...ziT),标记部分为yiy_iyi。
- 因此得到T个初级学习器产生的次级训练集为D‘={(zi,yi)i=1m}D^`=\{(z_i,y_i)^m_{i=1}\}D‘={(zi,yi)i=1m},用来训练次级学习器
8.5、多样性
8.5.1、误差-分歧分解
上述分析中的E=Eˉ−AˉE=\bar{E} - \bar{A}E=Eˉ−Aˉ仍然不可以作为优化目标的求解式子,不仅因为它们是定义在整个样本空间上的,更因为Aˉ\bar{A}Aˉ是在集成构建好之后才能进行估计的。
8.5.2、多样性度量
即度量集成中个体分类器的多样性,典型做法是考虑两两基分类器之间的相似或者不相似性。
8.5.3、多样性增强
对于多样性的增强,常见有以下这些做法:
- 数据样本扰动:类似于Bagging中的自助采样,对初始数据集进行处理产生不同的数据子集,再利用不同的数据子集去训练不用的个体学习器。这对于决策树、神经网络等因为训练样本稍微变化就会发生显著变动的基学习器有很好的效果,这类学习器称为“不稳定基学习器”;而对于线性学习器、支持向量机、朴素贝叶斯、k近邻学习器等对数据样本的扰动不敏感的“稳定基学习器”则作用不大。
- 输入属性扰动:从初始属性集中抽取若干个属性子集,再基于每个属性子集训练一个基分类器。对于包含大量冗余属性的数据,在子空间中训练个体学习器不仅能产生多样性大的个体,而且还会因属性数目的减少而大幅节约时间开销。但是若数据只包含少量属性,或者冗余属性很少,则不适用。
- 输出表示扰动:基本思路是对输出表示进行操纵以增强多样性,例如随机改变一些训练样本的标记,或者对输出表示进行转换等。
- 算法参数扰动:通过随机设置不同的参数往往也可以产生差别较大的个体学习器,或者在学习过程中将某个环节用其他类似方式代替,从而达到扰动的效果。
更多推荐
所有评论(0)