0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

新机器视觉 来源:csdn 作者:zjuPeco 2022-10-10 17:14 次阅读

随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十分惊人的性能,因此,随机森林也被誉为“代表集成学习技术水平的方法”。

一、随机森林RF简介

只要了解决策树的算法,那么随机森林是相当容易理解的。随机森林的算法可以用如下几个步骤概括:

用有抽样放回的方法(bootstrap)从样本集中选取n个样本作为一个训练集。

用抽样得到的样本集生成一棵决策树。在生成的每一个结点:

随机不重复地选择d个特征;

利用这d个特征分别对样本集进行划分,找到最佳的划分特征(可用基尼系数、增益率或者信息增益判别)。

重复步骤1到步骤2共k次,k即为随机森林中决策树的个数。

用训练得到的随机森林对测试样本进行预测,并用票选法决定预测的结果。

下图比较直观地展示了随机森林算法(图片出自文献2):

图1:随机森林算法示意图

没错,就是这个到处都是随机取值的算法,在分类和回归上有着极佳的效果,是不是觉得强的没法解释~

然而本文的重点不是这个,而是接下来的特征重要性评估。

二、特征重要性评估

现实情况下,一个数据集中往往有成百上前个特征,如何在其中选择比结果影响最大的那几个特征,以此来缩减建立模型时的特征数是我们比较关心的问题。这样的方法其实很多,比如主成分分析,lasso等等。不过,这里我们要介绍的是用随机森林来对进行特征筛选。

用随机森林进行特征重要性评估的思想其实很简单,说白了就是看看每个特征在随机森林中的每棵树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。

好了,那么这个贡献是怎么一个说法呢?通常可以用基尼指数(Gini index)或者袋外数据(OOB)错误率作为评价指标来衡量。

我们这里只介绍用基尼指数来评价的方法,首先对另一种方法做个简单介绍。

的定义为:在 RF 的每棵树中,使用随机抽取的训练自助样本建树,并计算袋外数据 OOB)的预测错误率,然后随机置换变量X,的观测值后再次建树并计算 OOB 的预测错误率,最后计算两次 OOB 错误率的差值经过标准化处理后在所有树中的平均值即为变量 ,的置换重要性 ()

我们将变量重要性评分(variable importance measures)用 来表示,将Gini指数用 来表示,假设有 个特征 ,,,,, 棵决策树, 个类别,现在要计算出每个特征 的Gini指数评分 ,亦即第 个特征在RF所有决策树中节点分裂不纯度的平均改变量。

第 棵树节点 的 指数的计算公式为:

图片

其中, 表示有 个类别, 表示节点 中类别 所占的比例。直观地说,就是随便从节点 中随机抽取两个样本,其类别标记不一致的概率。

特征 在第 棵树节点 的重要性,即节点 分枝前后的 指数变化量为:

图片

其中,和 分别表示分枝后两个新节点的指数。如果,特征 在决策树 i 中出现的节点为集合,那么 在第 棵树的重要性为:

三、举个例子

值得庆幸的是,sklearn已经帮我们封装好了一切,我们只需要调用其中的函数即可。

我们以UCI上葡萄酒的例子为例,首先导入数据集。

importpandasaspd
url='http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df=pd.read_csv(url,header=None)
df.columns=['Classlabel','Alcohol','Malicacid','Ash',
'Alcalinityofash','Magnesium','Totalphenols',
'Flavanoids','Nonflavanoidphenols','Proanthocyanins',
'Colorintensity','Hue','OD280/OD315ofdilutedwines','Proline']

然后,我们来大致看下这时一个怎么样的数据集

importnumpyasnp
np.unique(df['Classlabel'])

输出为

array([1,2,3],dtype=int64)

可见共有3个类别。然后再来看下数据的信息:

df.info()

输出为


RangeIndex: 178 entries, 0 to 177
Data columns (total 14 columns):
Class label                     178 non-null int64
Alcohol                         178 non-null float64
Malic acid                      178 non-null float64
Ash                             178 non-null float64
Alcalinity of ash               178 non-null float64
Magnesium                       178 non-null int64
Total phenols                   178 non-null float64
Flavanoids                      178 non-null float64
Nonflavanoid phenols            178 non-null float64
Proanthocyanins                 178 non-null float64
Color intensity                 178 non-null float64
Hue                             178 non-null float64
OD280/OD315 of diluted wines    178 non-null float64
Proline                         178 non-null int64
dtypes: float64(11), int64(3)
memory usage: 19.5 KB

可见除去class label之外共有13个特征,数据集的大小为178。

按照常规做法,将数据集分为训练集和测试集。

try:
fromsklearn.cross_validationimporttrain_test_split
except:
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.ensembleimportRandomForestClassifier
x,y=df.iloc[:,1:].values,df.iloc[:,0].values
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
feat_labels=df.columns[1:]
forest=RandomForestClassifier(n_estimators=10000,random_state=0,n_jobs=-1)
forest.fit(x_train,y_train)

