-1

Ich versuche, die Wichtigkeit Gewichte jeder Funktion aus meinem Dataframe zu bekommen. Ich benutze diesen Code aus scikit Dokumentation:Getting Funktionen wichtig mit 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]])) 

aber trotz ich np.argsort Methode verstehen, ich dies noch nicht FOR-Schleife begreifen. Warum verwenden wir "Indizes" für die Indizierung von "Importances" -Array? Und warum können wir nicht einfach einen solchen Code verwenden:

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

Ausgabe im Fall der Verwendung von "Wichtigkeiten [Indizes [f]]" (die ersten 5 Zeilen):

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

Ausgang im Falle von " Wichtigkeiten [f] "(die ersten 5 Zeilen):

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

Fügen Sie dem Beispiel, auf das Sie verweisen, einen Link hinzu. –

+0

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

Antwort

0

Dies ist nicht das, was in der Dokumentation gelegt wird, genau hinsehen, es sagt

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

was richtig ist, und nicht

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

was falsch ist. Wenn Sie feat_labels verwenden möchten, sollten Sie

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

tun Ihr Ansatz wird verwendet, weil sie in absteigender Reihenfolge der Funktion Wichtigkeiten iterieren wollen, nicht „Indizes“ verwenden würde stattdessen Reihenfolge der Funktionen nutzen. Beides ist in Ordnung, das einzige falsche ist das erste, das Sie vorgeschlagen haben - das ist eine Mischung aus beiden Ansätzen und weist Funktionen fälschlicherweise zu.