博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bagging之随机森林
阅读量:4914 次
发布时间:2019-06-11

本文共 3902 字,大约阅读时间需要 13 分钟。

随机森林(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

转载于:https://www.cnblogs.com/Luv-GEM/p/10669357.html

你可能感兴趣的文章
转换CLOB字段类型为VARCHAR2, lob类型不支持的sql语句
查看>>
用nRF52的RTC实现万年历
查看>>
mysql 外键约束
查看>>
CSS设置透明背景
查看>>
APP自動化測試腳本3
查看>>
[git] branch 分支操作
查看>>
谭浩强 c程序设计 8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串"486"。n的位数不确定,可以是任意位数的整数。...
查看>>
HtmlEncode和JavaScriptEncode(预防XSS)
查看>>
Visual Studio 2012 应用软件开发新方式
查看>>
sql中EXEC和sp_execsql区别-------------------------------------------待叙写
查看>>
JS监听回车事件
查看>>
海康、大华IpCamera RTSP地址和格式
查看>>
你能选择出,前几个元素吗?使用纯css
查看>>
Hbase源码分析:Hbase UI中Requests Per Second的具体含义
查看>>
常用脚本--将指定的字符串拆分多行数据
查看>>
C#中的yield return
查看>>
两分钟搞定博客园自定义样式
查看>>
回调函数(在原生ajax中应用) 事件监听 与promise的应用介绍
查看>>
利用纯真ip地址库 查询 ip所属地
查看>>
java中的单例模式
查看>>