【问题标题】:Mapping column names to random forest feature importances将列名映射到随机森林特征重要性
【发布时间】:2017-06-13 12:19:42
【问题描述】:

我正在尝试绘制随机森林模型的特征重要性并将每个特征重要性映射回原始系数。我设法创建了一个显示重要性的图,并使用原始变量名称作为标签,但现在它按照变量名称在数据集中的顺序(而不是重要性顺序)对变量名称进行排序。如何按功能重要性的顺序对它们进行排序?谢谢!

我的代码是:

importances = brf.feature_importances_
std = np.std([tree.feature_importances_ for tree in brf.estimators_],
         axis=0)
indices = np.argsort(importances)[::-1]

# Print the feature ranking
print("Feature ranking:")

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

# Plot the feature importances of the forest
plt.figure(figsize=(8,8))
plt.title("Feature importances")
plt.bar(range(x_train.shape[1]), importances[indices],
   color="r", yerr=std[indices], align="center")
feature_names = x_dummies.columns
plt.xticks(range(x_dummies.shape[1]), feature_names)
plt.xticks(rotation=90)
plt.xlim([-1, x_dummies.shape[1]])
plt.show()

【问题讨论】:

  • 你没有包括你目前得到的情节?
  • 已编辑!我不确定该情节增加了多少价值,因为我只是想更改底部 x 标签的顺序。为小字体道歉,这是将大部分图片放入屏幕截图的唯一方法。
  • plt.bar(range(x_dummies.shape[1]), importances[indices], color="r", yerr=std[indices], align="center") ?
  • 你说得对,x_train 应该是 x_dummies,但不幸的是,这并没有改变情节。

标签: python pandas


【解决方案1】:

一种通用的解决方案是将特征/重要性放入数据框中并在绘图之前对其进行排序:

import pandas as pd
%matplotlib inline
#do code to support model
#"data" is the X dataframe and model is the SKlearn object

feats = {} # a dict to hold feature_name: feature_importance
for feature, importance in zip(data.columns, model.feature_importances_):
    feats[feature] = importance #add the name/value pair 

importances = pd.DataFrame.from_dict(feats, orient='index').rename(columns={0: 'Gini-importance'})
importances.sort_values(by='Gini-importance').plot(kind='bar', rot=45)

【讨论】:

    【解决方案2】:

    我使用与 Sam 类似的解决方案:

    import pandas as pd
    important_features = pd.Series(data=brf.feature_importances_,index=x_dummies.columns)
    important_features.sort_values(ascending=False,inplace=True)
    

    我总是使用print important_features 打印列表,但要绘制你总是可以使用Series.plot

    【讨论】:

      【解决方案3】:

      很简单,我是这样画的。

      feat_importances = pd.Series(extraTree.feature_importances_, index=X.columns)
      feat_importances.nlargest(15).plot(kind='barh')
      plt.title("Top 15 important features")
      plt.show()
      
      

      【讨论】:

      • 我订阅了这个答案。
      【解决方案4】:

      另一种获取排序列表的简单方法

      importances = list(zip(xgb_classifier.feature_importances_, df.columns))
      importances.sort(reverse=True)
      

      如果需要,下一个代码会添加可视化效果

      pd.DataFrame(importances, index=[x for (_,x) in importances]).plot(kind = 'bar')
      

      【讨论】:

        猜你喜欢
        • 2018-11-28
        • 2021-05-09
        • 2021-08-29
        • 2016-11-06
        • 2021-05-13
        • 2015-05-12
        • 1970-01-01
        • 2020-05-26
        • 2019-06-17
        相关资源
        最近更新 更多