-1

Я пытаюсь получить весовые значения важности каждой функции из моего фрейма. Я использую этот код из scikit документации:Получение важности функций с помощью RandomClassifier Scikit

names=['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'] 
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None,names=names) 



from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators=10000, 
random_state=0, 
n_jobs=-1) 
forest.fit(X_train, y_train) 

feat_labels = df_wine.columns[1:] 
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[f], importances[indices[f]])) 

но, несмотря я понимаю np.argsort метода, я до сих пор не понимаю, это цикл. Почему мы используем «индексы» для индексирования массива «importances»? И почему мы не можем просто использовать такой код:

for f in range(X_train.shape[1]): 
print("%2d) %-*s %f" % (f + 1, 30,feat_labels[f], importances[f])) 

выход в случае использования "важностей [индексы [F]]" (первые 5 строк):

1) Alcohol      0.182483 
2) Malic acid      0.158610 
3) Ash       0.150948 
4) Alcalinity of ash    0.131987 
5) Magnesium      0.106589 

Выходные в случае " важностей [F] "(первые 5 строк):

1) Alcohol      0.106589 
2) Malic acid      0.025400 
3) Ash       0.013916 
4) Alcalinity of ash    0.032033 
5) Magnesium      0.022078 
+0

Пожалуйста, добавьте ссылку на пример, на который вы ссылаетесь. –

+0

http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html – mokebe

ответ

0

Это не то, что помещается в документы, посмотрите внимательно, это говорит

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

, который является правильным, а не

# FROM YOUR QUESTION 
for f in range(X_train.shape[1]): 
    print("%2d) %-*s %f" % (f + 1, 30,feat_labels[f], importances[indices[f]])) 

что неправильно. Если вы хотите использовать feat_labels вы должны сделать

# CORRECT SOLUTION 
for f in range(X_train.shape[1]): 
    print("%2d) %-*s %f" % (f + 1, 30,feat_labels[indices[f]], importances[indices[f]])) 

Их подход используется потому, что они хотят, чтобы перебирать в порядке убывания признака важностей, не используя «индексы» будет использовать порядок функций вместо этого. Оба варианта прекрасны, единственное неправильное - первое, которое вы предложили, - это сочетание обоих подходов и неправильно присваивает важность функциям.

 Смежные вопросы

  • Нет связанных вопросов^_^