边境的悍匪—机器学习实战:第七章 集成学习和随机森林

第七章 集成学习和随机森林

文章目录

  • 第七章 集成学习和随机森林
  • 前言
  • 一、思维导图
  • 二、主要内容
    • 1、投票分类器
    • 2、bagging和pasting
    • 3、随机补丁和随机子空间
    • 4、随机森林
    • 5、提升法
    • 6、堆叠法
  • 三、课后练习
  • 四、总结


前言

在上一章我们提到过吧很多的决策树集成到一起来提高模型的准确性,集成出来的这个模型称之为随机森林,这种集成的方式就是集成学习。
对于一个很复杂的问题,一个人的回答并不一定是准确的,但是如果我们收集了成千上万个人的答案然后对这些答案进行统计得出最后的结果,那么这个结果很大的概率就是正确的答案。这就是集成学习的中心思想,也是集成学习在我们生活中的体现。
随机森林就是集成学习最典型的一个例子。


一、思维导图

二、主要内容

1、投票分类器

  1. 概念
    投票分类器的就是把一个分类器任务交由多个分类器做出决策,然后统计子分类器的预测结果输出最终的预测。
    为了获得一个高性能的分类器,我们需要保证训练的每一个子分类器都是相互独立的不存在关联,或者是能够在不同的训练集中训练子分类器,为了防止多个分类器存在同一个分类错误而降低准确性。
  2. 硬投票分类器
    硬投票分类器是在统计子分类器预测结果的时候使用少数服从多数的方法做出决定。
  3. 软投票分类器
    软投票分类器在统计子分类器的结果时统计的是每个分类器对每个分类的概率预测,这样给到了更加自信的分类器更高的权重,一般来说软投票分类器的准确率要高于硬投票分类器,但是有一个前提,所有的子分类器要支持输出每个分类的概率。

2、bagging和pasting

  1. 概念
    为了获得一个高性能的投票分类器,我们有两种方式第一是使得每一个分类器相互独立之间没有任何关联,第二种方式就是使用不同的训练集。bagging和pasting就是两种不同的获取随机训练子集的方式。
    训练完成之后的分类器,总体来说,偏差接近,但是方差降低了。
  2. bagging
    在每次随机抽样时的实例是放回的,这样就使得同一个实例可以被多个分类器多次抽到。
  3. pasting
    在每次随机抽样的实例是不放回的,这样就能保证同一个实例只会被同一个分类器抽到一次。
  4. sklearn中的bagging和pasting
    sklearn提供了BaggingClassifier类来做bagging和pasting。我们可以通过设置不同的超参数来切换不同的获取随机训练子集的算法。
    一般情况下baggin训练出来的分类器性能要高于pasting,因为它的放回机制使得训练集更加多样性,分类器之间的关联性很低。
  5. 包外评估
    在使用bagging的时候由于它的放回机制,所以会有一部分的实例没有被抽取到,这一部分实例就称之为包外实例(oob),由于这一部分是干净的完全没有用于过训练的实例,所以可以用作验证。用这种方式得到的评估结果与单独准备验证集得到的结果接近。

3、随机补丁和随机子空间

  • BaggingClassifier还支持对特征进行随机抽样来达到训练集的多样性。
  • 在随机抽样时,同时对实例和特征都进行随机抽样,这种方式成为随机补丁。
  • 在随机抽样时,只对特征进行随机抽样的方式成为随机子空间。

4、随机森林

  1. 训练随机森林
    训练随机森林的方式有两种,一种是使用DecisionTreeClassifier作为子分类器,用BaggingClassifier把所有子分类器全部整合起来训练。第二种是直接使用RandomForestRegressor,这种方式更方便,优化也更好。
    随机森林的分裂不再是在整个训练集中寻找最优的特征,而是在随机训练子集中寻找最优的特征,目的依然是为了每一个子分类器相互独立。
  2. 极端随机树
    一个正常的决策树在分裂是寻找一个最优的特征中最优的阀值,而极端随机树则是不再寻找最优的阀值,使用随机阀值,使得我们得到的决策树更加随机,这种方式生成的决策树我们称之为极端随机树。
    我们可以使用ExtraTreesClassifier来训练一个极端随机树,至于极端随机树与随机森林的选择,没有一个固定的优劣,需要通过交叉验证来比较。
  3. 特征重要性
    随机森林有利于做特征选择,通过对特征降低数据集不纯度做出的贡献来筛选,计算特征在每个节点的加权贡献值,权重为关联样本的数量。

