集成学习通过构建并结合多个学习器来完成学习任务,其一般结构为:
即先产生一组个体学习器,再通过某种策略将它们结合起来。
若集成中只包含同种类型的个体学习器,则称这样的集成是同质的,否则则称集成是异质的。
集成学习通过将多个学习器进行结合,常可以获得比单一学习器更加优越的泛化性能,这对于弱学习器(泛化性能略优于随机猜测的学习器)来说更加明显。而如何保证集成学习能够获得更好的性能呢?通过以下例子来体现:
从图中可以看出,要获得好的集成,个体学习器应具有一定的准确性,同时个体学习器之间存在一定的差异。
通过数学的角度来说,对于二分类问题,假设每一个基分类器的错误率为 ε \varepsilon ε,集成发生错误的情况为超过半数的基分类器都发生错误,因此则可以证明:
即随着个体分类器数目 T T T的增大,集成的错误率将呈现指数级下降,并且最终趋向于零。
但上述分析的关键假设是基学习器的误差相互独立,即各个基学习器在相同的数据集上获得的误差是不相关的。但现实中无法实现,因为个体学习器是为了解决同一个问题训练出来的,不可能互相独立。事实上准确性和多样性本身就存在冲突,无法同时实现。
根据个体学习器的生成方式,集成方法大致上可以分为两类:
Boosting是一族可以将弱学习器提升为强学习器的算法,不是单个算法。
其算法机制为:先从初始训练集训练处一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到更多关注,然后基于调整后的样本分布来训练下一个基学习器,如此重复,直到基学习器的数目达到指定数目为止,最终再将这T个基学习器进行加权结合。
最具有代表性的为AdaBoost算法,其具体流程为:
AdaBoost算法的具体形式可以理解为是基学习器的线性组合,对于分类任务则加上一个sign函数,即:
而基分类器的学习过程则是最小化指数损失函数来实现,即:
可以证明若指数损失函数最小化,则分类错误率也将最小化,这说明指数损失函数是分类任务0/1损失函数的一致的替代损失函数,同时指数损失函数具有更好的数学特性。
Boosting算法要求既学习器能对特性的数据分布进行学习,这可以通过重赋权法来实现,例如上述的AdaBoost算法,在训练过程的每一轮中根据样本分布为每个训练样本重新赋予一个权重。而对于无法接受带权样本的基学习算法,则可通过重采样法来处理,即在每一轮学习中都更新样本分布 D t D_t Dt,再根据这个新的样本分布去训练数据集中进行采样,得到新的采样样本集,用这个采样样本集来训练基学习器。这两种方法的主要区别在于,重赋权法中如果某一个基学习器不满足准确性要求,会导致迭代停止,很可能基学习器个数达不到要求,集成性能降低,而重采样法对此的处理方法为:抛弃不满足条件的基学习器后根据当前分布重新对训练样本进行采样,再根据新的采样结果来训练处新的基学习器,从而可以继续迭代。
而从偏差-方差的角度来理解,Boosting方法更关注于降低偏差,因为在不断地迭代过程中,新的基分类器都是更加关注于前面基分类器分类错误的训练样本,那么不断迭代可使得对于训练样本的偏差越来越小。而由于这种序列化生成的强相关性,因此它们之间简单的加权和并不能显著的将低方差。
由上述分析可知,要得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,但在现实中无法实现,因此换思路为尽可能让基学习器具有较大的差异。具体的做法为:给定一个训练数据集,对其进行采样,产生出若干个不同的子集,再用每一个子集去训练出一个基学习器,这样由于子集的不同将会导致基分类器之间具有差异性。但如果每个子集都不相同,每个基分类器只学习到训练数据集的一小部分,则准确性较差。因此可以考虑采用相互有交叠的采样子集。
此算法对于数据集的处理方法为:对于包含m个样本的数据集,每次从中随机选取一个,再将其放回,使其有可能再次被选中,那么重复m次,就构成了一个采样子集,会有部分样本重复出现在子集中也有部分样本不出现在子集中。
重复T次以上操作即可得T个采样子集,然后用每一个采样子集训练一个基分类器,再将基分类器进行结合,就是Bagging的基本流程。
在面对分类任务时,Bagging通常是采用简单投票法,而在面对回归任务时则采用简单平均法。
从偏差-方差的角度来理解,Bagging主要关注降低方差,因为基学习器一般都是相同的,那么其方差和偏差则具有相似性,因此 E [ ∑ X i T ] = E [ X i ] E[\frac{\sum{X_i}}{T}]=E[X_i] E[T∑Xi]=E[Xi],即Bagging并不能显著地降低偏差;而若各基学习器相互独立,则有 V a r [ ∑ X i T ] = V a r [ X i ] T Var[\frac{\sum{X_i}}{T}] = \frac{Var[X_i]}{T} Var[T∑Xi]=TVar[Xi],若基学习器完全相同,则 V a r [ ∑ X i T ] = V a r [ X i ] Var[\frac{\sum{X_i}}{T}] = Var[X_i] Var[T∑Xi]=Var[Xi],而Bagging的情况位于两者之间,因此它可以显著降低方差。
随机森林(RF)在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择,即:传统决策树在选择划分属性时都是在当前结点的属性集合中选择一个最优属性;而在RF中,对基决策树的每个结点是先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里参数k控制的是随机性的引入程度,如果 k = d k=d k=d则退化成传统的决策树,如果 k = 1 k=1 k=1即完全随机,没有最优属性的选择。
随机森林在很多任务都能够展现出强大的性能,因为它不仅仅是通过样本扰动(对初始训练集采样),更是加入了属性扰动,这使得基分类器的多样性增加,也就使得集成的泛化性能进一步提升。
学习器的结合能够从以下三个方面带来好处:
例如在图中寻找到h1到h4的假设,用集成的思想则可以更好的拟合理想假设f
假设集成包含 T T T个基学习器 ( h 1 , h 2 , . . . , h T ) (h_1,h_2,...,h_T) (h1,h2,...,hT),下面介绍几种常见的结合策略:
由于加权平均法的权重一般是从训练数据中学习得到的,而在现实中训练样本常常存在不充分和噪声的问题,因此学习得到的权重并不完全可靠,因此加权平均法未必一定优于简单平均法。一般来说,在个体学习器性能相差较大时就采用加权平均法,在个体学习器性能接近时采用简单平均法
对于分类任务来说,最简答的策略就是投票法:
上述分析中没有限制个体学习器输出值的类型,在现实中个体学习器可能产生不同类型的输出值:
不同类型的输出值不能够混用,即不能直接代入上述计算之中。
当训练数据很多时,一种更为强大的结合策略是学习法,通过另一个学习器完成结合的过程。Stacking为其中的典型代表,其具体流程为:
Stacking先从初始数据集训练出初级学习器(基学习器),然后“生成”一个新数据集来训练次级学习器(用于结合的学习器)。在此新数据集中,初级学习器的输出被当成样例输入的特征,而初始样本的标记仍被当做样例标记。
如果次级学习器的训练阶段使用的样本和初级学习器学习时的样本相同(只是转换成各个初级学习器的输出),那么将会有很大可能造成过拟合。因此要用训练初级学习器时未使用的样本来产生次级学习器的训练样本。
以k折交叉验证为例:
上述分析中的 E = E ˉ − A ˉ E=\bar{E} - \bar{A} E=Eˉ−Aˉ仍然不可以作为优化目标的求解式子,不仅因为它们是定义在整个样本空间上的,更因为 A ˉ \bar{A} Aˉ是在集成构建好之后才能进行估计的。
即度量集成中个体分类器的多样性,典型做法是考虑两两基分类器之间的相似或者不相似性。
对于多样性的增强,常见有以下这些做法: