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

2024-05-17 10:29

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

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

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

2. 随机森林特征重要性

在随机森林介绍中提到了随机森林一个重要特征:能够计算单个特征变量的重要性。并且这一特征在很多方面能够得到应用,例如在银行贷款业务中能否正确的评估一个企业的信用度,关系到是否能够有效地回收贷款。但是信用评估模型的数据特征有很多,其中不乏有很多噪音,所以需要计算出每一个特征的重要性并对这些特征进行一个排序,进而可以从所有特征中选择出重要性靠前的特征。
 
一:特征重要性
在随机森林中某个特征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),将袋外误差率最低的特征集作为最后选定的特征集。

3. 随机森林进行特征重要性度量的详细说明

特征选择方法中,有一种方法是利用随机森林,进行特征的重要性度量,选择重要性较高的特征。下面对如何计算重要性进行说明。
  
 1 特征重要性​度量
  
 计算某个特征X的重要性时,具体步骤如下:
  
 1)对每一颗决策树,选择相应的袋外数据(out of bag,OOB)​计算袋外数据误差,记为errOOB1.
  
 所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个数据用于训练​决策树,这时还有大约1/3的数据没有被利用,没有参与决策树的建立。这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。
  
 ​ 这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。 
  
 ​2)随机对袋外数据OOB所有样本的特征X加入噪声干扰(可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB2。
  
 3)​假设森林中有N棵树,则特征X的重要性=∑(errOOB2-errOOB1)/N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB2上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。
  
 ​2 特征选择
  
 在特征重要性的基础上,特征选择的步骤如下:
  
 1)计算每个特征的重要性,并按降序排序
  
 2)确定要剔除的比例,依据特征重要性剔除相应比例的特征,得到一个新的特征集
  
 3)用新的特征集重复上述过程,直到剩下m个特征(m为提前设定的值)。
  
 4)根据上述过程中得到的各个特征集和特征集对应的袋外误差率,选择袋外误差率最低的特征集

随机森林进行特征重要性度量的详细说明

4. 随机森林进行特征重要性度量的详细说明

随机森林进行特征重要性度量的详细说明
特征选择方法中,有一种方法是利用随机森林,进行特征的重要性度量,选择重要性较高的特征。下面对如何计算重要性进行说明。
1 特征重要性度量
计算某个特征X的重要性时,具体步骤如下:
1)对每一颗决策树,选择相应的袋外数据(out of bag,OOB)计算袋外数据误差,记为errOOB1.
所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个数据用于训练决策树,这时还有大约1/3的数据没有被利用,没有参与决策树的建立。这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。
这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。
2)随机对袋外数据OOB所有样本的特征X加入噪声干扰(可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB2。
3)假设森林中有N棵树,则特征X的重要性=∑(errOOB2-errOOB1)/N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB2上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。
2 特征选择
在特征重要性的基础上,特征选择的步骤如下:
1)计算每个特征的重要性,并按降序排序
2)确定要剔除的比例,依据特征重要性剔除相应比例的特征,得到一个新的特征集
3)用新的特征集重复上述过程,直到剩下m个特征(m为提前设定的值)。
4)根据上述过程中得到的各个特征集和特征集对应的袋外误差率,选择袋外误差率最低的特征集。

