在 RandomForestRegressor sklearn 中绘制特征重要性

Posted

技术标签:

【中文标题】在 RandomForestRegressor sklearn 中绘制特征重要性【英文标题】:Plot feature importance in RandomForestRegressor sklearn 【发布时间】:2019-11-05 14:33:06 【问题描述】:

我是数据科学的新手。我正在尝试找出我的数据集的特征重要性排名。我已经应用了随机森林并得到了输出。

这是我的代码:

# importing libraries

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# importing dataset

dataset=pd.read_csv('Churn_Modelling.csv')
X = dataset.iloc[:,3:12].values
Y = dataset.iloc[:,13].values

#encoding catagorical data

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

#country
labelencoder_X_1= LabelEncoder()
X[:,1]=labelencoder_X_1.fit_transform(X[:,1])

#gender
labelencoder_X_2= LabelEncoder()
X[:,2]=labelencoder_X_2.fit_transform(X[:,2])

onehotencoder = OneHotEncoder(categorical_features=[0])
X = onehotencoder.fit_transform(X).toarray()


#spliting dataset into test set and train set

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.20)

from sklearn.ensemble import RandomForestRegressor

regressor = RandomForestRegressor(n_estimators=20, random_state=0)  
regressor.fit(X_train, y_train) 

在重要性部分,我几乎复制了以下示例: https://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html

代码如下:

#feature importance
from sklearn.ensemble import ExtraTreesClassifier

importances = regressor.feature_importances_
std = np.std([tree.feature_importances_ for tree in regressor.estimators_],
             axis=0)
indices = np.argsort(importances)[::-1]
print("Feature ranking:")

for f in range(X.shape[1]):
    print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))

# Plot the feature importances of the forest
plt.figure()
plt.title("Feature importances")
plt.bar(range(X.shape[1]), importances[indices],
       color="r", yerr=std[indices], align="center")
plt.xticks(range(X.shape[1]), indices)
plt.xlim([-1, X.shape[1]])
plt.show()

我期待文档中显示的输出。任何人都可以帮助我吗?提前致谢。

我的数据集在这里:

【问题讨论】:

在问题中添加一小段数据,而不是像这样共享公共平台的链接,除非您可以接受陌生人查看并可能使用您的数据 【参考方案1】:

你有很多特点,在一个情节中是看不到的。 只是绘制其中的一些。

这里我绘制了前 20 个最重要的:

# Plot the feature importances of the forest
plt.figure(figsize=(18,9))
plt.title("Feature importances")
n=20
_ = plt.bar(range(n), importances[indices][:n], color="r", yerr=std[indices][:n])
plt.xticks(range(n), indices)
plt.xlim([-1, n])
plt.show()

我的代码,如果你需要它:https://filebin.net/be4h27swglqf3ci3

输出:

【讨论】:

如何调整我的列名(年龄、薪水等)而不是特征号(462,465..)? @serafeim 使用onehotencoder.inverse_transform 转换回来,然后使用索引来获取名称。有关 onehotencoder 属性的更多详细信息,请参阅文档

以上是关于在 RandomForestRegressor sklearn 中绘制特征重要性的主要内容,如果未能解决你的问题,请参考以下文章

sklearn RandomForestRegressor 显示的树值中的差异

将 GridSearchCV 用于 RandomForestRegressor

用于分类问题的 RandomForestRegressor

了解 RandomForestRegressor 中的 max_features 参数

属性错误:“RandomForestRegressor”对象没有属性“best_params_”

sklearn 中的 RandomForestRegressor 给出负分