随机森林(Random Forest)是一种Bagging(Bootstrap Aggregating)集成算法,在样本随机(样本扰动)的基础上,进一步运用特征随机(属性扰动)的机制,得到比一般的Bagging集成更好的效果。

要理解随机森林,需要理解以下几点:

1、什么是自助采样(Bootstrap Sampling)?

2、什么是Bagging集成?

3、随机森林的基学习器是什么

4、随机森林的“随机”体现在哪里?

5、随机森林如何防止过拟合?

一、自助采样

自助采样是用自助法进行模型评估时用到的采样方法。我们知道,在模型初步训练完成后,需要用测试集对学习器的泛化误差进行评估,这就涉及到如何产生测试样本的问题。比如有一个包含m个样本的数据集D={(x1, y1),(x2, y2),...,(xm, ym)},用什么方法对D进行适当地处理,从中产生训练集D'和测试集D\D'呢?需要注意的是,产生的测试集要尽可能和训练集互斥。

常见的产生测试集的方法有留出法(hold out)、交叉验证法(cross validation)和自助法(bootstrapping),而自助采样(bootstrap sampling)是自助法中的采样方法。留出法和交叉验证法的问题在于保留了一部分样本用于测试,因此训练集比样本集小,从而会导致一定的估计偏差。而采用自助法,训练集和样本集的样本量是一样的,就可以减少训练规模不同造成的影响。

那自助采样具体是怎样进行的呢?自助采样是一种有放回的抽样,如果给定一个包含m个样本的数据集D,那么训练集D'是这样产生的:每次随机地从样本集D中取出一个样本,放入到训练集D'中,然后把这个样本放回原来的样本集中,继续进行随机抽取;这样有放回地抽样m次,就得到了包含m个样本的训练集D',于是训练集和样本集的大小就一样了。

显然训练集D'中有部分样本是重复的,而D中有一部分样本却不在训练集中。经过估计,样本在m次采样中始终不被抽取到的概率大概是36.8%,也就是说通过自助采样,初始样本集D中大约有36.8%的样本不在训练集D'中。把不在训练集中出现的样本记作:D\D',作为测试集。于是,自助采样中的测试集就这样产生了。而用这约占数据总量36.8%、未在训练集中出现的样本集作为测试集,用于评估模型泛化误差的做法,叫做“包外估计”(out of bag estimate)。

以上是一次自助采样的结果,也就是产生了一个包含m个样本的训练集,以及包含大约占样本总量36.8%且未在训练集中出现的样本的测试集。

在集成学习的Bagging模型中,如果打算训练K个学习器,那么以上的采样过程要重复K次,也就是从初始样本集中产生K个训练集,再用这K个训练集来训练出K个学习器。

到此就理解了,自助采样是一种有放回的随机采样,是Bagging集成中的采样方法,能够产生一个和原始样本集同样大小的训练集,以及一个和训练集互斥且样本量约占总样本36.8%的测试集。

二、Bagging模型

Bagging(Bootstrap Aggregating)是并行式集成学习方法中最著名的代表,它是基于自助采样法进行模型训练和模型评估的方法。Bagging的基本思想可以理解为,在分类问题中,将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器。它的基本流程是:通过T次自助采样,采样出T个与原始样本集规模一样的训练集,然后基于T个训练集学习到T个基学习器,再将这些基学习器进行结合,并用包外估计进行模型评估。所以可以从自助采样、学习器结合和包外估计这三个步骤来理解Bagging。

1、自助采样

通过一次自助采样,对于包含m个样本的原始数据集,我们可以得到包含m个样本的训练集,训练集与原始数据集大小一致。这样做有什么好处呢?

在集成学习中,如果希望个体学习器能够形成泛化性能较强的集成,那么一方面要求每个个体学习器自身的效果比较好,另一方面要求个体学习器之间尽可能具有较大的差异。而通过自助采样,一方面训练集的样本规模和原始数据集的大小一致,个体学习器能够进行比较充分的学习,性能比较好。另一方面多次自助采样后产生的多个训练集是不同的(尽管也有重叠的样本),因此从每个训练集中学习到的个体学习器之间有比较大的差异,我们可以把这种机制叫做样本扰动。基于这两点,Bagging集成的泛化性能是比较强的。

2、学习器结合

对学习好的T个基学习器进行结合,其实就是对预测输出进行结合,在分类任务中,Bagging使用简单投票法,在回归任务中使用简单平均法。如果在分类预测时出现两个类获得的票数相同,那么可以随机地二选一,或者进一步考察基学习器投票的置信度来确定。

3、包外估计

