2017-02-09 7 views
0

Я пытаюсь создать модель регрессии случайного леса на одном из моих наборов данных. Мне нужно найти порядок важности каждой переменной вместе с их именами. Я пробовал несколько вещей, но не могу достичь того, чего хочу. Ниже приведен пример кода я попытался на Бостон жилищного набора данных:Как напечатать порядок важных функций в реестре случайного леса с помощью python?

from sklearn.ensemble import RandomForestClassifier 
from sklearn.datasets import load_boston 
from sklearn.ensemble import RandomForestRegressor 
import pandas as pd 
import numpy as np 
boston = load_boston() 
rf=RandomForestRegressor(max_depth=50) 
idx=range(len(boston.target)) 
np.random.shuffle(idx) 
rf.fit(boston.data[:500], boston.target[:500]) 
instance=boston.data[[0,5, 10]] 
print rf.predict(instance[0]) 
print rf.predict(instance[1]) 
print rf.predict(instance[2]) 
important_features=[] 
for x,i in enumerate(rf.feature_importances_): 
     important_features.append(str(x)) 
print 'Most important features:',', '.join(important_features) 

Наиболее важные особенности: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

Если я печатаю это:

impor = rf.feature_importances_ 
impor 

я ниже выхода:

array([ 3.45665230e-02, 4.58687594e-04, 5.45376404e-03, 
    3.33388828e-04, 2.90936201e-02, 4.15908448e-01, 
    1.04131089e-02, 7.26451301e-02, 3.51628079e-03, 
    1.20860975e-02, 1.40417760e-02, 8.97546838e-03, 
    3.92507707e-01]) 

Мне нужно получить имена, связанные с этими значениями, а затем выбрать т из этих функций.

+0

Я не думаю, что я мог бы знать об этом. Но я бы предложил рассчитать энтропию для каждой функции, и самые высокие функции энтропии были бы важными. – EngineeredBrain

+0

@AnwarShaikh: Вы получаете значимость каждой функции в некоторой ценности, используя rf.feature_importances_, дающую некоторые значения. Нам нужно напечатать имена вместе с его порядком. – CodeHunter

ответ

2

Во-первых, вы используете неправильное имя для переменной. Вы используете important_features. Используйте feature_importances_ вместо этого. Во-вторых, он вернет массив формы [n_features,], который содержит значения feature_importance. Вам нужно отсортировать их по порядку этих значений, чтобы получить наиболее важные функции. См RandomForestRegressor documentation

Edit: Добавлен код

important_features_dict = {} 
for x,i in enumerate(rf.feature_importances_): 
    important_features_dict[x]=i 


important_features_list = sorted(important_features_dict, 
           key=important_features_dict.get, 
           reverse=True) 

print 'Most important features: %s' %important_features_list 

Это напечатает индекс важных функций в порядке убывания. (Первое самое важное и т. Д.)

+0

Спасибо, что указали это. Я изменил код. Добавлены мои изменения здесь. Но моя проблема все та же. – CodeHunter

+0

@ashishkumar Я добавил код для достижения желаемого –

+0

Я получаю пустой список на выходе, когда я это пробовал. – CodeHunter

-1
# list of column names from original data 
cols = data.columns 
# feature importances from random forest fit rf 
rank = rf.feature_importances_ 
# form dictionary of feature ranks and features 
features_dict = dict(zip(np.argsort(rank),cols)) 
# the dictionary key are the importance rank; the values are the feature name