[Machine Learning & Algorithm] 随机森林(Random Forest)
阅读目录
1 什么是随机森林?
2 随机森林的特点
3 随机森林的相关基础知识
4 随机森林的生成
5 袋外错误率(oob error)
6 随机森林工作原理解释的一个简单例子
7 随机森林的 Python 实现
8 参考内容
1 什么是随机森林?
回到顶部
作为新兴起的、高度灵活的一种机器学习算法,随机森林(Random Forest,简称 RF)拥有广泛的应
用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,
也可用来预测疾病的风险和病患者的易感性。最初,我是在参加校外竞赛时接触到随机森林算法的。最近
几年的国内外大赛,包括 2013 年百度校园电影推荐系统大赛、2014 年阿里巴巴天池大数据竞赛以及 Kaggle
数据科学竞赛,参赛者对随机森林的使用占有相当高的比例。此外,据我的个人了解来看,一大部分成功
进入答辩的队伍也都选择了 Random Forest 或者 GBDT 算法。所以可以看出,Random Forest 在准确率
方面还是相当有优势的。
那说了这么多,那随机森林到底是怎样的一种算法呢?
如果读者接触过决策树(Decision Tree)的话,那么会很容易理解什么是随机森林。随机森林就是通
过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分
支——集成学习(Ensemble Learning)方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森
林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,
其实这也是随机森林的主要思想--集成思想的体现。“随机”的含义我们会在下边部分讲到。
其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个
输入样本,N 棵树会有 N 个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指
定为最终的输出,这就是一种最简单的 Bagging 思想。
回到顶部
2 随机森林的特点
我们前边提到,随机森林是一种很灵活实用的方法,它有如下几个特点:
在当前所有算法中,具有极好的准确率/It is unexcelled in accuracy among current algorithms;
能够有效地运行在大数据集上/It runs efficiently on large data bases;
能够处理具有高维特征的输入样本,而且不需要降维/It can handle thousands of input variables
without variable deletion;
能够评估各个特征在分类问题上的重要性/It gives estimates of what variables are important i
n the classification;
1
在生成过程中,能够获取到内部生成误差的一种无偏估计/It generates an internal unbiased esti
mate of the generalization error as the forest building progresses;
对于缺省值问题也能够获得很好得结果/It has an effective method for estimating missing da
ta and maintains accuracy when a large proportion of the data are missing
... ...
实际上,随机森林的特点不只有这六点,它就相当于机器学习领域的 Leatherman(多面手),你几乎
可以把任何东西扔进去,它基本上都是可供使用的。在估计推断映射方面特别好用,以致都不需要像 SVM
那样做很多参数的调试。具体的随机森林介绍可以参见随机森林主页:Random Forest。
回到顶部
3 随机森林的相关基础知识
随机森林看起来是很好理解,但是要完全搞明白它的工作原理,需要很多机器学习方面相关的基础知
识。在本文中,我们简单谈一下,而不逐一进行赘述,如果有同学不太了解相关的知识,可以参阅其他博
友的一些相关博文或者文献。
1)信息、熵以及信息增益的概念
这三个基本概念是决策树的根本,是决策树利用特征来分类时,确定特征选取顺序的依据。理解了它
们,决策树你也就了解了大概。
引用香农的话来说,信息是用来消除随机不确定性的东西。当然这句话虽然经典,但是还是很难去搞
明白这种东西到底是个什么样,可能在不同的地方来说,指的东西又不一样。对于机器学习中的决策树而
言,如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息可以定义如下:
I(x)用来表示随机变量的信息,p(xi)指是当 xi 发生时的概率。
熵是用来度量不确定性的,当熵越大,X=xi 的不确定性越大,反之越小。对于机器学习中的分类问题
而言,熵越大即这个类别的不确定性更大,反之越小。
信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好。
这方面的内容不再细述,感兴趣的同学可以看 信息&熵&信息增益 这篇博文。
2)决策树
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每
个叶节点代表一种类别。常见的决策树算法有 C4.5、ID3 和 CART。
3)集成学习
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自
独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。你可以在这找
到用 python 实现集成学习的文档:Scikit 学习文档。
回到顶部
4 随机森林的生成
2
前面提到,随机森林中有许多的分类树。我们要将一个输入样本进行分类,我们需要将输入样本输入
到每棵树中进行分类。打个形象的比喻:森林中召开会议,讨论某个动物到底是老鼠还是松鼠,每棵树都
要独立地发表自己对这个问题的看法,也就是每棵树都要投票。该动物到底是老鼠还是松鼠,要依据投票
情况来确定,获得票数最多的类别就是森林的分类结果。森林中的每棵树都是独立的,99.9%不相关的树做
出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪
音”,做出一个好的预测。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随
机森林 bagging 的思想(关于 bagging 的一个有必要提及的问题:bagging 的代价是不用单棵决策树来做预
测,具体哪个变量起到重要作用变得未知,所以 bagging 改进了预测准确率但损失了解释性。)。下图可
以形象地描述这个情况:
有了树我们就可以分类了,但是森林中的每棵树是怎么生成的呢?
每棵树的按照如下规则生成:
1)如果训练集大小为 N,对于每棵树而言,随机且有放回地从训练集中的抽取 N 个训练样本(这种采
样方式称为 bootstrap sample 方法),作为该树的训练集;
从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。
为什么要随机抽样训练集?(add @2016.05.28)
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样
的话完全没有 bagging 的必要;
为什么要有放回地抽样?(add @2016.05.28)
我理解的是这样的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,
这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很
大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使
用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。
2)如果每个样本的特征维度为 M,指定一个常数 m<
森林中任意两棵树的相关性:相关性越大,错误率越大;
森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
减小特征选择个数 m,树的相关性和分类能力也会相应的降低;增大 m,两者也会随之增大。所以关
键问题是如何选择最优的 m(或者是范围),这也是随机森林唯一的一个参数。
回到顶部
5 袋外错误率(oob error)
上面我们提到,构建随机森林的关键问题就是如何选择最优的 m,要解决这个问题主要依据计算袋外
错误率 oob error(out-of-bag error)。
随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的
一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。
我们知道,在构建每棵树时,我们对训练集使用了不同的 bootstrap sample(随机且有放回地抽取)。
所以对于每棵树而言(假设对于第 k 棵树),大约有 1/3 的训练实例没有参与第 k 棵树的生成,它们称为
第 k 棵树的 oob 样本。
而这样的采样特点就允许我们进行 oob 估计,它的计算方式如下:
(note:以样本为单位)
1)对每个样本,计算它作为 oob 样本的树对它的分类情况(约 1/3 的树);
2)然后以简单多数投票作为该样本的分类结果;
3)最后用误分个数占样本总数的比率作为随机森林的 oob 误分率。
(文献原文:Put each case left out in the construction of the kth tree down the kth tree to get
a classification. In this way, a test set classification is obtained for each case in about one-third of
the trees. At the end of the run, take j to be the class that got most of the votes every time case n
was oob. The proportion of times that j is not equal to the true class of n averaged over all cases is
the oob error estimate. This has proven to be unbiased in many tests.)
oob 误分率是随机森林泛化误差的一个无偏估计,它的结果近似于需要大量计算的 k 折交叉验证。
回到顶部
6 随机森林工作原理解释的一个简单例子
描述:根据已有的训练集已经生成了对应的随机森林,随机森林如何利用某一个人的年龄(Age)、性
别(Gender)、教育情况(Highest Educational Qualification)、工作领域(Industry)以及住宅地(Residence)
共 5 个字段来预测他的收入层次。
收入层次 :
Band 1 : Below $40,000
Band 2: $40,000 – 150,000
Band 3: More than $150,000
随机森林中每一棵树都可以看做是一棵 CART(分类回归树),这里假设森林中有 5 棵 CART 树,总
特征个数 N=5,我们取 m=1(这里假设每个 CART 树对应一个不同的特征)。
CART 1 : Variable Age
4
CART 2 : Variable Gender
CART 3 : Variable Education
CART 4 : Variable Residence
CART 5 : Variable Industry
我们要预测的某个人的信息如下:
1. Age : 35 years ; 2. Gender : Male ; 3. Highest Educational Qualification : Diploma holder; 4.
Industry : Manufacturing; 5. Residence : Metro.
根据这五棵 CART 树的分类结果,我们可以针对这个人的信息建立收入层次的分布情况:
最后,我们得出结论,这个人的收入层次 70%是一等,大约 24%为二等,6%为三等,所以最终认定
该人属于一等收入层次(小于$40,000)。
8 参考内容
[1] Random Forest's homepage (by Leo Breiman and Adele Cutler)
[2] Introduction to Random forest - Simplified
5
[3] Comparing a Random Forest to a CART model (Part 2)
[4] Introduction to Random forest (博主:爱 67)
[5] Python 实现随机森林
[6] 随机森林之 oob error 估计
[7] 随机森林
[8] Wikipedia-Random Forest
[9] Ensemble methods
6