随机森林

来源:互联网 发布:效率与公平 知乎 编辑:程序博客网 时间:2024/04/27 16:06

这篇文章是自己对学习random forest的整理,里面参考了很多其他博主的成果,非常感谢,他们的原文链接详见参考文献。


Random Forest,顾名思义,Random就是随机抽取,Forest就是说这里不止一棵树,而由一群决策树组成的一片森林,连起来就是用随机抽取的方法训练出一群决策树来完成分类任务。

RF用了两次随机抽取,一次是对训练样本的随机抽取;另一次是对变量的随机抽取。这主要是为了解决样本数量有限的问题。

RF的核心是由弱变强思想的运用。每棵决策树由于只用了部分变量、部分样本训练而成,可能单个的分类准确率并不是很高。但是当一群这样的决策树组合起来分别对输入数据作出判断时,可以带来较高的准确率。有点类似于俗语 三个臭皮匠顶个诸葛亮。


下面从思想来源、基本思想、优缺点和现状等角度分别来说明一下。

 

1.思想来源

  在说明random forest的算法之前,我先了解了一下它的思想来源,主线条可以由下面这个发展线来表示。

PAC-->Bootstraps-->Bagging-->Random Forest<-- CART

  (1)PAC

   PAC(Probably Approximately Correct)是由KearnsValiant提出的一种学习模型。在该模型中,若存在一个多项式级的学习算法来识别一组概念,并且识别正确率很高,那么这组概念是强学习算法;而如果学习算法识别一组概念的正确率仅比随机猜测略好,那么这组概念是弱学习算法。如果可以将弱学习算法提升成强学习算法,那么我们就只要找到一个弱学习算法,然后把它提升成强学习算法,而不必去找通常情况下很难获得的强学习算法。

  (2)Bootstraps

  根据PAC由弱得到强的思想,统计学大牛Bradley Efron1979年提出了Bootstraps算法,这个名字来自于成语“pull up by your own bootstraps”,意思是依靠自己的资源,称为自助法。它的思想就是当样本数量不大,分布情况未知时,可以从原始样本中随机抽取的多个样本情况(弱学习)来估计原样本真实的分布情况。它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法。其基本步骤如下:
  ①从原始数据集中,有放回地抽样一定数量的样本
  ②根据抽出的样本计算给定的统计量T
  ③重复上述N次(一般大于1000),得到N个统计量T 
  ④计算上述N个统计量T的样本方差,得到统计量的方差

  这里举例说明其中一种最常用的方法:.632自助法。

  假设给定的数据集包含d个样本。该数据集有放回地抽样d次,产生d个样本的训练集。(原数据样本中的某些样本很可能在该样本集中出现多次)没有进入该训练集的样本最终形成检验集(测试集)。显然每个样本被选中的概率是1/d,因此未被选中的概率就是(1-1/d),这样一个样本在训练集中没出现的概率就是d次都未被选中的概率,即(1-1/d)d。当d趋于无穷大时,这一概率就将趋近于e-1=0.368,所以留在训练集中的样本大概就占原来数据集的63.2%

  (3)Bagging

  Bagging又叫bootstrap aggregation,是Breiman在1993年提出的方法,第一步就是根据Bootstrap进行抽样。基本的步骤:

     ①从样本集中用Bootstrap采样选出n个样本

     ②在所有属性上,对这n个样本建立分类器(CART or SVM or ...

     ③重复以上两步m次,i.e.建立 m个分类器(CART orSVM or ...

     ④将数据放在这m个分类器上跑,最后vote看到底分到哪一类

  这种方法可以大大降低每个分类器的不稳定性,从而带来较高的预测准确率。从这个方法再往下发展就是随机森林了。


(4)CART

    在讲随机森林之前,先说明一下里面用到的决策树算法CART(Classification and Regression Trees)。CART是以自顶向下递归方式构造的二叉树。基本的步骤包括构造和剪枝两部分。

    对于构造决策树方面:

     ①创建一个结点N

     ②如果样本T都在同一个类C中,那么返回N作为叶结点,以类C做标记

     ③从候选属性A集中找出GINI系数最小的属性

     ④将样本T划分为T1,T2两个子集

     ⑤对T1重复①-⑤

     ⑥对T2重复①-⑤

     生成的树是完全分裂的,肯定存在过度拟合的现象,CART使用事后剪枝的方式对决策树进行剪枝。

 

2.基本思想

  2001年, Breimanbagging基础上做了修改,提出了随机森林算法。该算法用随机的方式建立起一棵棵决策树,然后由这些决策树组成一个森林,其中每棵决策树之间没有关联,当有一个新的样本输入时,就让每棵树独立的做出判断,按照多数原则决定该样本的分类结果。我将通过建立和预测两个方面来具体介绍这个算法。

  (1)建立随机森林

  基本步骤:

    ①从样本集中用bagging采样选出n个样本,预建立CART

    ②在树的每个节点上,从所有属性中随机选择k个属性,选择出一个最佳分割属性作为节点(RI  RC

    ③重复以上两步m次,i.e.build mCART(不剪枝)

    ④这mCART形成Random Forest


   与bagging方法不同,随机森林存在两次随机过程:

    一是使用Bootstrap随机选择子样本;

    二是最佳分割属性不是从完全的属性集上挑选出来,而是从随机选出的部分属性集中挑选的。


   对于样本采样,Breiman用的就是前面介绍过的。632自助法。

   对于属性的采样,Breiman设计了两种方法,分别是RI(随机输入选择)和RC(随机线性组合)。


   RI就是随机的从完全属性集中选择一定数量的属性形成候选属性集。Breiman使用了F=1和F=比log2(M)+1小的第一个整数,其中M是数据集中所有属性的个数。

   RC会先从所有随机变量里面选择L个变量,然后把这些变量通过线性组合形成一个新的组合变量,使用的系数来自于[-1,1]上的随机数。用这种方法得到F个组合变量形成候选分割属性集。

  (2)使用随机森林

   基本步骤(分类):

   ①向建立好的随机森林中输入一个新样本

   ②随机森林中的每棵决策树都独立的做出判断

   ③将得到票数最多的分类结果作为该样本最终的类别


  上面是针对分类而言的,对于回归预测,最简单的做法就是将所有决策树的预测结果取平均值作为最终的结果。


3.优点与缺点

   (1)优点

    ①可以处理高维数据,可以不用进行特征筛选

    ②非常容易进行分布式处理,实现起来非常高效

    ③可以利用OOB(out of bag)数据评价算法的误差率,而不用像一般算法那样还需要选择validation set测误差

    ④可以利用OOB和permutation test(把某个特征的值随机进行重排)计算每个feature的重要性,也可以作为其他非线性算法特征选择阶段的算法

    ⑤因为最终结果通过voting by majority得到,相对光滑,像SVM那样“large-margin like”的边界,受噪音干扰小,鲁棒性好

    ⑥CART的优点:容易理解,处理非线性的问题,可以很好的处理数值型和序列型变量,处理缺失值

 

   (2)缺点

    ①树越多,随机森林的表现才会越稳定。所以在实际使用随机森林的时候需要注意如果树不够多的时候,可能会导致不稳定的情况。

    ②不平衡数据集。分类结果会倾向于样本多的类别,所以训练样本中各类别的数据必须相同。Breiman在实际实现该算法的时候有考虑到了这个问题,采取了根据样本类别比例对决策树的判断赋予不同权值的方法,比如类A:类B的样本量比例=3:1,,则对新样本,判断为类A的决策结果乘以25%,判断为类B的结果乘以75%,然后再比较两者大小,得到最终的结果。但是Breiman的实验结果也表明了该方法还是不能很好的解决由样本数量不平衡造成的结果不准确的问题。


4.研究现状

    我查看了一些文献,发现对随机森林算法本身的扩展有两个方面。

    一是对于高维特征,其中可能存在大量的特征对预测基本没有帮助,只有少量特征有用。如果采用上面的随机抽取特征的方法,帮助大的和没有帮助的被抽到的概率都是相同的,由于帮助小的特征占多数,使得随机森林中会存在大量的Weak tree,严重影响最终结果的准确性。解决的方法如下:

    ①通过特征加权的方法来提高个体树的权重(特征加权方法:特征与类别的相关性,特征与类别越相关,权重越大,实现可用t检验和卡方检验),用的是Adaboost的思想,是在选择候选分裂属性时用到,提高重要的特征被抽中的概率

    ②检测并排除那些错误率较高的树,利用out-of-bag 数据判断树的重要性,按判断正确率排序,选择其中70%作为最终的决策树


    二是运算速度太慢,无法on-line实现预测。解决方法就是进行预测之前,排除掉森林里面的一些树。首先给森林里面的每棵树随机加上一个权重,然后用一个generic algorithm 修改权重,使这些权重可以代表对正确决策的共享里面,定一个阈值,把那些权重高于该阈值的树留下来形成最终的森林


    当然还有一个思路就是不再是有一群决策树组成一个随机森林,二是由大量的弱神经网络等其他算法组成相应的强算法。

    文献看得有限,概括地可能不全面,以后发现新的再增加。


5.使用

   随机森林已经在R(Breiman和Adele Cutler写的Fortran代码,Andy Liaw和Matthew Wiener写的R接口)、Weka和开源项目Mahout(基于Hadoop)中实现,可以方便的进行调用。



6.参考文献

[1] http://blog.csdn.net/jlei_apple/article/details/8168856

[2] LEO BREIMAN. Random Forests. Machine Learning,45, 5–32, 2001

[3] http://blog.csdn.net/abcjennifer/article/details/8164315

[4] http://en.wikipedia.org/wiki/Bootstrapping_(statistics)

[5] http://baike.baidu.com/view/3075445.htm

[6] AnImproved Random Forest Classifier for Text classification

[7] 韩加炜 数据挖掘  概念与技术

[8] 台大林轩田老师的《机器学习技法》课程

0 0