5. 特征筛选(随机森林)

 随机森林能够度量每个特征的重要性,我们可以依据这个重要性指标进而选择最重要的特征。sklearn中已经实现了用随机森林评估特征重要性,在训练好随机森林模型后,直接调用feature_importan ces 属性就能得到每个特征的重要性。
   一般情况下,数据集的特征成百上千,因此有必要从中选取对结果影响较大的特征来进行进一步建模,相关的方法有:主成分分析、lasso等,这里我们介绍的是通过随机森林来进行筛选。
   用随机森林进行特征重要性评估的思想比较简单,主要是看每个特征在随机森林中的每棵树上做了多大的贡献,然后取平均值,最后比较不同特征之间的贡献大小。
   贡献度的衡量指标包括:基尼指数(gini)、袋外数据(OOB)错误率作为评价指标来衡量。
    衍生知识点:权重随机森林的应用(用于增加小样本的识别概率,从而提高总体的分类准确率) 
   随机森林/CART树在使用时一般通过gini值作为切分节点的标准,而在加权随机森林(WRF)中,权重的本质是赋给小类较大的权重,给大类较小的权重。也就是给小类更大的惩罚。权重的作用有2个,第1点是用于切分点选择中加权计算gini值,表达式如下:
                                           其中,N表示未分离的节点,N L 和N R 分别表示分离后的左侧节点和右侧节点,W i 为c类样本的类权重,n i 表示节点内各类样本的数量,Δi是不纯度减少量,该值越大表明分离点的分离效果越好。
   第2点是在终节点,类权重用来决定其类标签,表达式如下:
                                           参考文献:随机森林针对小样本数据类权重设置      https://wenku.baidu.com/view/07ba98cca0c7aa00b52acfc789eb172ded639998.html 
   这里介绍通过gini值来进行评价,我们将变量的重要性评分用VIM来表示,gini值用GI表示,假设有m个特征X 1 ,X 2 ,...X c ,现在要计算出每个特征X j 的gini指数评分VIM j ,即第j个特征在随机森林所有决策树中节点分裂不纯度的平均改变量,gini指数的计算公式如下表示:
                                           其中,k表示有k个类别,p mk 表示节点m(将特征m逐个对节点计算gini值变化量)中类别k所占的比例。
   特征X j 在节点m的重要性,即节点m分枝前后的gini指数变化量为:
                                           其中GI l 和GI r 分别表示分枝后两个新节点的gini指数。
   如果特征X j 在决策树i中出现的节点在集合M中,那么X j 在第i棵树的重要性为:
                                           假设随机森林共有n棵树,那么:
                                           最后把所有求得的重要性评分进行归一化处理就得到重要性的评分:
                                           通过sklearn中的随机森林返回特征的重要性:
   值得庆幸的是,sklearnsklearn已经帮我们封装好了一切,我们只需要调用其中的函数即可。   我们以UCI上葡萄酒的例子为例,首先导入数据集。
   然后,我们来大致看下这时一个怎么样的数据集
   输出为
   可见共有3个类别。然后再来看下数据的信息:
   输出为
   可见除去class label之外共有13个特征,数据集的大小为178。   按照常规做法,将数据集分为训练集和测试集。
   好了,这样一来随机森林就训练好了,其中已经把特征的重要性评估也做好了,我们拿出来看下。
   输出的结果为
   对的就是这么方便。   如果要筛选出重要性比较高的变量的话,这么做就可以
   输出为
   瞧,这不,帮我们选好了3个重要性大于0.15的特征了吗~
   [1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015.   [2] 杨凯, 侯艳, 李康. 随机森林变量重要性评分及其研究进展[J]. 2015.

特征筛选(随机森林)

6. 随机森林的优点

随机森林的优点有:1. 对于很多种资料,它可以产生高准确度的分类器。2. 它可以处理大量的输入变量。3. 它可以在决定类别时,评估变量的重要性。4. 在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计。5. 它包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度。6. 它提供一个实验方法,可以去侦测 variable interactions 。7. 对于不平衡的分类资料集来说,它可以平衡误差。8. 它计算各例中的亲近度,对于数据挖掘、侦测偏离者(outlier)和将资料视觉化非常有用。9. 使用上述。它可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料。10. 学习过程是很快速的。

7. 随机森林算法的优缺点

1.随机森林是一个用随机方式建立的,包含多个决策树的分类器。其输出的类别是由各个树输出的类别的众数而定。

2.随机性主要体现在两个方面:(1)训练每棵树时,从全部训练样本(样本数为N)中选取一个可能有重复的大小同样为N的数据集进行训练(即bootstrap取样)(2)在每个节点,随机选取所有特征的一个子集,用来计算最佳分割方式。

3.随机森林算法的优缺点:(1)随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟(2)对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
4.比决策树算法更复杂,计算成本更高。

随机森林算法的优缺点

8. 随机森林的缺点

1. 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟2. 对于有不同级别的属性的数据,级别划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。