好了,这样一来随机森林就训练好了,其中已经把特征的重要性评估也做好了,我们拿出来看下。

importances=forest.feature_importances_
indices=np.argsort(importances)[::-1]
forfinrange(x_train.shape[1]):
print("%2d)%-*s%f"%(f+1,30,feat_labels[indices[f]],importances[indices[f]]))

输出的结果为

 1) Color intensity                0.182483
 2) Proline                        0.158610
 3) Flavanoids                     0.150948
 4) OD280/OD315 of diluted wines   0.131987
 5) Alcohol                        0.106589
 6) Hue                            0.078243
 7) Total phenols                  0.060718
 8) Alcalinity of ash              0.032033
 9) Malic acid                     0.025400
10) Proanthocyanins                0.022351
11) Magnesium                      0.022078
12) Nonflavanoid phenols           0.014645
13) Ash                            0.013916

对的就是这么方便。

如果要筛选出重要性比较高的变量的话,这么做就可以

threshold=0.15
x_selected=x_train[:,importances>threshold]
x_selected.shape

输出为

(124, 3)

瞧,这不,帮我们选好了3个重要性大于0.15的特征了吗~

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RF
    RF
    +关注

    关注

    65

    文章

    3025

    浏览量

    165654
  • 数据集
    +关注

    关注

    4

    文章

    1179

    浏览量

    24356

原文标题:利用随机森林评估特征重要性原理与应用

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    机器学习随机森林相关知识

    机器学习之随机森林(三)
    发表于 04-02 10:06

    GPS产业的发展和重要性与日俱增

    GPS产业的发展和重要性与日俱增,随之而来的是对GPS接收机的测试要求越来越严格,从而准确评估产品的性能。
    发表于 07-18 06:50

    随机森林的相关知识

    机器学习之随机森林(一)
    发表于 08-27 07:30

    代码规范的重要性是什么

    论代码规范的重要性
    发表于 05-19 13:07

    ML之决策树与随机森林

    ML--决策树与随机森林
    发表于 07-08 12:31

    时钟服务器的重要性是什么?

    时钟服务器的重要性是什么?
    发表于 11-08 08:31

    UPS的重要性

    中心机房的UPS太重要了,前不久就出现过停电坏了一个磁盘陈列硬盘的事故,一个2T的硬盘坏了,还好有一个备用的硬盘使用,否则磁盘陈列里的资料就岌岌可危了。服务器多了,UPS的重要性尤其重要,学校周边
    发表于 11-16 09:09

    arm汇编的重要性是什么?

    arm汇编的重要性是什么?
    发表于 11-30 08:03

    POE浪涌保护的重要性是什么?

    POE浪涌保护的重要性是什么?
    发表于 01-14 06:07

    基于随机森林模型下CINI的RFG-SVM

    针对计算机辅助诊断(CAD)技术在乳腺癌疾病诊断准确率的优化问题,提出了一种基于随机森林模型下Gini指标特征加权的支持向量机方法(RFGSVM)。该方法利用
    发表于 11-22 15:57 0次下载
    基于<b class='flag-5'>随机</b><b class='flag-5'>森林</b>模型下CINI的RFG-SVM

    基于特征切分和随机森林的异常点检测模型

    大数据时代,攻击篡改、设备故障、人为造假等原因导致海量数据中潜藏着许多异常值。准确地检测出数据中的异常点,实现数据清洗,至关重要。文中提出一种结合特征切分与多层级联随杌森林的异常点检测模型
    发表于 05-13 14:22 0次下载

    基于加权随机森林等的恶意软件检测

    基于机器学习的 Android平台恶意软件检测方法提取的权限信息特征维度高且类别区分能力弱,导致检测精度低及复杂度高。为此,提出一种基于特征占比差与加权随机森林的恶意软件检测方法。通过
    发表于 06-10 10:47 14次下载

    基于Python实现随机森林算法

    机器学习算法是数据挖掘、数据能力分析和数学建模必不可少的一部分,而随机森林算法和决策树算法是其中较为常用的两种算法,本文将会对随机森林算法的Python实现
    的头像 发表于 09-21 11:17 658次阅读
    基于Python实现<b class='flag-5'>随机</b><b class='flag-5'>森林</b>算法

    Python如何进行特征重要性分析

    特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要特征,它是机器学习中经常使用的
    发表于 10-13 12:32 174次阅读
    Python如何<b class='flag-5'>进行</b><b class='flag-5'>特征</b><b class='flag-5'>重要性</b>分析

    Python中进行特征重要性分析的9个常用方法

    重要性分析可以识别并关注最具信息量的特征,从而带来以下几个优势: 改进的模型性能 减少过度拟合 更快的训练和推理 增强的可解释性 下面我们深入了解在Python中的一些特性重要性分析的方法。
    的头像 发表于 10-16 11:09 380次阅读
    Python中<b class='flag-5'>进行</b><b class='flag-5'>特征</b><b class='flag-5'>重要性</b>分析的9个常用方法