集成学习是机器学习算法中非常耀眼的一类方法,它通过训练多个基本的分类器(如支持向量机、神经网络、决策树等),再通过基本分类器的决策融合,构成一个完整的具有更强学习分辨能力的学习器。在集成学习中,那些基本学习器一般被称为为“弱学习器“,机器学习的目的就是通过集成众多的“弱学习器“使分类性能达到理想的“强学习器“的效果,从而避免构造复杂的强学习器。简而言之集成学习就是“三个臭皮匠顶一个诸葛亮“的道理
主流的集成学习算法主要分为两类,一类是Boosting算法,这类算法最为成功的代表有Adaboost、GBDT、XGBoost等,以前曾经写过一篇关于Adaboost的教程,写了一些关于其具体实现的代码,想深入了解的可以看这里
机器学习教程 之 集成学习算法: 深入刨析AdaBoost 。
人工智能里的数学修炼 | AdaBoost的数学原理: 分布更新推导
机器学习教程 之 梯度提升方法:GBDT及其扩展模型XGBoost
机器学习教程 之 梯度提升方法:GBDT处理分类问题
机器学习教程 之 加性模型:GBDT退化为AdaBoost原理
Boosting算法的基学习器间存在强依赖关系,是一种必须串行生成的序列化方法;还有一类就是bagging算法,著名的随机森林就是其典型的代表。Bagging算法的基学习器之间不存在强依赖关系,是可同时生成众多基学习器的并行算法
机器学习教程 之 随机森林: 算法及其特征选择原理
接下来会分别介绍一下这两个集成学习框架的特点与不同
对于分类问题而言,给定一个训练样本集,求比较粗糙的分类规则(弱学习器)要比求精确的分类规则(强学习器)容易的多。Boosting方法就是从“弱学习器“出发,反复学习,得到一系列弱分类器,然后组合这些分类器,构成一个强分类器。
Boosting的思想起源于1986年Valiant提出的 PAC ( Probably Approximately Correct)学习模型。Valiant和 Kearns提出了弱学习和强学习的概念 ,识别错误率小于1/2,也即准确率仅比随机猜测略高的学习算法称为弱学习算法;识别准确率很高并能在多项式时间内完成的学习算法称为强学习算法。同时 ,Valiant和 Kearns首次提出了 PAC学习模型中弱学习算法和强学习算法的等价性问题,即任意给定仅比随机猜测略好的弱学习算法 ,是否可以将其提升为强学习算法 ? 如果二者等价 ,那么只需找到一个比随机猜测略好的弱学习算法就可以将其提升为强学习算法 ,而不必寻找很难获得的强学习算法。1990年, Schapire最先构造出一种多项式级的算法 ,对该问题做了肯定的证明 ,这就是最初的 Boosting算法。一年后 ,Freund提出了一种效率更高的Boosting算法。但是,这两种算法存在共同的实践上的缺陷 ,那就是都要求事先知道弱学习算法学习正确的下限。1995年 , Freund和 schap ire改进了Boosting算法 ,提出了 AdaBoost (Adap tive Boosting)算法 ,该算法效率和 Freund于 1991年提出的 Boosting算法几乎相同 ,但不需要任何关于弱学习器的先验知识 ,因而更容易应用到实际问题当中
这一类算法的工作机制大致如下:先从初始训练集练出一个集学习器,再根据即学习器的表现对训练样本进行调整,使得先前基学习器做错的样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值,最终将这T个基学习器进行加权结合
Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法“实施,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重。对无法接受带权样本的基学习算法,则可通过“重采样法“来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练。一般而言这两种做法没有显著的优劣差别。需注意的是,Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(即检查生成的基分类器是否比随机猜测好),一旦条件不满足,则当前的基学习器即被抛弃,且学习过程停止
同一个学习算法在来自同一分布的多个不同的训练数据集上训练得到的模型偏差可能较大,即模型的方差(variance)较大,为了解决这个问题,可以综合多个模型的输出结果,对于回归问题可以取平均值,对于分类问题可以采取多数投票的方法。这就是Bagging的核心思想。
想要得到泛化性能较强的集成,集成中的个体学习器应尽可能具有较大的差异。给定一个训练数据集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。这样由于训练数据不同,我们获得的基学习器可望具有比较大的差异。然而,为了获得更好的集成,我们同时还希望个体学习器不能太差。如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分数据,甚至不足以进行有效学习,这显然无法确保产出比较好的基学习器。为了解决这个问题,Bagging算法使用互相有交叠的采样子集,即
自助采样法:给定包含m个样本的数据集,我们先随机取出一个样本放入采样集当中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样经过m次随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集中多次出现,有的则从未出现,初始训练集中约有63.2%的样本出现在采样集中
照这样的思想,我们可以采出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将基学习器结合,这就是bagging的基本流程
从偏差-方差分解的角度来看,Bagging主要关注于降低方差,因此它在不减枝决策树、神经网络等易受扰动的学习器上效果更为明显