数据挖掘面试题之随机森林(RF)

随机森林

模型收到低偏差和高方差问题的困扰,应该如何解决


低偏差意味着模型的预测值接近实际值。换句话说,该模型有足够的灵活性,以模仿训练所有数据的分布。貌似很好,但是别忘了,一个过于灵活的模型是没有泛化能力的。这意味着,当这个模型用在对一个未曾见过的数据集进行测试的时候,它会令人很失望。

在这种情况下,我们可以使用bagging算法(如随机森林),以解决高方差问题。

bagging算法采用bootstrapping抽样策略,把数据集分成重复随机取样形成的子集。然后,这些样本利用单个学习算法生成一组模型。接着,利用投票(分类)或平均(回归)把模型预测结合在一起。

另外,为了应对高方差问题,还可以做一些其他的操作:

    1、加入正则惩罚。
   2、对树进行剪枝
    3、使用可变重要性图表中的前n个特征。
其实防止过拟合的small trick还有许多,主要可以从数据集与模型两个角度出发。今后会作总结。

随机森林的随机性
1、每棵树的训练样本是随机的。
2、每棵树的训练特征集合也是随机从所有特征中抽取的。


随机森林为什么不容易过拟合
随机森林由很多树组合在一起,单看每一棵树都可以是过拟合的,但是,既然是过拟合,就会拟合到非常小的细节上,因此随机森林通过引入随机性,让每一棵树拟合的细节不同,这时再把这些树组合在一起,过拟合的部分就会自动被消除掉。

所以随机森林不容易过拟合,但这不是绝对的,随机森林也是有可能出现过拟合的现象,只是出现的概率相对低。

就好比人类社会,有计算机的专家,也有神经生物学的专家,还有一个天文学的专家,这就像三颗过拟合的树,对于各自领域性能都很优秀,但对于宗教这类知识,三个人都不是很懂。由于三个人都处在同一个社会中,在社会中长久下来也有或多或少的接触过这方面的知识,于是三个人可以通过综合判断,得出宗教方面的一些正确答案。

扫描二维码关注公众号,回复: 9716104 查看本文章

当在随机森林中,如果我们用了远大于需求个数的树,就会发生过拟合的现象。所以一般在构建随机森林时我们会使用oob袋外错误率来修正模型的结构。

使用随机森林去弥补特征向量中的缺失值
对于训练集中的缺失值,可以使用均值,0等方式进行预填充,然后使用随机森林分类,同一个分类下的数据,更新缺失值,如果是分类变量缺失,用众数补上,如果是连续型变量缺失,用中位数补上,然后再次使用随机森林分类更新缺失值,4-6轮后可以达到一个比较好的效果。

使用随机森林对特征重要性进行评估
详见集成学习ensemble之随机森林。利用了袋外错误率OOB来做决策。

随机森林算法训练时主要需要调整哪些参数
1、n_estimators:随机森林建立子树的数量。较多的子树一般可以让模型有更好的性能,但同时会让代码变慢,严重的时候甚至还会导致过拟合!故需要通过交叉验证或者袋外错误率oob估计来选择最佳的随机森林子树数量。
2、max_features:随机森林允许单个决策树使用特征的最大数量。增加max_features一般能提高模型的性能,因为在每个树节点上,我们有更多的选择可以考虑。然而,这未必完全是对的,因为它降低了单个树的多样性(泛化能力),但这正是随机森林的一大特点。可以肯定的是,增加max_features会降低算法的速度,同时还会使得模型更加容易过拟合,因此,我们需要适当的平衡和选择最佳的max_features。
3、max_depth:决策树的最大深度。随机森林默认在决策树的建立过程中不会限制其深度,这也是随机森林的一大特点,其不必担心单棵树的过拟合。
4、min_samples_split:内部节点再划分所需要的最小样本数。如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。
5、min_samples_leaf:叶子节点最少样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
6、max_leaf_nodes:最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合,默认是“None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。
7、min_impurity_split:节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差,信息增益等)小于这个阈值,则该节点不再生成子节点。即为叶子节点。一般不推荐改动,默认值为1e-7。
概括一下,别看有整整7点,其实后5点全都是预剪枝的策略,在随机森林中,如果实在是为了防止过拟合等,可以采取预剪枝策略也就是上述的3-7方法。但对于随机森林这个模型而言,真正要调整的参数就n_estimators和max_features两个,而且在一般情况下,不需要怎么调就可以得到不错的结果。

随机森林为什么不能用全样本去训练m颗决策树
全样本训练忽视了局部样本的规律(各个决策树趋于相同),对于模型的泛化能力是有害的,使随机森林算法在样本层面失去了随机性。

随机森林算法的优缺点
优点:

1、训练可以高度并行化且性能普遍较好,对于大数据时代的大样本训练速度有优势。
2、随机森林对于高维数据集的处理能力令人兴奋,它可以处理成千上万的输入变量,并确定最重要的变量,因此被认为是一个不错的降维方法。此外,该模型能够输出变量的重要性程度,这是一个非常便利的功能!
3、在对缺失数据进行估计时,随机森林是一个十分有效的方法。就算存在大量的数据缺失,随机森林也能较好地保持精确性,一方面因为随机森林随机选取样本和特征,另一方面因为它可以继承决策树对缺失数据的处理方式。如果缺失数据的样本只是少量,随机森林甚至可以帮助去估计缺失值。
4、由于采用了随机采样,训练出的模型的方差小,对generlization error(泛化误差)使用的是无偏估计模型,泛化能力强。
5、对于不平衡数据集来说,随机森林可以平衡误差。当存在分类不平衡的情况时,随机森林能提供平衡数据集误差的有效方法。(对正类和反类分别进行重采样或欠采样, 之后采用多数投票的方法进行集成学习。或者不做采样,调整类别的判定阈值。)
6、随机森林能够解决分类与回归两种类型的问题,并在这两方面都有相当好的估计表现。(虽然RF能做回归问题,但通常都用RF来解决分类问题)。
缺点:

1、随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。(PS:随机森林已经被证明在某些噪音较大的分类或者回归问题上会过拟合)。
2、对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运行。只能在不同的参数和随机种子之间进行尝试。
3、可能有很多相似的决策树,掩盖了真实的结果。
4、对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类(随机性大大降低了)。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。
5、执行数据虽然比boosting等快(随机森林属于bagging),但比单只决策树慢多了,且精度一般不如boosting方法。

bagging方法可以有效降低模型的方差。随机森林每棵子树不需要剪枝,是低偏差高方差的模型,通过bagging降低方差后使得整个模型有较高的性能。

随机森林其实很简单,就是在bagging策略上略微改动了一下。

    1、从N个样本中有放回的随机抽样n个样本。
    2、如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树(ID3,C4.5,CART)进行分裂时,从这m个特征中选择最优的(信息增益,信息增益比率,基尼系数);
    3、每棵树都尽最大程度的生长,并且没有剪枝过程。
    4、最后采用投票表决的方式进行分类。
特征m个数的选取:
用作分类时,m默认取,最小取1.

用作回归时,m默认取M/3,最小取5.

两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。

随机森林分类效果(错误率)与两个因素有关:

森林中任意两棵树的相关性:相关性越大,错误率越大;
森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
  减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

OOB(Out Of Bag)袋外错误率
在bootstrapping的过程中,有些数据可能没有被选择,这些数据称为out-of-bag(OOB) examples。

解释一下上面这张图。一眼看还是挺难理解的,用白话讲一下。

是什么?
随机森林中每一次样本抽样(不是特征抽样),就是bootstrapping方法,是有放回的随机抽样,所以每一次抽的时候,对于一个特定的样本,抽到它的概率就是,很好理解,N个样本里随机抽取一个,抽到的概率当然是,因为是有放回的抽样,所以分母永远是N。

1/e是什么?
既然被抽到的概率是,那不被抽到的概率就是,很好理解。那指数大N又是什么呢?其实就是抽样的次数。假设我们的随机森林一共有A颗树,每棵树抽了B个样本,那么指数大N就是,是不是感觉指数大N应该和分母的那个N一样?其实这里只是为了方便,它表达的意思就是抽了很多次。

搞明白了那个公式之后,就可以开始计算了。要用到数学分析中的极限知识。一步步推一下。

这是基本公式: 后面的都是基于这个变形

这说明了什么呢?就是你随机森林已经造好了,但是即使你的训练集是整个样本集,其中也会有的样本你抽不到。为什么抽不到,上面的公式就是告诉你为什么抽不到。这些抽不到的样本就叫做out-of-bag(OOB) examples

好了,到这里已经能搞懂什么是out-of-bag(OOB) examples了。那这些样本能用来做什么呢?下面就介绍oob袋外错误率。

袋外错误率的应用
正常情况下,我们训练一个模型,怎么验证它好不好。是不是要拿出一部分的数据集当作验证集,更好的还要拿出一部分当作测试集,一般是6:2:2。

在随机森林中,有了out-of-bag(OOB) examples,我们就不需要拿出一部分数据了,out-of-bag(OOB) examples就是那部分没有用到的数据,我们可以直接当成验证集来使用。

obb error = 被分类错误数 / 总数

随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。

Breiman [1996b]在对 bagged 分类器的错误率估计研究中, 给出实证证据显示,out-of-bag 估计 和使用与训练集大小一致的测试集所得到的错误率一样精确. 所以, 使用out-of-bag error 估计可以不在另外建立一个测试集.

特征重要性度量
计算某个特征X的重要性时,具体步骤如下:

1、对整个随机森林,得到相应的袋外数据(out of bag,OOB)​计算袋外数据误差,记为errOOB1.

所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个数据用于训练​决策树,这时还有大约1/3的数据没有被利用,没有参与决策树的建立。这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。

​这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。

2、随机对袋外数据OOB所有样本的特征X加入噪声干扰(可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB2。

​3、假设森林中有N棵树,则特征X的重要性=(∑errOOB2−errOOB1)/N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB2上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。

特征选择
在特征重要性的基础上,特征选择的步骤如下:

1、计算每个特征的重要性,并按降序排序
2、确定要剔除的比例,依据特征重要性剔除相应比例的特征,得到一个新的特征集
3、用新的特征集重复上述过程,直到剩下m个特征(m为提前设定的值)。
4、根据上述过程中得到的各个特征集和特征集对应的袋外误差率,选择袋外误差率最低的特征集。

这就是通过袋外误差率最低的方法选择最优的m(特征个数)
优点
在数据集上表现良好
在当前的很多数据集上,相对其他算法有着很大的优势
它能够处理很高维度(feature很多)的数据,并且不用做特征选择
在训练完后,它能够给出哪些feature比较重要
在创建随机森林的时候,对generlization error使用的是无偏估计
训练速度快
在训练过程中,能够检测到feature间的互相影响
容易做成并行化方法
实现比较简单
可以得到变量重要性排序(两种:基于OOB误分率的增加量和基于分裂时的GINI下降量)

参考:https://blog.csdn.net/qq_32742009/article/details/81328496  【机器学习】集成学习ensemble之随机森林

发布了86 篇原创文章 · 获赞 1 · 访问量 8211

猜你喜欢

转载自blog.csdn.net/a1272899331/article/details/104690225