2017-01-27 76 views
3

我想繪製隨機森林模型的要素重要性並將每個要素重要性映射回原始係數。我設法創建了一個顯示重要性並使用原始變量名稱作爲標籤的圖形,但現在它按照它們在數據集中的順序排序變量名稱(而不是按重要性排序)。我如何按照功能重要性排序?謝謝!將列名稱映射到隨機森林要素重要性

enter image description here

我的代碼是:

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() 
+0

你還沒有包括你目前得到的情節? –

+0

已編輯!我不確定劇情增加了多少價值,因爲我只是想改變底部x標籤的順序。對於小字體的道歉,這是將大部分圖片放入屏幕截圖的唯一方法。 – yogz123

+0

'plt.bar(範圍(x_dummies.shape [1]),重要性[indices], color =「r」,yerr = std [indices],align =「center」)'? –

回答

6

一個排序通用的解決方案將是扔的特徵/重要性有關成數據幀,並將其繪製之前進行排序:

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) 
1

我使用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

0

另一種簡單的方式來獲得一個排序列表

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')