集成学习通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统、基于委员会的学习等,下面是集成学习的一般结构:先产生一组“个体学习器”,再用某种策略将它们结合起来。如果集成中只包含同种类型的个体学习器,则这种集成称为同质集成,里面的个体学习器也叫做“基学习器”;如果包含的不同类型的个体学习器,则这种集成称为异质集成,里面的个体学习器也叫做“组件学习器”。
在一般经验中,如果把好坏不等的个体学习器掺到一起,那么通常结果会是比最坏的要好一些,比最好的要坏一些,要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,并且要有“多样性”,也就意味着学习器间具有差异,如下所示。
根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表是Boosting,后者的代表是Bagging和“随机森林”。
Boosting是一种可将弱学习器提升为强学习器的算法:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本的分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值 T T T,最终将这 T T T个基学习器进行加权组合,如下所示:
Boosting算法最著名的代表是AdaBoost,如下所示
Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法”来实现,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重。对无法接受带权样本的学习算法,则可通过“重采样法”来实现,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得到的样本集对基学习器进行训练。需要注意的是,Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件。
下面是西瓜数据集上的一个AdaBoost算法的例子,图中黑色粗线为集成的分类边界,黑色细线为基学习器的分类边界。
如果想得到泛化能力强的集成,集成中的个体学习器应尽可能相互独立,虽然“独立”在现实任务中无法做到,但可以设法使基学习器尽可能具有较大的差异,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。
Bagging是基于自助采样法,对于给定的包含 m m m个样本的数据集,先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样经过 m m m次随机采样操作,就可以得到含 m m m个样本的采样集,最后也可以采样出 T T T个含 m m m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。下面是在西瓜数据集上运行Bagging算法的一个例子。
随机森林(Random Forest)是Bagging的一个扩展变体,在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有 d d d个属性)中选择一个最优属性;而在随机森林中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k k k个属性的子集,然后再从这个子集中选择一个最优属性用于划分,一般情况下,推荐值 k = l o g 2 d k=log_2d k=log2d。
学习器结合可能会从三个方面带来好处:
目前常用的结合策略有以下几种:
(1)平均法
在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。
(2)投票法
(3)学习法
当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合,比如Stacking算法,这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器。
Stacking算法是一种集成学习方法,它使用多个不同的基学习器对数据进行预测,然后将预测结果作为新的特征输入到一个元学习器中,从而得到最终的分类或回归结果。Stacking算法可以利用不同的基学习器的优势,提高泛化性能,也可以使用交叉验证或留一法来防止过拟合。
(1)误差-分歧分解
误差-分歧分解是一种将集成学习的泛化误差分解为个体学习器的误差和分歧的方法,误差表示个体学习器的平均泛化误差,分歧表示个体学习器之间的不一致性或多样性。误差-分歧分解的公式如下:
E = E ˉ − A ˉ E = \bar E - \bar A E=Eˉ−Aˉ
其中, E E E是集成的泛化误差, E ˉ \bar E Eˉ是个体学习器的平均泛化误差, A ˉ \bar A Aˉ是个体学习器的平均分歧。这个公式表明,个体学习器的准确性越高、多样性越大,则集成越好。误差-分歧分解只适用于回归问题,对于分类问题则难以推广。误差-分歧分解是基于平方误差的推导,而平方误差是回归问题的常用损失函数。对于分类问题,平方误差不一定是一个合适的损失函数,因为它不能很好地反映分类错误的程度。因此,误差-分歧分解难以直接推广到分类学习任务上去。
(2)多样性度量
d i s i j = b + c m di{s_{ij}} = \frac{{b + c}}{m} disij=mb+c
d i s i j dis_{ij} disij的值域为 [ 0 , 1 ] [0,1] [0,1],值越大则多样性越大。
ρ i j = a d − b c ( a + b ) ( a + c ) ( c + d ) ( b + d ) {\rho _{ij}} = \frac{{ad - bc}}{{\sqrt {(a + b)(a + c)(c + d)(b + d)} }} ρij=(a+b)(a+c)(c+d)(b+d)ad−bc
ρ i j \rho _{ij} ρij的值域为 [ − 1 , 1 ] [-1,1] [−1,1],若 h i h_i hi与 h j h_j hj无关,则值为0;若 h i h_i hi与 h j h_j hj正相关则值为正,否则为负。
Q i j = a d − b c a d + b c {Q_{ij}} = \frac{{ad - bc}}{{ad + bc}} Qij=ad+bcad−bc
Q i j Q_{ij} Qij与相关系数 ρ i j \rho _{ij} ρij的符号相同,且 ∣ Q i j ∣ ⩾ ∣ ρ i j ∣ \left| {{Q_{ij}}} \right| \geqslant \left| {{\rho _{ij}}} \right| ∣Qij∣⩾∣ρij∣。
κ = p 1 − p 2 1 − p 2 p 1 = a + d m p 2 = ( a + b ) ( a + c ) + ( c + d ) ( b + d ) m 2 \begin{aligned} & \kappa = \frac{{{p_1} - {p_2}}}{{1 - {p_2}}} \\ & {p_1} = \frac{{a + d}}{m} \\ & {p_2} = \frac{{(a + b)(a + c) + (c + d)(b + d)}}{{{m^2}}} \end{aligned} κ=1−p2p1−p2p1=ma+dp2=m2(a+b)(a+c)+(c+d)(b+d)
其中, p 1 p_1 p1是两个分类器取得一致的概率, p 2 p_2 p2是两个分类器偶然达成一致的概率,若分类器 h i h_i hi与 h j h_j hj在 D D D上完全一致,则 κ = 1 \kappa=1 κ=1;若它们仅是偶然达成一致,则 κ = 0 \kappa=0 κ=0。 κ \kappa κ通常为非负值,仅在 h i h_i hi与 h j h_j hj达成一致的概率甚至低于偶然性的情况下取负值。
(3)多样性度量选择
(4)多样性增强