Ich habe eine Klassifizierungsaufgabe mit einer Zeitreihe als Dateneingabe, wobei jedes Attribut (n = 23) einen bestimmten Zeitpunkt darstellt. Neben dem absoluten Klassifizierungsergebnis möchte ich herausfinden, welche Attribute / Daten in welchem Umfang zum Ergebnis beitragen. Deshalb benutze ich nur das feature_importances_
, was für mich gut funktioniert.
Ich würde jedoch gerne wissen, wie sie berechnet werden und welche Kennzahl / welcher Algorithmus verwendet wird. Leider konnte ich zu diesem Thema keine Dokumentation finden.
scikit-learn
random-forest
feature-selection
user2244670
quelle
quelle
Antworten:
Es gibt in der Tat mehrere Möglichkeiten, um "Wichtigkeiten" zu erhalten. Wie so oft gibt es keinen strengen Konsens darüber, was dieses Wort bedeutet.
Beim Scikit-Lernen implementieren wir die Wichtigkeit wie in [1] beschrieben (oft zitiert, aber leider selten gelesen ...). Es wird manchmal als "Gini-Wichtigkeit" oder "mittlere Abnahme der Verunreinigung" bezeichnet und ist definiert als die Gesamtabnahme der Knotenverunreinigung (gewichtet mit der Wahrscheinlichkeit, diesen Knoten zu erreichen (die durch den Anteil der Proben, die diesen Knoten erreichen, angenähert wird), gemittelt über alle Bäume des Ensembles.
In der Literatur oder in einigen anderen Paketen finden Sie auch Feature-Wichtigkeiten, die als "mittlere Abnahmegenauigkeit" implementiert sind. Grundsätzlich besteht die Idee darin, die Abnahme der Genauigkeit von OOB-Daten zu messen, wenn Sie die Werte für diese Funktion zufällig permutieren. Wenn die Abnahme gering ist, ist die Funktion nicht wichtig und umgekehrt.
(Beachten Sie, dass beide Algorithmen im randomForest R-Paket verfügbar sind.)
[1]: Breiman, Friedman, "Classification and Regression Tree", 1984.
quelle
tree_.compute_feature_importances(normalize=False)
.Die übliche Methode zum Berechnen der Merkmalswichtigkeitswerte eines einzelnen Baums lautet wie folgt:
Sie initialisieren ein Array
feature_importances
aller Nullen mit Größen_features
.Sie durchlaufen den Baum: Für jeden internen Knoten, der sich nach einem Feature
i
aufteilt, berechnen Sie die Fehlerreduzierung dieses Knotens multipliziert mit der Anzahl der Stichproben, die an den Knoten weitergeleitet wurden, und addieren diese Menge zufeature_importances[i]
.Die Fehlerreduzierung hängt von dem von Ihnen verwendeten Verunreinigungskriterium ab (z. B. Gini, Entropy, MSE, ...). Es ist die Verunreinigung der Reihe von Beispielen, die an den internen Knoten weitergeleitet wird, abzüglich der Summe der Verunreinigungen der beiden durch die Aufteilung erzeugten Partitionen.
Es ist wichtig, dass diese Werte relativ zu einem bestimmten Datensatz sind (sowohl die Fehlerreduzierung als auch die Anzahl der Stichproben sind datensatzspezifisch), daher können diese Werte nicht zwischen verschiedenen Datensätzen verglichen werden.
Soweit ich weiß, gibt es alternative Möglichkeiten, um Merkmalsbedeutungswerte in Entscheidungsbäumen zu berechnen. Eine kurze Beschreibung der obigen Methode findet sich in "Elements of Statistical Learning" von Trevor Hastie, Robert Tibshirani und Jerome Friedman.
quelle
Dies ist das Verhältnis zwischen der Anzahl der Stichproben, die an einen Entscheidungsknoten weitergeleitet werden, an dem dieses Merkmal in einem der Bäume des Ensembles beteiligt ist, und der Gesamtzahl der Stichproben im Trainingssatz.
Merkmale, die an den Knoten der obersten Ebene der Entscheidungsbäume beteiligt sind, sehen tendenziell mehr Stichproben und haben daher wahrscheinlich eine größere Bedeutung.
Bearbeiten : Diese Beschreibung ist nur teilweise richtig: Gilles und Peters Antworten sind die richtige Antwort.
quelle
Wie @ GillesLouppe oben ausgeführt hat, implementiert scikit-learn derzeit die Metrik "mittlere Abnahme der Verunreinigung" für Feature-Wichtigkeiten. Ich persönlich finde die zweite Metrik etwas interessanter, bei der Sie die Werte für jedes Ihrer Features nach dem Zufallsprinzip einzeln permutieren und sehen, wie viel schlechter Ihre Out-of-Bag-Leistung ist.
Da Sie mit der Wichtigkeit von Merkmalen danach streben, wie viel jedes Merkmal zur Vorhersageleistung Ihres Gesamtmodells beiträgt, gibt Ihnen die zweite Metrik tatsächlich ein direktes Maß dafür, während die "mittlere Abnahme der Verunreinigung" nur ein guter Indikator ist.
Wenn Sie interessiert sind, habe ich ein kleines Paket geschrieben, das die Permutations-Wichtigkeitsmetrik implementiert und zur Berechnung der Werte aus einer Instanz einer zufälligen Waldklasse mit Scikit-Lernfunktion verwendet werden kann:
https://github.com/pjh2011/rf_perm_feat_import
Bearbeiten: Dies funktioniert für Python 2.7, nicht für 3
quelle
Lassen Sie mich versuchen, die Frage zu beantworten. Code:
Decision_Tree-Plot: Geben Sie
hier die Bildbeschreibung ein.
Wir können compute_feature_importance erhalten: [0. , 0.01333333,0.06405596,0.92261071]
Überprüfen Sie den Quellcode:
Versuchen Sie, die Funktionsbedeutung zu berechnen:
Wir erhalten feature_importance: np.array ([0,1.332,6.418,92.30]).
Nach der Normalisierung können wir ein Array erhalten ([0., 0.01331334, 0.06414793, 0.92253873]), dies ist dasselbe wie
clf.feature_importances_
.Seien Sie vorsichtig, alle Klassen sollten Gewicht eins haben.
quelle
Für diejenigen, die einen Verweis auf die Dokumentation von scikit-learn zu diesem Thema oder einen Verweis auf die Antwort von @GillesLouppe suchen:
In RandomForestClassifier ist das
estimators_
Attribut eine Liste von DecisionTreeClassifier (wie in der Dokumentation erwähnt ). Um diefeature_importances_
für den RandomForestClassifier im Quellcode von scikit-learn zu berechnen , werden allefeature_importances_
Attribute des Schätzers (alle DecisionTreeClassifer) im Ensemble gemittelt .In der Dokumentation von DecisionTreeClassifer wird erwähnt, dass "die Wichtigkeit eines Merkmals als (normalisierte) Gesamtverringerung des durch dieses Merkmal hervorgerufenen Kriteriums berechnet wird. Es wird auch als Gini-Wichtigkeit bezeichnet [1]."
Hier ist ein direkter Link für weitere Informationen zur Variablen- und Gini-Wichtigkeit, wie in der folgenden Referenz von scikit-learn angegeben.
[1] L. Breiman und A. Cutler, "Random Forests", http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
quelle