5、提升法

  1. 概念
    在集成子预测器时,能够保证后一个预测器的性能高于前一个性能的方法成为提升法。
  2. AdaBoost
    AdaBoost在做分类器的性能提升时,更加注重前序分类器欠拟合的数据,在完成一次训练之后会对所有的实例进行加权处理,欠拟合的数据权重越高,然后再进行下一次训练。一直循环只到获得一个很好的分类器停止训练,最后根据每个子分类器的性能给每个子分类器分配权重。
    与基础的投票分类器相似,依旧是统计每个子分类器的做出的预测,不同的是在统计时,需要对每个的预测加上权重计算。
    AdaBoost的缺点是它是时序的,没有办法进行并行训练。
  3. 梯度提升
    梯度提升与AdaBoost不同的是,后一个分类器使用的不再是所有训练集进行训练,而是使用前一个分类器预测错误的部分进行拟合。
    sklearn提供了GradientBoostingRegressor类可以训练梯度提升树。
    XGBoost是一个很好的梯度提升模型。

6、堆叠法

  1. 训练
    堆叠法把训练集分为三部分,第一部分用于训练第一层的分类器,第二部分用于第二层的预测,预测结果为第三层的输入,第三部分用作第三层的训练,第三层的预测结果为输出结果。
  2. 预测
    训练完成之后我们可以按照每层遍历,对新示例进行预测。
  3. sklearn的支持
    sklearn暂不支持对堆叠法的实现。

三、课后练习

1.如果你已经在完全相同的训练集上训练了5个不同的模型,并且它们都达到了95%的准确率,是否还有机会通过结合这些模型来获得更好的结果?如果可以,该怎么做?如果不行,为什么?
如果已经训练了5个不同的高性能模型,那么把这5个模型组合起来可以获得更好的结果。因为这5个模型是不同的类型,做到了多样性,所以能达到效果,如果训练时使用的训练集也是不同的训练的话那就会有更好的效果。

2.硬投票分类器和软投票分类器有什么区别?
硬投票分类器只是统计每个分类器的投票,最后预测的结果就是投票结果最多的分类。软投票分类器统计的则是每个分类的概率,这样的性能要高于硬投票分类器,因为它赋予了更加自信的分类器更高的权重,不过有一个前提就是基础分类器必须能够输出每个分类的概率。

3.是否可以通过在多个服务器上并行来加速bagging集成的训练?pasting集成呢?boosting集成呢?随机森林或stacking集成呢?
对于bagging、pasting与随机森林而言,因为集成的每一个预测器都是相互独立的,所以可以使用多台服务器上并行来加速训练。但是对于boosting而言,因为它是时序的,当前预测器的训练需要根据前序预测器而定,所以无法部署到多台服务器上加速,即使部署了也毫无意义。对于stacking而言,它同一层上的预测器是相互独立的,可以用多台服务器的方式来加快训练,在训练一次预测器的时候,需要等到前一层工作全部完成才能进行。

4.包外评估的好处是什么?
保外评估的好处是能够对bagging集成的每个预测器使用未经训练过的实例进行验证,不需要单独准备验证集,这样就能对集成实施相当公正的评估,所以使用的测试集预测大,集成的性能也会略有提升。

5.是什么让极端随机树比一般随机森林更加随机?这部分增加的随机性有什么用?极端随机树比一般随机森林快还是慢?
随机森林在分裂节点时需要找到子集中所有特征中最优的一个并找到一个最优的阀值,而极端随机树同样需要找到最优的特征,但是是使用一个随机的阀值,这样也算是对于模型正则化的一种方式,如果随机森林过拟合了训练集, 那么这个时候极端随机树的性能要高于随机森林。并且极端随机树在生成的时候少了计算最优阀值的操作,在生成树的时候极端随机树要比随机森林快,在预测的时候时间没有太大的差异。

6.如果你的AdaBoost集成对训练数据欠拟合,你应该调整哪些超参数?怎么调整?
如果你的AdaBoost集成欠拟合,那么你可以尝试添加估算器的数量或是降低基础估算器的超参数,或者尝试稍微提升一点学习率。

7.如果你的梯度提升集成对训练集过拟合,你是应该提升还是降低学习率?
如果梯度提升过拟合,那么你应该尝试降低学习率或者是使用提前停止法,找到一个合适的预测器数量。

四、总结

这一章总结一个中心的概念就是:通过集成提高预测准确率
至于集成的方式一共有以下几个方式

  1. 投票分类器
    训练大量的子分类器,由这些子分类器来做出决策,最后的预测结果为所有子分类器预测统计结果。其中最有代表性的就是随机森林。
  2. 提升法
    在投票分类器的基础上,保证后一个子分类器的性能高于前一个子分类器的性能。
  3. 堆叠法
    与之前两个都不相同,堆叠法则是把分类器分层,前一层的预测结果为下一层分类器的输入。

想要提升集成学习的准确性,宗旨只有一个就是使得每个子分类器相对独立,没有关联。有两种方式可以做到这一点。

  1. 使用不同的分类器。
  2. 使用不同的训练集,这里就引出了bagging和pasting两种放回与不放回的获取随机训练子集的方法。

对文章有任何疑惑或者想要和博主一起学机器学习一起进步的朋友们可以添加 群号:666980220。需要机器学习实战电子版或是思维导图的也可以联系我。祝你好运!

项目地址: github

你可能感兴趣的:(机器学习实战,机器学习,集成学习,随机森林)