首页 > 其他分享 >利用随机森林对特征重要性进行评估

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

时间:2024-08-27 09:04:58浏览次数:11  
标签:non Gini float64 随机 重要性 178 null 评估 mathrm

参考资料:https://blog.csdn.net/zjuPeco/article/details/77371645

3 特征重要性评估

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

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

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

我们这里只介绍用基尼指数来评价的方法,想了解另一种方法的可以参考文献2。

我们将变量重要性评分 (variable importance measures) 用VIM 来表示,将Gini指数用GI来表示,假设有 \(\mathrm{J}\) 个特征 \(X_1, X_2, X_3, \ldots, X_J , I\) 棵决策树, \(C\) 个类别,现在要计算出每个特征 \(X_j\) 的 Gini指数评分 \(V M_j^{(G i n i)}\) ,亦即第 \(j\) 个特征在RF所有决策树中节点分裂不纯度的平均改变量。

第 \(\mathrm{i}\) 棵树节点 \(q\) 的Gini指数的计算公式为

\[\mathrm{GI}_{\mathrm{q}}^{(\mathrm{i})}=\sum_{\mathrm{c}=1}^{|\mathrm{C}|} \sum_{\mathrm{c}^{\prime} \neq \mathrm{c}} \mathrm{p}_{\mathrm{qc}}^{(\mathrm{i})} \mathrm{p}_{\mathrm{q}^{\prime}}^{(\mathrm{i})}=1-\sum_{\mathrm{c}=1}^{|\mathrm{C}|}\left(\mathrm{p}_{\mathrm{qc}}^{(\mathrm{i})}\right)^2 \]

其中, \(\mathrm{C}\) 表示有 \(\mathrm{C}\) 个类别, \(\mathrm{p}_{\mathrm{q} \mathrm{c}}\) 表示节点 \(\mathrm{q}\) 中类别 \(\mathrm{c}\) 所占的比例。

直观地说,就是随便从节点 \(\mathrm{q}\) 中随机抽取两个样本,其类别标记不一致的概率。

特征 \(\mathrm{X}_{\mathrm{j}}\) 在第 \(\mathrm{i}\) 棵树节点 \(\mathrm{q}\) 的重要性,即节点 \(\mathrm{q}\) 分枝前后的Gini指数变化量为

\[\mathrm{VIM}_{\mathrm{jq}}^{(\text {Gini)(i) }}=\mathrm{GI}_{\mathrm{q}}^{(\mathrm{i})}-\mathrm{GI}_{\mathrm{l}}^{(\mathrm{i})}-\mathrm{GI}_{\mathrm{r}}^{(\mathrm{i})} \]

其中, \(\mathrm{GI}_1^{(\mathrm{i})}\) 和 \(\mathrm{GI}_{\mathrm{r}}^{(\mathrm{i})}\) 分别表示分枝后两个新节点的Gini指数。

如果,特征 \(X_j\) 在决策树 \(i\) 中出现的节点为集合 \(Q\) ,那么 \(X_j\) 在第 \(i\) 颗树的重要性为

\[\mathrm{VIM}_{\mathrm{j}}^{(\text {Gini)(i) }}=\sum_{\mathrm{q} \in \mathrm{Q}} \mathrm{VIM}_{\mathrm{jq}}^{(\text {Gini)(i) }} \]

假设RF 中共有I颗树,那么

\[\mathrm{VIM}_{\mathrm{j}}^{(\text {Gini })}=\sum_{\mathrm{i}=1}^{\mathrm{I}} \mathrm{VIM}_{\mathrm{j}}^{(\text {Gini)(i) }} \]

最后,把所有求得的重要性评分做一个归一化处理即可

\[V I M_j^{(\text {Gini })}=\frac{V I M_j^{(\text {Gini })}}{\sum_{j^{\prime}=1}^J V I M_{j^{\prime}}^{(\text {Gini })}} \]

4 举个例子

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

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

import pandas as pd
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df = pd.read_csv(url, header = None)
df.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 
              'Alcalinity of ash', 'Magnesium', 'Total phenols', 
              'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 
              'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline']

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