通过自助采样得到的训练集,对其去重后得到的样本量约为原始数据集的63.2%,那么剩下约36.8%的样本正好可以用来作为验证集,评估模型的泛化误差,这种评估方法就叫做包外估计。

具体怎么得到Bagging的泛化误差的包外估计呢?对于某一个样本(xi, yi),它大约会被63.2%的基学习器进行训练,而大约36.8%的基学习器未使用它进行学习。于是就用这36.8%的基学习器对这个样本进行预测,并把预测结果结合起来,与真实的标记yi进行对比,如果预测错误,就把对比结果记为1,预测正确,则记为0。对原始样本集D中的所有样本(m个)都进行这种操作,并把对比结果累加起来(误分类样本个数),再除以样本总数,就得到了泛化误差的包外估计。

好,理解以上这三点,差不多也就理解了Bagging的思想。再补充以下几点:

一是由于Bagging属于并行集成,所以训练一个Bagging集成与直接使用基学习算法训练一个基学习器的复杂度同阶,这表明Bagging是一个非常高效的集成学习算法。

二是与标准的AdaBoost只适用于二分类任务不同,Bagging可以不经调整就用于多分类和回归任务。

三是从偏差-方差分解的角度来看,与GBDT关注于降低偏差不同,Bagging主要关注降低方差,因此在不剪枝决策树、神经网络等容易受到样本扰动的学习器上效果更明显。

理解了这些,接下来理解随机森林就水到渠成了。

三、随机森林

随机森林(Random Forest,简称RF),是以决策树为基学习器的Bagging集成算法,是Bagging集成算法中性能最强的。要理解随机森林,就要从它的名称入手,拆成“随机”和“森林”两个词,分别来理解。

首先森林两个字是非常好理解的,随机森林的基学习器是决策树,成百上千棵决策树就构成了一个森林,这是一种形象的说法。学习到多棵决策树之后,再按照上面所写的Bagging中基学习器的结合方法,就可以得到分类或回归的最终预测结果。

再来理解随机二字。随机森林中运用了两个“随机”,一是样本随机,也就是一般的Bagging集成中通过自助采样所得到的效果,也叫做样本扰动,这体现了随机森林继承性的一面。二是特征随机,也叫属性扰动,体现了随机森林创新的一面。假设训练数据集中的样本有d个属性(特征),构成一个属性集合,那么随机森林在构建一棵决策树的过程中,在每一个结点上选择属性进行分裂时,都先从属性集合中随机选择一个包含k个属性的属性子集(k<d),再从这个子集中选择一个最优属性进行分裂。回想一下传统的决策树构建过程,在每一个结点上都是从完整的属性集合(包含d个属性)中,选择最佳的属性进行分裂。一般情况下,推荐k的值取

所以随机森林中每棵树生成的规则是:

1、对于包含m个样本的原始数据集,通过自助采样得到同样包含m个样本的训练集;

2、每个样本有d个特征,那么选择一个小于d的整数k,随机地从d个特征中选择k个特征,然后决策树在每个结点上进行分裂时,从k个特征中选择最优的;

3、每棵树都生长到最大深度,不进行剪枝。

以上就是随机森林的思想和操作流程,几乎没有公式(如果已经学习了决策树),非常简单是不是,简直不敢相信!

随机森林只是对Bagging做了一个小改动,与一般Bagging集成中基学习器的“多样性”仅来自于样本扰动不同,随机森林再加入了属性扰动的机制。可别小看了这一个小改动,它使得基学习器之间的差异度进一步增加,从而进一步提高了集成的泛化性能,并且由于随机森林在构建决策树时只考察一个属性子集,与一般Bagging集成考察全部属性相比,训练效率高得多。

也正因为属性扰动机制非常重要,所以选择多少个属性(k的值)构成属性子集,就成了一个至关重要的问题,这也是随机森林中唯一的参数。

四、随机森林总结

随机森林中的决策树是不需要进行剪枝的,却一般不会过拟合,原因就在于两个随机:样本随机和特征随机,使得生成的各决策树之间存在较大的差异性,哪怕单独的一棵树是过拟合的,集成之后也可以消除这种影响。

随机森林的优点非常明显:

1、能够有效地运行在大规模数据集上;

2、能够处理具有高维特征的输入样本,而不需要降维;

3、抗噪能力强,能够很好地处理缺失值问题;

4、能够评估各个特征在分类问题上的重要性;

5、随机森林抗过拟合的能力比较强,生成的决策树不需要进行剪枝;

6、在决策树生成的过程中,就能够通过包外估计,对泛化误差建立一个无偏估计。

参考资料:

1、周志华:《机器学习》

2、https://www.cnblogs.com/maybe2030/p/4585705.html

