随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
随机森林和使用决策树作为基本分类器的(bagging)有些类似。以决策树为基本模型的bagging在每次bootstrap放回抽样之后,产生一棵决策树,抽多少样本就生成多少棵树,在生成这些树的时候没有进行更多的干预。而随机森林也是进行bootstrap抽样,但它与bagging的区别是:在生成每棵树的时候,每个节点变量都仅仅在随机选出的少数变量中产生。因此,不但样本是随机的,连每个节点变量(Features)的产生都是随机的。
许多研究表明, 组合分类器比单一分类器的分类效果好,随机森林(random forest)是一种利用多个分类树对数据进行判别与分类的方法,它在对数据进行分类的同时,还可以给出各个变量(基因)的重要性评分,评估各个变量在分类中所起的作用。
随机森林在以决策树为基学习器构建Bagging的基础上,进一步在训练过程中引入了随机属性选择。传统决策树在选择划分属性时,是在当前结点的属性集合中选择一个最优属性;在随机森林中,对基决策树的每个结点,先从该结点的属性集合d中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分,参数k控制了随机性的引入程度,一般推荐k=log2d
一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。由于Bagging每次训练都进行采样来训练模型,所以模型的泛化能力很强,对于降低模型的方差很有作用。当然对于训练基地额拟合误差就会大一点,也就输模型偏倚会大一些。
注意到这和GBDT的子采样是不同的,GBDT的子采样是无放回采样,而Bagging的子采样是有有放回采样。
对于一个样本,它在某一次含m个样本的训练集的随机采样中,每次被采集到的概率是1/m。不被采集到的概率为1−1/m。如果m次采样都没有被采集中的概率是(1−1/m)m。当m→∞时,(1−1/m)m→1/e≃0.368。也就是说,在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采样集采集中。对于这36.8%的没有被采集到的数据,我们称之为袋外数据(Out of bag,简称oog)。这些数据没有参与训练模型的拟合,因此可以检验模型泛化能力.
建立每棵决策树的过程中,有2点:采样与完全分裂。首先是两个随机采样的过程,RF要对输入数据进行一下行(样本)、列(特征)采样,对于行采样(样本)采用有放回的方式,也就是在采样得到的样本中可以有重复。从M个特征中(列采样)出m特征。之后就是用完全分裂的方式建立出决策树。这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。
分裂的办法是:采用上面说的列采样的过程从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。决策树形成过程中每个节点都要按完全分裂的方式来分裂,一直到不能够再分裂为止(如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。
每棵树的按照如下规则生成:
总的来说就是随机选择样本数,随机选取特征,随机选择分类器,建立多颗这样的决策树,然后通过这几课决策树来投票,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)
主要优点是:
训练可以高度并行化,对于大数据大样本(千万级样本,多变量)训练速度有优势。
它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化,且不需要降维。
可以得到变量重要性排序(两种方式:基于OOB误分率的增加量和基于分裂时的GINI下降量)。
由于采取了随机采样,模型的泛化能力强,方差小,不容易过拟合(两个随机,随机抽取特征,随机抽取样本)。
对于不平衡数据集来说,RF提供平衡误差的有效方法(可以通过采样)。
如果有很大一部分的特征遗失(缺失值),仍可以维持准确度。
相比于Boosting系列的GBDT和Adaboost,RF实现比较简单。
主要缺点是:
随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
RF在解决回归问题时,并不如分类表现那么好,因为它不能给出一个连续的输出(决策树本身限定)。
处理小数据或低维数据,可能不能产生很好的分类。
根据随机森林创建和训练的特点,随机森林对缺失值的处理还是比较特殊的。
其实,该缺失值填补过程类似于推荐系统中采用协同过滤进行评分预测,先计算缺失特征与其他特征的相似度,再加权得到缺失值的估计,而随机森林中计算相似度的方法(数据在决策树中一步一步分类的路径)乃其独特之处。
上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。
bagging方法中Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中,当然也就没有参加决策树的建立,把这1/3的数据称为袋外数据oob(out of bag),它可以用于取代测试集误差估计方法。
袋外数据(oob)误差的计算方法如下:
优缺点:这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。
为什么要进行随机抽样?
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,依然没有解决决策树过拟合问题。随机抽样是为了保证不同决策树之间的多样性,从而提高模型的泛化能力。使得随机森林不容易陷入过拟合,并且具有较好的抗噪能力(比如:对缺省值不敏感)。
为什么要有放回地抽样?
而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同"。如果是无放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",从而影响最终的投票结果。为了保证最终结果的可靠性,同时又要保证模型的泛化能力,需要每一颗树既要“求同“ 又要 ”存异”
控制bagging框架的参数
控制决策树的参数
其他参数:
对象属性:
oob_score
参数选择True的时候才可用。方法:
https://cloud.tencent.com/developer/article/1170422
https://cloud.tencent.com/developer/article/1541702
https://www.cnblogs.com/pinard/p/6156009.html