一.基本原理

  • 随机森林是以决策树为基础的一种更高级的算法,像决策树一样,随机森林既可以用于分类,也可以用于回归
  • 随机森林是用随机的方式构建的一个森林,而这个森林是有很多互不关联的决策树组成
  • 理论上,随机森林的表现一般要优于单一的决策树,因为随机森林的结果是通过多个决策树结果投票来决定最后的结果
  • 简单来说,随机森林中的每个决策树都有一个自己的结果,随机森林通过统计每个决策树的结果,选择投票数最多的结果作为自己的最终结果,即三个臭皮匠赛过诸葛亮

二.优缺点

优点

  • 不易过拟合
  • 可能比boosting更快
  • 由于每次划分时只考虑很少的属性,因此它们在大型数据库上非常有效
  • 有很好的方法来填充缺失值,即便有很大一部分数据缺失,仍能保持很高的准确度
  • 给出了变量最重要的内在估计
  • 对于不平衡样本分类,它可以平衡误差
  • 可以计算各实例的亲近度,对于数据挖掘,检测离群点和数据可视化非常有用
  • 被证明对大规模数据集和存在大量且有时不相关特征的项来说很有用

缺点

  • 在某些噪声较大的分类和回归问题上会过拟合
  • 对于由不同级别的属性的数据,级别较多的属性会对随机森林产生较大的影响,所以随机森林在这种数据上产生的属性权值是不可信的

三.适用场景

  • 数据维度相对低,同时对准确性有较高的要求时,因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林
  • 一般用来作为分类算法的baseline
  • 可以看看特征重要性作为特征筛选的一种参考方式

四.常见面试题

1.请说明随机森林较一般决策树稳定的几点原因?

  • 随机森林分类的过程就是对于每个随机产生的决策树分类器,输入特征向量,森林中每棵决策树对样本进行分类,根据每个决策树的权重得到最后的分类结果。即随机森林就是由多颗决策树形成的并且随机森林是并行计算多颗决策树
  • bagging的方法,多个树投票提高泛化能力 
  • bagging中引入随机(参数、样本、特征、空间映射),避免单棵树的过拟合,提高整体泛化能力

决策树缺点和注意事项: 

  • 决策树的最大缺点是原理中的贪心算法。因此它所做的选择只能是某种意义上的局部最优选择 
  • 若目标变量是连续变量,那么决策树就不使用了,改用回归模型 
  • 若某些自变量的类别种类较多,或者自变量是区间型时,决策树过拟合的危险会增大。这种情况需要分箱或多次模型验证,确保其具有稳定性
  • 对区间型变量进行分箱操作时,无论是否考虑了顺序因素,都有可能因为分箱丧失了某些重要信息,尤其是当分箱前的区间型便变量与目标变量有明显的线性关系时,这种分箱造成的损失更为明显

2.rf和gbdt的区别
相同点

  • 都是由多棵树组成
  • 最终的结果都是由对棵树一起决定

不同点

  • 组成随机森林的数可是分类树也可以是回归树,而GBDT只由回归树组成
  • 组成随机森林的数可是并行生成,而GBDT只能是串行生成
  • 随机森林的结果是多棵树表决决定,而GBDT则是多棵树累加之和
  • 随机森林对异常值不敏感,而GBDT对异常值比较敏感
  • 随机森林是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能
  • 随机森林不需要进行数据预处理、归一化,而GBDT需要进行特征归一化

3.影响随机森林分类结果的因素

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

4.随机森林的特点

  • 准确率可以和adaboost相媲美,对错误和离群点更鲁棒
  • 准确率依赖于个体分类器的实力和它们之间的依赖性。理想情况是保持个体分类器的能力而不提高它们的相关性
  • 对每次划分所考虑的属性数很敏感,通常选取logn2+1个属性,其中n是数据集的实例数(一个有趣的观察是,使用单个随机选择的属性可能导致很好的准确率,常常比使用多个属性更高)
  • 场景举例:用户流失分析,风险评估

5.随机森林的生成

  • 通俗易懂的解释:随机森林中存在许多决策树,每棵决策树就是一个分类器。假如森林中有一棵新的树长成,森林要开大会讨论该植物属于哪一类,每棵树都要根据待分类树的特征发言并给出结论进行投票(每棵植物的看法都是独立的,互不影响),判断该树是松树还是杉树,根据每棵树的投票情况,获得票数最多的类别就是森林的分类结果。
  • 由于森林中每棵树都是独立的,那么森林大会中所有投票的结果必定会包括所有的情况
  • 部分优秀的树(强分类器)给出的投票结果会更加准确,大部分树的投票结果可能会产生更大的偏差,但是将若干个投票树(弱分类器)组合在一起就形成一个强分类器,即集中所有的分类器投票的结果,将投票次数最多的类别指定为最终的输出,这就是简单的随机森林Bagging的思想