Bagging之随机森林的更多相关文章

  1. Bagging与随机森林算法原理小结

    在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...

  2. 机器学习 —— 决策树及其集成算法(Bagging、随机森林、Boosting)

    本文为senlie原创,转载请保留此地址:http://www.cnblogs.com/senlie/ 决策树--------------------------------------------- ...

  3. 机器学习总结(二)bagging与随机森林

    一:Bagging与随机森林 与Boosting族算法不同的是,Bagging和随机森林的个体学习器之间不存在强的依赖关系,可同时生成并行化的方法. Bagging算法 bagging的算法过程如下: ...

  4. 机器学习回顾篇(12):集成学习之Bagging与随机森林

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  5. Bagging与随机森林(RF)算法原理总结

    Bagging与随机森林算法原理总结 在集成学习原理小结中,我们学习到了两个流派,一个是Boosting,它的特点是各个弱学习器之间存在依赖和关系,另一个是Bagging,它的特点是各个弱学习器之间没 ...

  6. 决策树算法(Bagging与随机森林)

    Bagging算法: 将训练数据集进行N次Bootstrap采样得到N个训练数据子集,对每个子集使用相同的算法分别建立决策树,最终的分类(或回归)结果是N个决策树的结果的多数投票(或平均). 其中,B ...

  7. bootstrap && bagging && 决策树 && 随机森林

    看了一篇介绍这几个概念的文章,整理一点点笔记在这里,原文链接: https://machinelearningmastery.com/bagging-and-random-forest-ensembl ...

  8. 机器学习相关知识整理系列之二:Bagging及随机森林

    1. Bagging的策略 从样本集中重采样(有放回)选出\(n\)个样本,定义子样本集为\(D\): 基于子样本集\(D\),所有属性上建立分类器,(ID3,C4.5,CART,SVM等): 重复以 ...

  9. 04-10 Bagging和随机森林

    目录 Bagging算法和随机森林 一.Bagging算法和随机森林学习目标 二.Bagging算法原理回顾 三.Bagging算法流程 3.1 输入 3.2 输出 3.3 流程 四.随机森林详解 4 ...

随机推荐

  1. 浅析fork()和底层实现

    记得以前初次接触fork()函数的时候,一直被“printf”输出多少次的问题弄得比较晕乎.不过,“黄天不负留心人".哈~ 终于在学习进程和进程创建fork相关知识后,总算是大致摸清了其中的 ...

  2. Ubuntu 下命令安装 ZooKeeper

    先去 http://mirrors.hust.edu.cn/apache/zookeeper/ 查看自己想要下载的版本 使用 wget 命令去下载 wget http://mirrors.hust.e ...

  3. 一道面试题引发的思考(C#值类型和引用类型)

    某年某月,笔者去面试招行的一个外包项目,辗转来到面试地点以后,面试官给了我一份试卷,试卷只有两道题目,其中一道是这样的: 阅读以下程序 class Program { struct Point { p ...

  4. 解决iframe在移动端(主要iPhone)上的问题

    前言 才发现已经有一段时间没有写博客了,就简单的说了最近干了啥吧.前段时间忙了杂七杂八的事情,首先弄了个个人的小程序,对的,老早就写了篇从零入手微信小程序开发,然后到前段时间才弄了个简单的个人小程序, ...

  5. js实用技巧

    IIFE(立即调用函数表达式)最广泛的用途是避免污染全局作用域. 已经有很多JavaScript库和JavaScript高手正在使用这种技巧, 尤其是在最流行jQuery插件的开发者中. 你也应该把这 ...

  6. flash builder 4.6与myecilpse 10.7集成

    一.在flash builder 4.0以后就没有单独提供插件版的flash builder了,因此必须先安装完整版的flash builder,再进行插件集成. 二.集成过程比较简单但也有几个要注意 ...

  7. mysql 30大优化策略

    mysql 30大优化策略 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 wher ...

  8. Myeclipse10.7.1 导出war包报错

    myeclipse10.7.1 导出war问题解决办法myeclipse10破解后,导出war包时报"SECURITY ALERT: INTEGERITY CHECK ERROR" ...

  9. Tiny4412之外部中断

    一:外部中断 在之前我们学习按键驱动的时候,我们检测按键有没有按下是通过轮循的方式(也就是我们说的死循环),这样虽然可以检测实现按键,但太浪费系统资源了,不论我们按键中断有没有发生,cpu都要一直进行 ...

  10. Linux时间子系统之三:时间的维护者:timekeeper

    专题文档汇总目录 Notes: 原文地址:Linux时间子系统之三:时间的维护者:timekeeper 本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法 ...