集成学习(三):随机森林

           在集成学习(一)中介绍过,Bagging(bootstrap aggregation)是一种增强模型多样性,降低方差的有效手段,特别适用于高方差,低偏差的模型,例如决策树,注意到Bagging也是一种可并行模型,而Boosting是一种顺序模型,是一类由弱学习器提升到强学习器的算法。注意到,对于绝大多数的情形,Boosting算法要优于Bagging,但是Bagging也有其自身优势那就是模型简单,可并行,运行速度快,运算量大大低于Boosting模型。

           随机森林(Random forsest)是一种Bagging的更进一步改良版本,他使得模型中子模型的多样性进一步增强,互相之间的相关性进一步降低。在许多模型中RF拥有这和Boosting类似不俗的表现,但是它更容易训练和剪枝。

 

 

 

随机森林算法

 

      

           随机森林和普通的Bagging的最主要区别是如下的所谓“随机特征选择”,也就是在每一次节点分裂的时候随机选取$m\leq P$个特征,再从中选出一个最优特征作为分裂节点。具体算法总结如下:

 


 

                   输入:训练数据集$D=\lbrace(x_{1},y_{1}),...,(x_{N},y_{N})\rbrace$, 其中$x_{i}\in\mathbb{R}^{P}$;正整数$T$;正整数$m\leq P$; 正整数$S\leq N$

                   输出:某分类或回归器

                   Step1. 对任意的$t=1,...,T$,执行如下操作:

                              1)用自助法随机从$D$中抽取$S$个样本形成样本集$D_{t}$

                              2)生成一决策树模型$f_{t}$,直到自定义的减枝条件得到满足后停止分裂节点,每一次分裂节点的时候执行如下步骤:

                                  i. 随机选取m个属性;

                                 ii. 从i中的m个属性中选出最优的属性及其相应的分裂节点

                                iii. 将节点分裂为两个子节点。

                   Step2. 输出树\lbrace f_{t}\rbrace_{t=1}^{T}的集成,回归问题取平均,分类问题取多数投票结果。

 


 

          我们可以看出随机森林的唯一比Bagging多出来的改进就是在于每次分裂随机选取若干属性进行分裂。这样做在自助法随机取样(数据样本扰动)的基础上进一步用输入扰动法对模型进行多样性增强,同时降低了不同子模型的相关性,减小了最终模型的方差,增强了其泛化能力,不仅如此也相对Baggging大大降低了运算量。

 

袋外样本与袋外误差

 

      对于随机森林中的每一颗树$f_{t}$, 它是由样本集$D_{t}$训练得到的,我们称所有的在D却不在$D_{t}$中的样本为$f_{t}$的袋外样本, 记作$D^{\prime}_{t}$ 而误差:

                                                     \begin{equation}OOBE(f_{t})\triangleq \frac{1}{\vert D_{t}^{\prime}\vert}\sum_{(x,y)\in D^{\prime}_{t}}l(f_{t}(x),y)\end{equation}   

称为$f_{t}$的袋外误差(Out of Bag Error),而对最后集成得到的随机森林模型$f$我们定义袋外误差为其所有树的袋外误差的平均:

                                                      \begin{equation}OOBE(f)=\frac{1}{T}\sum_{t=1}OOBE(f_{t})\end{equation}

这里我们看到了自助法的一大好处:

          OOBE可以内蕴的(intrinsicly)作为评价随机森林学习性能的评价指标,我们不需要再做交叉验证,而是在OOB不显著减小的时候停止训练。

 

内蕴的相似度矩阵(Intrinsic Proximity Matrix)

 

      除此以外,我们也可以对每个样本$(x_{i},y_{i})$与$(x_{j},y_{j})$定义一个相似度(或称接近度)$d_{ij}$,最后得到一个NxN相似度矩阵,具体做法也很容易理解:

      $d_{ij}=0$,遍历所有的树的所有叶节点,只要$(x_{i},y_{i})$与$(x_{j},y_{j})(i\neq j)$出现在同一个叶节点就将将$d_{ij}$加1,最后我们在将所有相似度除以随机森林中树的个数的两倍。

      这里由随机森林得到相似度矩阵是一种内蕴的得到样本之间的相似度的方法,利用此矩阵我们可以做[3]:

      1)聚类;

      2)缺失值处理;

      3)异常值检测;

 

 

特征重要性(Feature Importance)

 

       随机森林提供了两种方式计算特征重要性,一种方式比较直接:

                   某一特征的重要性是用所有树中以此特征作为分裂特征的节点分裂后的评价指标增量的总和。

            注意到,这种方式存在缺憾,主要是(参考博文[4]):

                   1)偏向于选择那些具有较多类别的变量。 
                   2)当存在相关特征时,一个特征被选择后,与其相关的其他特征的重要度则会变得很低,因为他们可以减少的不纯度已经被前面的特征移除了,也就是说特征重要性严重依赖于分裂特征被选择的次序。

 

            另一种方式是,某一个特征的重要性是对于每个树中该特征重要性的总和,而对每棵树$f_{t}$,特征$x_{k}$的重要性用如下的方法计算:

                   1)找出$f_{t}$的袋外样本,计算其袋外误差OOBE;

                   2)随机打乱输入矩阵中第k行的次序,计算打乱次序之后的袋外误差$OOBE^{\prime}$, 我们用$OOBE^{\prime}-OOBE$衡量树$f_{t}$中第$k$个特征的重要性。

 

总结:

 

           1. 随机森林的优点:

               可并行运算,速度快;

               随机特征选择,进一步增强多样性,减小运算量,降低了方差;

              由袋外误差我们可以内蕴地做模型性能评估而不需要再用CV或者建立validation集;

              可以得到特征的重要性,方便特征选择;

              可以内蕴地得到样本的相似度矩阵,方便进行聚类、异常值检测、缺失值处理。

 

           2.缺点:可解释性差,无法降低偏差,对于噪声大的数据依然容易过拟合。

 

参考文献:

   [1] 周志华:《机器学习》,北京,清华大学出版社,2016;

     [2] Trevor Hastie,Robert Tibshirani,Jerome Friedman: The Elements of Statistical Learning Data Mining,Inference,and Prediction, second edition, Springer Verleg, 2009

     [3] Breiman L: Manual On Setting Up, Using, And UnderstandingRandom Forests V3.1, http://oz.berkeley.edu/users/breiman/Using_random_forests_V3.1.pdf

     [4] "随机森林对特征重要性排序":https://blog.csdn.net/qq_15111861/article/details/80366787

posted @ 2019-10-16 23:36  Freiburger  阅读(784)  评论(0编辑  收藏  举报