那么森林中的每棵树是如何生成的?下面介绍每棵树的生成规则

  • 假如总共有 M 个样本,对于每棵树而言,随机且有放回地从样本集中抽取 N (M<N)个训练样本,作为该树的训练集
  • 注:值得注意的是,在选取训练集时,每棵树的训练集都是不同的,而且每个训练集之间都有重复的训练样本
  • 为什么随机选取训练集?
  • 如果不随机抽样,那么每棵树的训练集都是一样的,则最终训练出来的树分类结果也是完全一样的,这样就违背了Bagging思想
  • 为什么有放回地抽样?
  • 随机森林最后的分类结果取决于若干个弱分类器的投票结果,投票次数最多的类别,就是该待分类树的所属类别,在这个过程中是求同,而有放回地抽样就会产生相同的训练样本。如果不是有放回地抽样,那么每棵树的训练样本都是相同,没有交集,也就是说,每棵树训练出来的结果会存在很大的偏差。因此使用完全不一样的训练集来训练每棵树这样的做法对最终的分类结果没有任何的帮助。总之,对于每棵树的训练集而言,我们需要有放回地抽样
  • 假设每个训练样本的特征维度是 W,随机地从 W 个特征集中选取 x (x<W)个特征子集,每次树进行分裂时,从这 x 个特征中选择最优特征作为分裂点
  • 每棵树尽最大程度生长,不剪枝

6.随机森林的随机性体现在哪里?

  • 多次有放回的随机取样
  • 多次随机取属性

7.随机森林为什么比bagging效率高?

bagging无随机特征,使得训练决策树时效率更低

8.随机森林为什么不容易过拟合?

  • 随机森林中的每一棵树都是过拟合的,拟合到非常小的细节上
  • 随机森林通过引入随机性,使每一棵树拟合的细节不同
  • 所有树组合在一起,过拟合的部分就会自动被消除掉

9.影响随机森林分类效果的因素有哪些?

  • 森林中任意两棵树的相关性:相关性越大,错误率越大
  • 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低

减小特征选择个数m,树的相关性和分类能力也会相应的降低

增大m,两者也会随之增大

所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数

10.什么是OOB?随机森林中OOB是如何计算的?它有什么优缺点?

OOB(out of bag 袋外数据):

  • 构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率OOB error
  • bagging方法中bootstrap每次约有1/3的样本不会出现在bootstrap所采集的样本集合中,当然也就没有参加决策树的建立,把这1/3的数据称为袋外数据OOB,它可以用于取代测试集误差估计方法

袋外数据误差的计算方法如下:

  • 对于已经生成的随机森林,用袋外数据测试其性能,假设袋外数据总数为O,用这O个袋外数据作为输入,带进之前已经生成的随机森林分类器,分类器会给出O个数据相应的分类
  • 因为这O条数据的类型是已知的,则用正确的分类与随机森林分类器的结果进行比较,统计随机森林分类器分类错误的数目,设为X,则袋外数据误差大小等于X/O

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

11.随机森林如何处理缺失值?

根据随机森林创建和训练的特点,随机森林对缺失值的处理还是比较特殊的

  • 给缺失值预设一些估计值,比如数值型特征,选择其余数据的中位数或众数作为当前的估计值
  • 根据估计的数值,建立随机森林,把所有的数据放进随机森林里面跑一遍。记录每一组数据在决策树中一步一步分类的路径
  • 判断哪组数据和缺失数据路径最相似,引入一个相似度矩阵,来记录数据之间的相似度,比如有N组数据,相似度矩阵大小为N*N
  • 如果缺失值是类别变量,通过权重投票得到新估计值,如果是数值型变量,通过加权平均得到新的估计值,如此迭代,直到得到稳定的估计值

其实,该缺失值填补过程类似于推荐系统中采用协同过滤进行评分预测,先计算确实特征与其他特征的相似度,再加权得到缺失值的估计,而随机森林中计算相似度的方法(数据在决策树中一步一步分类的路径)乃其独特之处

12.如何使用随机森林对特征重要性进行评估?

袋外数据(OOB)

  • 对于随机森林的每一棵决策树,使用相应的OOB计算它的袋外数据误差,记为err1
  • 随机地对袋外数据所有样本特征X加入噪声干扰,再计算它的袋外数据误差err2
  • 假设随机森林有n棵树,那么对于特征X的重要性为(err2-err1/N) ,之所以可以用这个表达式来作为相应特征的重要性度量值是因为:若给某个特征随机加入噪声之后,袋外的准确度大幅降低,则说明这个特征对于样本的分类结果影响很大,也就是它的重要性程度比较高

stacking

  • 多次采样,训练多个分类器,将输出作为最后的输入特征
12-24 07:05