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).
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()
predictors
gibt ein zurück, aufnumpy array
das Siepandas Dataframe
durch seine Spalten verweisen. Dies ist falsch, danumpy arrays
das Attribut nicht vorhanden istcolumns
.pandas DataFrame
mit Formm x n
undm x 1
. Es sollte jetzt klar sein.tsfresh
das 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 wenigerAntworten:
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
Für eine genauere Analyse können Sie auch überprüfen, wie stark die Korrelation zwischen Ihren Features ist.
quelle
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?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. "
quelle
Versuchen Sie es
clf = RandomForestClassifier(max_features=None)
. Dermax_features
Standardwert für'auto'
den Parameter ist äquivalent zusqrt(n_features)
.max_features
wird 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.quelle
sqrt(n_features)
oder eine zufällige Teilmenge von Features berücksichtigt wirdlog2(n_features)
.max_features=None
berü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.Ein häufiger Grund dafür ist, dass die von Ihnen angegebenen (oder standardmäßig festgelegten) Parameter
RandomForestClassifier
nicht 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
:param_grid
Hier sind die Permutationen der Parameter, in denen Sie suchen möchten, und diemake_scorer(accuracy_score)
die Kennzahl, die Sie optimieren möchten.Beachten Sie, dass dies
accuracy_score
für ausgeglichene Sets geeignet ist, jedoch nicht für unsymmetrische Sets. Wählen Sie eine geeignete Metrik für Ihr spezielles Ziel.quelle
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.
quelle