Die Wichtigkeit von Features beim Lernen mit dem Scikit Random Forest zeigt eine sehr hohe Standardabweichung

13

Ich verwende den Random Forest Classifier von scikit-learn und möchte die Wichtigkeit von Features wie in diesem Beispiel darstellen .

Mein Ergebnis ist jedoch völlig anders, in dem Sinne, dass die Standardabweichung der Merkmalsbedeutung fast immer größer ist als die Merkmalsbedeutung selbst (siehe beigefügtes Bild).

Feature-Wichtigkeit

Kann man sich so verhalten, oder mache ich Fehler beim Plotten?

Mein Code ist der folgende:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()
gc5
quelle
IIUC predictorsgibt ein zurück, auf numpy arraydas Sie pandas Dataframedurch seine Spalten verweisen. Dies ist falsch, da numpy arraysdas Attribut nicht vorhanden ist columns.
Nickil Maveli
Entschuldigung, es war ein Tippfehler im Code. Prädiktoren und Ergebnis sind zwei pandas DataFramemit Form m x nund m x 1. Es sollte jetzt klar sein.
GC5
2
Ich bin vor einiger Zeit auf die gleichen Erkenntnisse gestoßen. Dies kann daran liegen, dass eine Reihe von Merkmalen wichtig sind. Da jedoch Merkmale im Entscheidungsbaum hoch oder niedrig sein können (da bei der Aufteilung nur eine zufällige Teilmenge angeboten wird), ist ihre Bedeutung von Baum zu Baum sehr unterschiedlich Baum, was zu einer hohen Standardabweichung führt.
Archie
Toller Beitrag, ich bin auf ein identisches Problem gestoßen, wie Sie auf dem Bild sehen können. Es ist ein Paket, tsfreshdas ich relevante Merkmale identifiziert geholfen und schneide meine Funktionen von 600+ auf rund 400 ! [Meine Top-35 - Features ] ( i.stack.imgur.com/0MROZ.png ) mit diesem Selbst des Algorithmus eines guten Leistung für mich. Ich habe eine binäre Klassifikation, Erfolg / Misserfolg. Ich bekomme praktisch keine falschen Erfolge, aber ich vermisse einen beträchtlichen Prozentsatz des Erfolgs. Alle obigen Vermutungen scheinen vernünftig. Es könnte der Fall sein, dass ein größeres Trainings- und Test-Set erforderlich ist. Ich habe weniger
Superheld

Antworten:

3

Sie verwenden RandomForest mit der Standardanzahl von Bäumen (10). Für etwa 30 Features ist dies zu wenig. Daher ist die Standardabweichung groß. Versuchen Sie es mit mindestens 100 oder sogar 1000 Bäumen

clf = RandomForestClassifier(n_estimators=1000)

Für eine genauere Analyse können Sie auch überprüfen, wie stark die Korrelation zwischen Ihren Features ist.

Lanenok
quelle
Sorry lanenok, die Anzahl der Bäume ist nicht die Standardanzahl. Ich habe einen Beispielcode eingegeben (und dies gilt beispielsweise für alle Parameter min_samples_split), da ich die Daten, an denen ich arbeite, nicht offenlegen kann. Liegt es jedoch an der Anzahl der Bäume und anderen Parametern, oder mache ich hier einige Fehler?
GC5
2

Ihr Ergebnis ist nicht so seltsam. Wie Lanenok feststellt , sollten Sie in einem ersten Schritt die Anzahl der Bäume erhöhen, um sicherzustellen, dass Sie ein "statistisches" Ergebnis bezüglich der Wichtigkeit von Merkmalen erhalten.

Da dieses Papier von Genuer et al. (2010) zeigt, dass Sie die Standardabweichungen tatsächlich verwenden können, um Features zu eliminieren. Um es zu zitieren: " Wir können sehen, dass die Standardabweichung der wahren Variablen groß ist im Vergleich zu den verrauschten Variablen eins, die nahe bei Null liegen. "

Archie
quelle
Wenn Sie in diesem Beispiel die Standardabweichung verwenden, um Features zu entfernen, werden alle Features entfernt. xD
Jorge Leitao
Haha, ich bin nicht ganz sicher, ich denke, Sie könnten die Funktionen ganz rechts sicher verwerfen. Das Wichtigste, was ich versuche, ist, dass hohe Standardabweichungen nicht so seltsam sind und dass Sie sie tatsächlich in Ihrer Strategie verwenden können, um Features zu eliminieren.
Archie
1

Versuchen Sie es clf = RandomForestClassifier(max_features=None). Der max_featuresStandardwert für 'auto'den Parameter ist äquivalent zu sqrt(n_features). max_featureswird als "Die Anzahl der Features, die bei der Suche nach der besten Aufteilung berücksichtigt werden müssen" beschrieben. Wenn Sie nur eine kleine Anzahl von Merkmalen an einem Punkt im Entscheidungsbaum betrachten, kann die Wichtigkeit eines einzelnen Merkmals über viele Baume hinweg stark variieren. Schauen Sie sich also keine zufällige Teilmenge an, sondern alle Features auf allen Ebenen des Baums.

Jamis
quelle
1
Beachten Sie, dass dies den einfachen Sackbäumen entspricht. Der Begriff "zufällig" in zufälligen Gesamtstrukturen bedeutet, dass bei jeder Aufteilung in der Regel sqrt(n_features)oder eine zufällige Teilmenge von Features berücksichtigt wird log2(n_features). max_features=Noneberücksichtigt keine zufällige Teilmenge von Features mehr. Ich bin mir nicht sicher, ob dies die oben vorgeschlagene Lösung beeinflusst. Eine Möglichkeit ist, dass viele Merkmale einfach eine große Bedeutung haben und daher über das gesamte Baumensemble hinweg sehr unterschiedlich sind. Oder vielleicht gibt es nicht genug Samples und so wird nicht jedes Feature berücksichtigt, wenn Sie auf ein Blatt schlagen.
Jamis
1

Ein häufiger Grund dafür ist, dass die von Ihnen angegebenen (oder standardmäßig festgelegten) Parameter RandomForestClassifiernicht für Ihr Dataset geeignet sind.

Eine gebräuchliche Methode, um dieses Problem zu lösen, besteht darin, den Hyperparameterraum zu durchsuchen, indem Sie beispielsweise Folgendes verwenden GridSearchCV:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_grid Hier sind die Permutationen der Parameter, in denen Sie suchen möchten, und die make_scorer(accuracy_score) die Kennzahl, die Sie optimieren möchten.

Beachten Sie, dass dies accuracy_scorefür ausgeglichene Sets geeignet ist, jedoch nicht für unsymmetrische Sets. Wählen Sie eine geeignete Metrik für Ihr spezielles Ziel.

Jorge Leitao
quelle
0

Dafür kann es mehrere Gründe geben. Die Anzahl der Bäume und die Tiefe können Ihre Ergebnisse verändern. Wenn Ihr Modell nach der Auswahl der Parameter (Kreuzvalidierung usw.) keine gute Leistung erbringt, liegt dies wahrscheinlich daran, dass Ihre Features nicht sehr aussagekräftig sind und daher fast "zufällig" ausgewählt werden, was zu hohen Standardabweichungen von Baum zu Baum führt. Es gibt aber auch andere Möglichkeiten, z. B. kann es auch sein, dass Ihre Funktionen stark korrelieren. Ein bisschen mehr Information wäre hilfreich.

oW_
quelle