import numpy as np
np.unique(df['Class label'])

输出为

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

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

df.info()

输出为

<class 'pandas.core.frame.DataFrame'>
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:
	from sklearn.cross_validation import train_test_split
except:
	from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
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]
for f in range(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 的特征了吗~

标签:non,Gini,float64,随机,重要性,178,null,评估,mathrm
From: https://www.cnblogs.com/EIPsilly/p/18381870

相关文章

  • 无人机遥控器显示屏的重要性!!!
    无人机遥控器的显示屏在无人机操作中扮演着至关重要的角色,它提供了无人机状态、飞行参数、设置选项以及实时图像(对于带屏遥控器)等重要信息显示飞行参数:显示屏上可以实时显示无人机的高度、距离、坐标、速度、方向等关键飞行参数,帮助操作者了解无人机的飞行状态。电池电量监......
  • Python集成学习和随机森林算法使用详解
    概要集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它通过将多个弱学习器的结果结合起来,形成一个强学习器,从而提升模型的准确性和稳健性。随机森林(RandomForest)是集成学习中一种非常流行且有效的算法,特别适用于分类和回归任务。本文将详细介绍Python中如何......
  • Oracle_取随机数函数的常用方法
    1、从表中随机取记录SELECT*FROM(SELECT*FROMSDXJ.TEST_01ORDERBYDBMS_RANDOM.random)WHEREROWNUM<5;表示从SDXJ.TEST_01表中随机取4条记录2、产生随机数产生一个任意大小的随机数:SELECTDBMS_RANDOM.RANDOMFROMDUAL;产生......
  • LeetCode 690. 员工的重要性(哈希表、深度优先搜索dfs)
    题目:690.员工的重要性思路:先用哈希表map将每个员工的信息映射到员工ID对应的下标位置。接着使用深度优先搜索dfs,来记录总和即可。细节看注释/*//DefinitionforEmployee.classEmployee{public:intid;intimportance;vector<int>subordinates;......
  • 如何评估跨网文件安全交换系统的安全性和可靠性?
    跨网文件安全交换系统是一种用于在不同网络环境之间安全、高效地传输文件的技术和系统,也许是同一个公司内部的不同隔离网,也许是需要跨组织跨地域的场景。在这种场景下,一般传输的都是一些敏感文件数据,所以对传输的安全性、可靠性、合规性等都会有较高的要求,需要确保在复杂的网络环......
  • c++随机生成图画
    话不多说直接上代码:#include<bits/stdc++.h>#include<windows.h>#include<stdlib.h>#include<cstdio>#include<iostream>#include<string>#include<stdio.h>#include<ctime>#include<conio.h>#include<time.h>......
  • 《机器学习》—— 随机森林实现二分类问题
    文章目录一、什么是随机森林二、随机森林的主要特点三、随机森林参数四、案例的代码实现一、什么是随机森林随机森林(RandomForest)是一种集成学习方法,属于监督学习算法,主要用于分类和回归任务。它通过在数据集的多个子集上构建多个决策树,并输出这些树预测结果的众数(......
  • 机器学习:随机森林决策树学习算法及代码实现
    1、概念        随机森林(RandomForest)是一种集成学习方法,它通过构建多个决策树来进行分类或回归预测。随机森林的核心原理是“集思广益”,即通过组合多个弱学习器(决策树)的预测结果来提高整体模型的准确性和健壮性。2、集成学习(EnsembleLearning):        集......
  • 数据安全合规评估在线旅游平台的实践【原创】
    摘要:随着旅游服务行业数字化转型,数据逐渐成为核心生产要素。数据安全保障已成为在线旅游企业不可忽视的工作。本文旨在分析了近年来国内发布施行的数据安全相关法律法规和标准文件。为在线旅游平台企业数据安全保护提供了措施指导,提出了数据安全合规评估的体系框架和评估指标。为......
  • 用C#写一个随机音乐播放器
    form1中namespce里的代码如下publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){stringfolder=textBox1.Text;stringfolderPath......