Random Forest随机深林集成算法
一、什么是随机深林
随机森林(Random Forest,简称RF)就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,其实这也是随机森林的主要思想--集成思想的体现。“随机”的含义我们会在下边部分讲到。
其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想
随机深林的特征:
- 在当前算法中,它的准确性很高。
- 它可以在大型数据集上高效运行。
- 它可以处理数千个输入变量,而无需删除变量。并且不需要降纬
- 它可以评估各个特征在分类问题上的重要性。
- 在生成过程中,能够获取到内部生成误差的一种无偏估计。
- 对于缺省值问题也能够获得很好得结果。
- 可应用在不均衡样本的分类问题上。
- 可以将生成的林保存起来,以备将来在其他数据上使用。
- 计算得出的原型可以提供有关变量与分类之间关系的信息。
- 它计算可用于聚类,定位异常值或(通过缩放)给出有趣数据视图的成对案例之间的邻近度。
- 上面的功能可以扩展到未标记的数据,从而导致无监督的群集,数据视图和异常值检测。
- 它提供了一种检测变量相互作用的实验方法
具体问题可以参考这篇文章:https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#inter
二、随机深林的生成
前面提到,随机森林中有许多的分类树。我们要将一个输入样本进行分类,我们需要将输入样本输入到每棵树中进行分类。打个形象的比喻:森林中召开会议,讨论某个动物到底是老鼠还是松鼠,每棵树都要独立地发表自己对这个问题的看法,也就是每棵树都要投票。该动物到底是老鼠还是松鼠,要依据投票情况来确定,获得票数最多的类别就是森林的分类结果。森林中的每棵树都是独立的,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随机森林bagging的思想(关于bagging的一个有必要提及的问题:bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。)。下图可以形象地描述这个情况:
每棵树的按照如下规则生成:
(1)如果训练集大小为N,对于每棵树而言,随机且有放回(也就是抽一个就放回一个,然后再抽一个)地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;
从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。
为什么要随机抽样训练集?
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;
为什么要有放回地抽样?
我理解的是这样的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。
(2)如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的
(3)每棵树都尽最大程度的生长,并且没有剪枝过程
一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)
随机森林分类效果(错误率)与两个因素有关:
- 森林中任意两棵树的相关性:相关性越大,错误率越大;
- 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低,错误率低的树是强分类器
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数(也即是max_features)所以上次会提到说这个参数很重要,但是英文文献中又说(使用oob错误率(请参阅下文),可以快速找到该范围内的m值。这是随机森林对其比较敏感的唯一可调参数) 应该是oob
三、袋外错误率(oob error)
上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。
随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。
我们知道,在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例(P = (1 - 1 / x) ^ x,则 1/P = ( (1 + 1/(x-1) ) ^ (x -1) ) * ( 1 + 1/(x -1)),即 P=1/e = 0.368)没有参与第k棵树的生成,它们称为第k棵树的oob样本。
而这样的采样特点就允许我们进行oob估计,它的计算方式如下:
(1)对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);
__解释:__设有S个树,如上我们所知,任意一个样本大约会出现在2/3S个树上,同时也约有1/3S棵树上没有出现这个样本。这个样本是这1/3S棵树上的oob。这也意味着,这个样本可以作为1/3S棵树上的测试样本
(2)然后以简单多数投票作为该样本的分类结果;
__解释:__将某个样本放入1/3S棵树上,每个树都会得出一个预测结果,对这1/3S个数据进行投票
(3)最后用误分个数占样本总数的比率作为随机森林的oob误分率。
解释: 将每个预测结果和真实值进行比较,即ym^ 和 ym 是否相等。找出错误预测的个数占总数m的比率,即随机森林oob的误分率。
__oob误分率__是随机森林泛化误差的一个无偏估计,它的结果近似于需要大量计算的__k折交叉验证__。
泛化误差: 测试集上表现好,说明泛化能力强。反之说明泛化能力弱。
袋外错误率 = 测试集的错误率