随机森林特征重要性

2024-05-17 17:53

1. 随机森林特征重要性

在随机森林介绍中提到了随机森林一个重要特征:能够计算单个特征变量的重要性。并且这一特征在很多方面能够得到应用,例如在银行贷款业务中能否正确的评估一个企业的信用度,关系到是否能够有效地回收贷款。但是信用评估模型的数据特征有很多,其中不乏有很多噪音,所以需要计算出每一个特征的重要性并对这些特征进行一个排序,进而可以从所有特征中选择出重要性靠前的特征。
 
一:特征重要性
在随机森林中某个特征X的重要性的计算方法如下:
1:对于随机森林中的每一颗决策树,使用相应的OOB(袋外数据)数据来计算它的袋外数据误差,记为errOOB1.
2:  随机地对袋外数据OOB所有样本的特征X加入噪声干扰(就可以随机的改变样本在特征X处的值),再次计算它的袋外数据误差,记为errOOB2.
3:假设随机森林中有Ntree棵树,那么对于特征X的重要性=∑(errOOB2-errOOB1)/Ntree,之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入噪声之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。
 
二:特征选择
在论文 Variable Selection using Random Forests中详细的论述了基于随机森林的特征选择方法,这里我们进行一些回顾。
首先特征选择的目标有两个:
1:找到与应变量高度相关的特征变量。
2:选择出数目较少的特征变量并且能够充分的预测应变量的结果。
其次一般特征选择的步骤为:
1:初步估计和排序
a)对随机森林中的特征变量按照VI(Variable Importance)降序排序。
b)确定删除比例,从当前的特征变量中剔除相应比例不重要的指标,从而得到一个新的特征集。
c)用新的特征集建立新的随机森林,并计算特征集中每个特征的VI,并排序。
d)重复以上步骤,直到剩下m个特征。
2:根据1中得到的每个特征集和它们建立起来的随机森林,计算对应的袋外误差率(OOB err),将袋外误差率最低的特征集作为最后选定的特征集。

随机森林特征重要性

2. 随机森林如何评估特征重要性

 集成学习模型的一大特点是可以输出特征重要性,特征重要性能够在一定程度上辅助我们对特征进行筛选,从而使得模型的鲁棒性更好。
    随机森林中进行特征重要性的评估思想为:    判断每个特征在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。其中关于贡献的计算方式可以是基尼指数或袋外数据错误率。
   基尼指数计算方法:k 代表 k 个类别,  代表类别  k的样本权重。   
                                                                                                                                     
   对于一棵树   ,用OOB样本可以得到误差 e1,然后随机改变OOB中的第 j 列,保持其他列不变,对第 j 列进行随机的上下置换,得到误差 e2。至此,可以用 e1-e2 来刻画特征 j 的重要性。其依据就是,如果一个特征很重要,那么其变动后会非常影响测试误差,如果测试误差没有怎么改变,则说明特征j不重要。
   而该方法中涉及到的对数据进行打乱的方法通常有两种:   1)是使用uniform或者gaussian抽取随机值替换原特征;   2)是通过permutation的方式将原来的所有N个样本的第  i 个特征值重新打乱分布(相当于重新洗牌)。

3. 利用随机森林对特征重要性进行评估

 随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十分惊人的性能,因此,随机森林也被誉为“代表集成学习技术水平的方法”。   本文是对随机森林如何用在特征选择上做一个简单的介绍。
   只要了解决策树的算法,那么随机森林是相当容易理解的。随机森林的算法可以用如下几个步骤概括:
                                           没错,就是这个到处都是随机取值的算法,在分类和回归上有着极佳的效果,是不是觉得强的没法解释~   然而本文的重点不是这个,而是接下来的特征重要性评估。
   sklearn 已经帮我们封装好了一切,我们只需要调用其中的函数即可。 我们以UCI上葡萄酒的例子为例,首先导入数据集。
   然后,我们来大致看下这是一个怎么样的数据集
   输出为
   可见共有3个类别。然后再来看下数据的信息:
   输出为:
   可见除去class label之外共有13个特征,数据集的大小为178。
   按照常规做法,将数据集分为训练集和测试集。此处注意: sklearn.cross_validation 模块在0.18版本中被弃用,支持所有重构的类和函数都被移动到了model_selection模块。从sklearn.model_selection引入train_test_split 
   好了,这样一来随机森林就训练好了,其中已经把特征的重要性评估也做好了,我们拿出来看下。
   输出的结果为
   对的就是这么方便。   如果要筛选出重要性比较高的变量的话,这么做就可以
   输出为
   这样,帮我们选好了3个重要性大于0.15的特征。

利用随机森林对特征重要性进行评估