《机器学习》(三)集成学习

一、概念

    集成学习(Ensemble learning) 是用多种学习方法的组合来获取比原方法更优的结果。在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个弱监督模型。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型。

    集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差(bagging)、偏差(boosting)或改进预测(stacking)的效果。

    集成学习在各个规模的数据集上都有很好的策略。数据集大:划分成多个小数据集,学习多个模型进行组合。数据集小:利用Bootstrap方法进行抽样,得到多个数据集,分别训练多个模型再进行组合。

二、集成学习的常用方法

2.1装袋法Bagging

    Bagging即套袋法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:

  A)从原始样本集中抽取训练集。每轮从原始样本集中抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

  B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

  C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

为了让更好地理解bagging方法,这里提供一个例子。

  X 表示一维属性,Y 表示类标号(1或-1)测试条件:当x<=k时,y=?;当x>k时,y=?;k为最佳分裂点

  下表为属性x对应的唯一正确的y类别

  现在进行5轮随机抽样,结果如下

  

  

  每一轮随机抽样后,都生成一个分类器

  然后再将五轮分类融合

  

  对比符号和实际类,我们可以发现:在该例子中,Bagging使得准确率可达90%

  由此,总结一下bagging方法:

  ①  Bagging通过降低基分类器的方差,改善了泛化误差。
  ②  其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起。
  ③  由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例。

    常用的集成算法类是随机森林。

  在随机森林中,集成中的每棵树都是由从训练集中抽取的样本构建的。另外,与使用所有特征不同,这里随机选择特征子集,从而进一步达到对树的随机化目的。

因此,随机森林产生的偏差略有增加,但是由于对相关性较小的树计算平均值,估计方差减小了,导致模型的整体效果更好。

  

2.2提升法Boosting

    其主要思想是将弱分类器组装成一个强分类器。在PAC(probably approximately correct,概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。

关于Boosting的两个核心问题:

  1)在每一轮如何改变训练数据的权值或概率分布?

  通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

  2)通过什么方式来组合弱分类器?

  通过加法模型将弱分类器进行线性组合,比如:

  AdaBoost(Adaptive boosting)算法:刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

  GBDT(Gradient Boost Decision Tree),每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。

2.3学习法Stacking

    Stacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。

    在训练阶段,次级学习器(用来结合结果的学习器)的训练数据集是利用初级学习器来产生的,若直接用初级学习器的训练集来产生训练数据集,则很有可能会出现过拟合,也就是过拟合风险较大;所以一般在使用Stacking时,采用交叉验证或留一法的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本。下面以k=5折交叉验证作为例子:

    首先把整个数据集分成量训练集(Training Data)和测试集(Test Data)两部分,上图最左边,然后把训练数据集进行k折,此处k=5,即把训练数据分成5份,在进行第j折时,使用其余的四份进行初级学习器的训练,得到一个初级学习器,并用该初始学习器把该折(即留下用来验证的)数据进行预测,进行完所有折数,把预测输出作为新数据集的特征,即次级学习器的训练数据集,其中标记没变,用该新数据集训练次级学习器,从而得到一个完整的stacking。最后用原始数据的测试集来对该Stacking进行测试评估。

    次级学习器的输入属性表示和次级学习算法的选择对Stacking集成的泛化性能有很大影响。有研究表明,将初级学习器的输出类概率最为次级学习器的输入属性,用多响应线性回归(Multi-reponse Linear Regression,简称MLR)作为次级学习器算法效果更好,在MLR中使用不同的属性集更佳。

    注:MLR是基于线性回归的分类器,其对每个类分别进行线性回归,属于该类的训练样例所对应的输出为1,其他类置0;测试示例将被分给输出值最大的类。
 

三、总结

Bagging和Boosting的区别:

  1)样本选择上:

  Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

  Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

  2)样例权重:

  Bagging:使用均匀取样,每个样例的权重相等

  Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

  3)预测函数: 

  Bagging:所有预测函数的权重相等。

  Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

  4)并行计算: 

  Bagging:各个预测函数可以并行生成

  Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。 

决策树与这些算法框架进行结合所得到的新的算法:

  1)Bagging + CART决策树 = 随机森林

  2)AdaBoost + 决策树 = 提升树

  3)Gradient Boosting + 决策树 = GBDT

四、参考:

https://blog.csdn.net/perfect1t/article/details/83684995

https://www.cnblogs.com/zongfa/p/9304353.html

发布了82 篇原创文章 · 获赞 265 · 访问量 58万+

猜你喜欢

转载自blog.csdn.net/zhiyeegao/article/details/104869821