Random Forest 学习笔记整理(转载)
转自:http://blog.csdn.net/joyce0625/article/details/24593635,感觉作者对random forest的理解很深,关键是这篇文章将random forest的来龙去脉讲清楚了,这比单独的看一篇文章方法要好很多,故直接转载过来了,如果想深入的了解random forest,有一个Machine Learning的教程不错mathematicalmonk's channel, http://www.youtube.com/playlist?list=PLD0F06AA0D2E8FFBA,当然你要FQ看了哈。。。和下面这篇博文一起看,效果更佳,整个第二章都是的,建议先将这篇博文看一遍,心中有个大概,再回头看视频,仔细深入的学习算法,最后去看Paper,恩恩
这篇文章是自己对学习random forest的整理,里面参考了很多其他博主的成果,非常感谢,他们的原文链接详见参考文献。
1.思想来源
在说明random forest的算法之前,我先了解了一下它的思想来源,主线条可以由下面这个发展线来表示。
PAC-->Bootstraps-->Bagging-->Random Forest<-- CART
(1)PAC
PAC(Probably Approximately Correct)是由Kearns和Valiant提出的一种学习模型。在该模型中,若存在一个多项式级的学习算法来识别一组概念,并且识别正确率很高,那么这组概念是强学习算法;而如果学习算法识别一组概念的正确率仅比随机猜测略好,那么这组概念是弱学习算法。如果可以将弱学习算法提升成强学习算法,那么我们就只要找到一个弱学习算法,然后把它提升成强学习算法,而不必去找通常情况下很难获得的强学习算法。
(2)Bootstraps
根据PAC由弱得到强的思想,统计学大牛Bradley Efron在1979年提出了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年, Breiman在bagging基础上做了修改,提出了随机森林算法。顾名思义,随机森林就是用随机的方式建立起一棵棵决策树,然后由这些决策树组成一个森林,其中每棵决策树之间没有关联,当有一个新的样本输入时,就让每棵树独立的做出判断,按照多数原则决定该样本的分类结果。我将通过建立和预测两个方面来具体介绍这个算法。
(1)建立随机森林
基本步骤:
①从样本集中用bagging采样选出n个样本,预建立CART
②在树的每个节点上,从所有属性中随机选择k个属性,选择出一个最佳分割属性作为节点(RI 和 RC)
③重复以上两步m次,i.e.build m棵CART(不剪枝)
④这m个CART形成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)优点
①简单易懂
②可以处理高维数据,而且不用进行特征筛选
③受噪音干扰小
④算法内部就可以对错误率、重要性等的评价
⑤准确度和Adaboost差不多
⑥比bagging或者boosting快
⑦容易进行分布式处理
(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] 韩加炜 数据挖掘 概念与技术