机器学习有监督学习算法的最终目标是学习出一个稳定的且在各个方面表现都较好的模型,然而现实是有时候我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习(ensemble learning)通过组合多个弱监督模型得到一个更好更全面的强监督模型,其潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。现在主流的分类、回归、异常检测、特征筛选都可以使用集成学习达到更好的精度。更值得一提的是集成学习在各个规模的数据集上都有很好的策略:
大数据集:划分成多个小数据集,学习多个模型进行组合;
小数据集:利用Bootstrap方法进行抽样,得到多个数据集,分别训练多个模型再进行组合;
要得到这样一个较为全面的强监督模型,需要先解决两个至关重要的问题:
- 如何确定弱学习器,使得组合得到的组合模型是高效、准确的;
- 如何确定一种集成策略,使弱学习器通过这种组合策略成为一个强学习器;
集成学习中弱学习器的选择
从理论上说,几乎所有的机器学习模型都可以作为弱学习器来组合成强监督模型,决策树、神经网络、支持向量机、逻辑回归、线性回归、非线性回归等等。一般来说,按照使用的弱学习器是否相同将集成学习分为两类:一类是所有弱学习器都属于同一类型,是同质的,随机森林就是以决策树为弱学习器集成的;另一类则是所有学习期不全是一种类型,是异质的,例如,对于一个分类模型,我们可以使用逻辑回归模型。神经网络、支持向量机作为弱学习器经过某种集成策略得到一个更加精确的分类器。
目前来说,同质弱学习器的应用是最广泛的,一般我们常说的集成学习方法都是指的同质弱学习器。而同质弱学习器中被使用最多的模型是CART决策树和神经网络。同质弱学习器按照弱学习器之间是否存在依赖关系可以分为两类,第一个是弱学习器学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是boosting系列算法,第二个是弱学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是bagging和随机森林(Random Forest)系列算法。
Bagging:基于数据随机重抽样的分类器构建方法
自举汇聚法(bootstrap aggregating),也称bagging方法,给定一个大小为的数据集,Bagging算法从中均匀、有放回地(自助抽样法,区别于梯度提升树的无放回抽样)选出个大小为的子集作为新的训练集。在这个训练集上使用算法,则可得到多个模型,再通过取平均值、取多数票等方法,即可得到Bagging的结果。因为不同的模型通常不会在测试集上产生完全相同的误差,故而可以极大降低模型的泛化误差。Bagging算法可与其他分类、回归算法结合,提高其准确率、稳定性的同时,通过降低结果的方差,避免过拟合的发生。
对于一个样本,它在某一次含个样本的训练集的随机采样中,每次被采集到的概率是。不被采集到的概率为。如果次采样都没有被采集中的概率是。当时,(具体的证明过程附在文章最后)。也就是说,在bagging的每轮随机采样中,训练集中大约有的数据没有被采样集选中。对于这部分没有被采样到的数据,我们常常称之为袋外数据(Out Of Bag, 简称OOB),由于没有参与训练集模型的拟合,可以使用这些数据来检测模型的泛化能力。
- 新数据集和原始数据集的大小相等。
- 每个数据集都是通过在原始数据集中随机选择一个样本来进行替换而得到的。替换:意味着可以多次地选择同一样本。这一性质允许新数据集中可以有重复的值,而原始数据集的某些值在新集合中则不再出现。
关于Bagging的算法流程如下:
从上图可以看出,bagging的个体弱学习器的训练集是通过随机采样得到的。通过T次的随机采样,可以得到T个采样集,使用这T个采样集,可以分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器,需要注意的是这些个体弱学习器之间是没有任何依赖关系的
。随机森林基于Bagging的思想使用决策树作弱学习器,但是更进一步进行特征的随机选择来训练弱学习器,不过仍属于Bagging的范畴。
Boosting:基于误差下降的分类器构建方法
提升(boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。Boosting的本质思想其实就是“三个臭皮匠顶一个诸葛亮”
Boosting算法的机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习器的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,让这些误差率高的样本在后面的弱学习器2中得到更多的重视,然后基于调整权重后的训练集来训练弱学习器2,从而降低这部分样本的误差率。如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。之后有时间会单独另开一篇文章进行介绍。
集成策略
-
平均值法
对于回归问题,通常使用的集成策略是平均值法,也就是由若干弱学习器输出的平均值(算术平均或加权平均)来作为整个模型最终的输出值。
-
投票法
对于分类问题,通常使用的集成策略是投票法。最简单的投票法是相对多数投票法,在T个弱学习器的对样本的预测结果中,取数量最多的类别为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。
稍微复杂的投票法是绝对多数投票法,也就是我们常说的要票过半数。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。否则会拒绝预测。
更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
-
学习法
平均值法和投票法只是将若干弱学习器的输出进行简单的逻辑处理来得到集成模型最终的输出,这显然是较为粗糙的,并且学习误差率虽然相较弱学习器有了很大的下降,但是误差率仍会较大。此时可采用学习法,学习法中比较具有代表性的是Stacking,Stacking方法另辟蹊径将若干弱学习器的输出作为输入训练一个新的学习器并使用该学习器的输出作为模型的最终输出。在Stacking中,将弱学习器称为初级学习器,而用于结合的学习器称为次级学习器。对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。直观来看Stacking很像一个浅层前馈神经网络,当然二者的本质是全然不同的,在实际使用时为避免模型过拟合,通常使用逻辑回归作为次级学习器。