一、介绍
集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。
集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差(bagging)、偏差(boosting)或改进预测(stacking)的效果。
一般经验中,如果把好坏不一的东西掺杂在一起,那么最终结果很可能是整体效果比最坏的东西要好一些,但又比最好的那个要坏一些,那么这种情况下不如就让最好的单独去工作,而不要参与混合。但是集成学习还是对多个学习器进行了结合,那它怎么保证整体的效果会比最好的那个单一学习器的效果更好呢。要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的准确性,即学习器不能太坏,并且要有“多样性”(diversity),即学习器间具有差异。
集成学习在各个规模的数据集上都有很好的策略。
数据集大:划分成多个小数据集,学习多个模型进行组合
数据集小:利用Bootstrap方法进行抽样,得到多个数据集,分别训练多个模型再进行组合
集成方法可分为两类(Boosting和Bagging):
根据个体学习器生成方式的不同,目前集成学习方法大致可分为两大类,即个体学习器间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表是Boosting,后者的代表是和Bagging和“随机森林”(Random Forest)。
序列集成方法,其中参与训练的基础学习器按照顺序生成(例如 AdaBoost)。序列方法的原理是利用基础学习器之间的依赖关系。通过对之前训练中错误标记的样本赋值较高的权重,可以提高整体的预测效果。
并行集成方法,其中参与训练的基础学习器并行生成(例如 Random Forest)。并行方法的原理是利用基础学习器之间的独立性,通过平均可以显著降低错误。
二、集成方法的特点
1. 将多个分类方法聚集在一起,以提高分类的准确率。
(这些算法可以是不同的算法,也可以是相同的算法。)
2. 集成学习法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类
3. 严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法。
4. 通常一个集成分类器的分类性能会好于单个分类器
5. 如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。
自然地,就产生两个问题:
1)怎么训练每个算法?
2)怎么融合每个算法?
三、集成学习的几种方法(Bagging,Boosting以及Stacking)
1、Bagging(bootstrap aggregating,装袋)
Bagging即套袋法,先说一下bootstrap,bootstrap也称为自助法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:
A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
要想获得泛化性能强的集成,集成中的个体学习器应尽可能相互独立。而“独立”在现实任务中比较难以做到,不过我们可以设法使基学习器尽可能具有较大的差异。给定一个训练集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器,这样,由于训练数据不同,我们获得的基学习器可望具有比较大的差异。然而,为获得好的集成,我们同时希望个体学习器不能太差。如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,那甚至不能进行有效的学习,更不谈确保产生比较好的基学习器了。于是,为了解决这个问题,我们使用相互有交叠的采样子集。
Bagging基于前面提到过的自助采样法(bootstrap sampling)。给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m此随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。
于是,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再集成,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务采用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。
Bagging的算法描述如下图:
从偏差-方差分解的角度看,Bagging主要关注降低方差(防止过拟合),因此它在不剪枝决策树、神经网络等容易受样本扰动的学习器上效用更为明显。
Bagging总结:
① Bagging通过降低基分类器的方差,改善了泛化误差
② 其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起
③ 由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例
常用的集成算法类是随机森林。
在随机森林中,集成中的每棵树都是由从训练集中抽取的样本(即 bootstrap 样本)构建的。另外,与使用所有特征不同,这里随机选择特征子集,从而进一步达到对树的随机化目的。
具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有d个属性)中选择一个最有属性;而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性用于划分;一般情况下,推荐值
RF简单、容易实现、计算开销小,而令人惊奇的是,它在很多学习任务中展现出强大的性能,被誉为“代表集成学习技术水平的方法”。
RF的收敛性与Bagging相似。随机森林的起始性能往往相对较差,特别是在集成中只包含一个基学习器时,这很容易理解,因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低。然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。
Random Forest算法参数解释及调优:https://blog.csdn.net/iModel/article/details/80042862
2、Boosting
Boosting主要思想是将弱分类器组装成一个强分类器。在PAC(probably approximately correct,概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。
这一族算法的工作机制都是类似的:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。Boosting族算法最著名的代表是AdaBoost。
Boosting算法要求基学习器对特定的数据分布进行学习,这一点是通过“重赋权法”(re-weighting)实现的,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重,对无法接受代全样本的基学习算法,则可通过“重采样法”(re-sampling)来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得到的样本集对基学习器进行训练。一般而言,这两种做法没有显著的优劣差别。不过由于Boosting算法在训练的每一轮都会检查当前生成的基学习器的性能是否比随机猜测好,若不符合则抛弃当前基学习器,并停止学习过程,这会导致最后的集成中只包含很少的基学习器而性能不佳。而若采用“重采样阀”,则可以获得“重启动”机会以避免训练过程的过早停止,即在抛弃不满足条件的当前基学习器之后,再根据当前分布重新对训练样本进行重采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的T轮完成。
而从偏差-方差分解的角度看,Boosting主要关注降低偏差(避免欠拟合),因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。
关于Boosting的两个核心问题:
1)在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
2)通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如:
AdaBoost(Adaptive boosting)算法:刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
Boosting的基本思想是通过某种方式使得每一轮基学习器在训练过程中更加关注上一轮学习错误的样本,区别在于是采用何种方式?AdaBoost采用的是增加上一轮学习错误样本的权重的策略,而在Gradient Boosting中则将负梯度作为上一轮基学习器犯错的衡量指标,在下一轮学习中通过拟合负梯度来纠正上一轮犯的错误。
Gradient Boosting算法流程:
在Gradient Boosting框架中,最常用的基学习器是决策树 (一般是CART),二者结合就成了著名的梯度提升树 (Gradient Boosting Decision Tree, GBDT)算法。GBDT(Gradient Boost Decision Tree),每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。
参考:https://www.cnblogs.com/massquantity/p/9174746.html
3、Stacking
Stacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。
当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。Stacking是学习法的典型代表,这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级或者元学习器。
Stacking先从初始训练集训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当做样例标记。Stacking的算法描述如下图所示,这里假定初始学习器使用不同学习算法产生(例如可同时包含决策树,神经网络算法),即初级集成是异质的。
4、这几个集成方法的使用
https://blog.csdn.net/willduan1/article/details/73618677
四、Bagging和Boosting二者之间的区别
1、Bagging和Boosting的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数权重:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
2、决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT
参考: