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