随机森林(Random Forest)学习小记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dpengwang/article/details/88089988

RF如何工作

建立多个决策树并将他们融合起来得到一个更加准确和稳定的模型,是bagging 思想和随机选择特征的结合。随机森林构造了多个决策树,当需要对某个样本进行预测时,统计森林中的每棵树对该样本的预测结果,然后通过投票法从这些预测结果中选出最后的结果。
随机体现在两个方面,一个是随机取特征,另一个是随机取样本,让森林中的每棵树既有相似性又有差异性。

森林中每棵树按照如下方式生长:
  1. 如果过训练样本中有N个样本,那么从这N个样本中有放回的抽样N次,将得到的样本用于建树
  2. 设M为输入样本的特征数,对于每个节点分裂时,我们先从这M个特征中选择m(m<<M)个特征,然后再在这m个特征中选择最佳的分裂点进行分裂
  3. 每棵树都尽可能的生长,没有剪枝

m的值越大,上述1中的相关性越高,2中的分类能力也越强,所以m在RF中是一个非常重要的参数

随机森林的预测错误率取决于以下两点:
  1. 森林中任意两棵树之间的相关性,相关性越高,错误率越大
  2. 每棵树的分类能力,单棵树的分类能力越强,那么整个森林的分类能力也越强

And of course Random Forest is a predictive modeling tool and not a descriptive tool. That means, if you are looking for a description of the relationships in your data, other approaches would be preferred.

RF的特点

优点(来自原论文的总结):

  1. 准确率高运行起来高效(树之间可以并行训练)
  2. 不用降维也可以处理高维特征
  3. 给出了度量特征重要性的方法
  4. 建树过程中内部使用无偏估计
  5. 有很好的处理缺失值的算法
  6. 对于类别不平衡数据能够平衡误差
  7. 能够度量样本之间的相似性,并基于这种相似性对于样本进行聚类和筛选异常值
  8. 提出了一种衡量特征交互性的经验方法(数据中存在冗余特征时能很好的处理)
  9. 可以被扩展到无监督学习
  10. 产生的模型可以被应用到其他数据上
  11. Prototypes are computed that give information about the relation between the variables and the classification.

9-11有点假大空,没深入研究了。上述优点都能在以下的知识点中找出原因。

OOB和OOB Error

oob(out of bag)
对于一个具有m个样本的训练集,我们有放回的抽取m个样本进行训练,那么每个样本不被抽到的概率为 p = ( 1 1 m ) m p=(1-\frac{1}{m})^{m} ,当m越来越大时,p趋于1/3,也就是森林形成后的过程中有三分之一的数据是没有被用到的。那么这三分之一的数据可以当做测试集来计算模型的误差率,我们将这些没用有用到的数据经过森林预测得到类别,在于其真实值进行比较,求出错误率即可。这样就避免了使用交叉验证或者使用其他的测试集来计算泛化误差率这样计算分类错误率的方法可以被证明是无偏的。
OOB Error在训练过程中可以不断的进行计算袋外误差,来判断是否要继续生成新的树。(因为单棵树是不剪枝的,无法将OOB Error应用于剪枝,这是我个人理解也不知道对不对)

对特征重要性的评判(Variable importance)

方法1 : permute variable

根据袋外误差率,对于特征m,首先用训练好的随机森林在对oob 数据D进行预测并求出误差率Error1。然后对数据D中每个样本的特征m上加上随机噪音,然后再将m特征上带噪音的样本送入训练好的RF模型中训练得到新的误差率Error2,则Error2 - Error1越大说明该特征越重要。直观上,加一点噪音就极大的影响了准确定那么该特征肯定重要。

方法2 : Gini gain

Gini系数法,RF中的每棵树中生成时都会按照某个节点来分裂,分裂的依据可以是分裂前后Gini系数的减少度,我们将RF的每棵树中按照特征m进行分裂的Gini系数减少量的总和作为判断特征m重要性的标准

特征间的交互性(nteractions)

判断两个变量间的交互性可以按照如下的方法:
如果棵树中,样本按照某个特征m分裂后的样本,在特征k上更容易分裂或者更不容易分裂,那么成m与k具有一定的交互性

样本间的近似性 (proximity)

a i j / N a_{ij}/N 来表示样本i和j之间的相似性, a i j a_{ij} 表示在森林中样本i和样本j被分到同一个叶子下的次数,N为森林中树的棵数,从而可以得到一个相似度矩阵(prox matrix),这个矩阵可以做 clustering 和 outlier location

近似性应用: 找出异常点

假设当前样本n的class 为j,则样本n与其同class 的样本之间的距离为:
P ( n ) = d ( k ) = j prox 2 ( n , k ) \overline{P}(n)=\sum_{\mathrm{d}(k)=j} \operatorname{prox}^{2}(n, k)
其中prox(n,k) 就是相似矩阵中的值
将异常值的判定标准定为,:
n s a m p l e / P ( n ) nsample/\overline{P}(n)
nsample为同类样本的个数,上式值越大说明越可能是异常值。
此外还可以用作聚类

缺失值的填补(Missing value replacement)

方法一(na.roughfix)简单粗暴,对于训练集,同一个class下的数据,如果是分类变量缺失,用众数补上,如果是连续型变量缺失,用中位数补。

方法二(rfImpute)。他只能补训练集中的缺失值。是先用na.roughfix补上缺失值,然后构建森林并计算proximity matrix,再回头看缺失值,如果是分类变量,则用没有缺失的观测实例的proximity中的权重进行投票。如果是连续型变量,则用proximity矩阵进行加权平均的方法补缺失值。然后迭代4-5次。这个补缺失值的思想和KNN有些类似。

平衡预测误差(Balancing prediction error)

对于不平衡数据的训练和预测,不能只关注总体的误差率,比如测试集中class A 99个,classB1个,现在模型对着一百数据的预测中,classA预测全对,classB全错,总误差率为1%,但是在classB上的误差率是100%,这对于正负样本失衡的数据是非常不友好的(比如风险欺诈问题)。
解决方法如下:
对比重少的类别加较大的权重,对比重大的类别加小的权重
(这个地方还没弄懂)

缺点

  1. 黑盒,不可解释性强,多个随机导致了非常好的效果
  2. 在某些噪声较大的分类和回归问题上会过拟合
  3. 模型会非常大,越准确意味着越多的数

待解决的问题:
袋外误差提供的无偏估计在建立森林时到底起到了什么样的作用,是限制了树的棵数吗?
不均衡样本的权重到底加在那

参考资料:
https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#inter

猜你喜欢

转载自blog.csdn.net/dpengwang/article/details/88089988