Mit scikit, um zu bestimmen, die Beiträge der einzelnen Features zu einer bestimmten Klasse Vorhersage
Ich bin mit einem scikit extra Bäume Klassifizierer:
model = ExtraTreesClassifier(n_estimators=10000, n_jobs=-1, random_state=0)
Einmal das Modell ist montiert und verwendet, um vorherzusagen, Klassen, würde ich mag, um herauszufinden, die Beiträge von jedem feature eine Klasse Vorhersage. Wie mache ich das in scikit lernen? Ist es möglich mit zusätzlichen Bäumen Klassifizierer oder muss ich mit einem anderen Modell?
- Aus Neugier, warum willst du den pandas-Bibliothek?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update
Mehr knowledgable über ML heute war als ich vor 2,5 Jahren werde ich nun sagen, dass dieser Ansatz funktioniert nur für sehr lineare Entscheidungsprobleme. Wenn Sie sorglos anwenden, um ein nicht-lineares problem, das Sie haben Schwierigkeiten.
Beispiel: Vorstellen, eine Funktion, für die weder sehr große noch sehr kleine Werte prognostizieren in einer Klasse, aber auch die Werte in gewissen zwischen-Intervall zu tun. Das könnte Wasseraufnahme voraussagen Austrocknung. Aber Wasser-Aufnahme vermutlich interagiert mit Salz Einnahme, wie Essen mehr Salz ermöglicht eine höhere Wasseraufnahme. Jetzt haben Sie eine Interaktion zwischen zwei nicht-lineare Funktionen. Die Entscheidung, die Grenze schlängelt sich rund um den feature-Raum zu modellieren, diese nicht-Linearität und nur Fragen, wie viel man von den Eigenschaften beeinflusst, die Gefahr der Austrocknung ist einfach unwissend. Es ist nicht die richtige Frage.
Alternative: eine weitere, sinnvolle, Frage, könnten Sie Fragen, ist: Wenn ich nicht über diese Informationen verfügen (wenn ich aus dieser Funktion) wie viel würde meine Vorhersage für ein bestimmtes label leiden? Um dies zu tun, die Sie einfach weglassen, ein feature, trainieren Sie ein Modell und schauen Sie, wie viel Präzision und recall Tropfen für jede Ihrer Klassen. Es noch informiert über Funktion, Bedeutung, aber es macht keine Annahmen über die Linearität.
Unten ist die alte Antwort.
Arbeitete ich über ein ähnliches problem eine Weile zurück und erzielte den gleiche Frage zur Cross-Validiert. Die kurze Antwort ist, dass es keine Umsetzung in
sklearn
dass nicht alles, was Sie wollen.Jedoch, was Sie versuchen, zu erreichen, ist wirklich ganz einfach und getan werden kann, durch Multiplikation der durchschnittlichen standardisierten Mittelwert der jeweiligen Funktion split für jede Klasse, mit der entsprechenden
model._feature_importances
array-element. Sie schreiben eine einfache Funktion, die standardisiert dataset, berechnet aus den Mittelwerten der einzelnen Funktion split über Klasse Vorhersagen, und tut element-Weise Multiplikation mit dermodel._feature_importances
array. Je größer die absolute resultierenden Werte sind, desto wichtiger Funktionen, um Ihre vorhergesagte Klasse, und noch besser, das Zeichen wird Ihnen sagen, wenn es kleine oder große Werte, die wichtig sind.Hier ein super einfache Umsetzung, das dauert ein datamatrix
X
eine Liste von VorhersagenY
und ein array von feature-Wichtigkeiten und gibt ein JSON-beschreiben die Bedeutung jeder Funktion zu jeder Klasse.Beispiel:
Ist die erste Ebene der Tasten in
result
sind Klasse-labels, und die zweite Ebene der Tasten-Spalte-Indizes, d.h. feature-Indizes. Daran erinnern, dass eine hohe absolute Werte entspricht der Bedeutung, und das Zeichen sagt Ihnen, ob es die kleine (möglicherweise negativ) oder große Werte, die wichtig sind.Dies ist geändert docs
Ich denke
feature_importances_
ist, was Sie suchen:BEARBEITEN
Vielleicht ich falsch verstanden, die erste Zeit (pre-Kopfgeld), sorry, dies kann mehr entlang der Linien von, was Sie suchen. Es ist ein python-Bibliothek namens
treeinterpreter
, produziert der Informationen, die ich denke, die Sie suchen. Sie müssen die grundlegendenDecisionTreeClassifer
(oder Regressor). Folgenden entlang von in diesem blog-post, Sie können diskret den Zugriff auf die Funktion Beiträge in der Vorhersage der einzelnen Instanzen:Werde ich nur Durchlaufen wird jede Probe in
X_test
zur Veranschaulichung dieser fast genau imitiert den blog-post über:Der ersten iteration der Schleife ergibt:
Interpretation dieser Ausgang, es scheint, als ob petal length und petal width waren die wichtigsten Mitwirkenden an der Vorhersage von der Dritten Klasse (für die erste Probe). Hoffe, das hilft.
Dem Papier
"Warum Sollte Ich Ihnen Vertrauen?": Erklären die Vorhersagen von Jedem Klassifizierer eingereicht wurde 9 Tage nach dieser Frage, bietet einen Algorithmus für die eine Allgemeine Lösung für dieses problem!!! 🙂
Kurz gesagt, es heißt KALK für die "lokale interpretierbaren Modell-agnostisch, Erläuterungen", und arbeitet durch den Einbau eines einfacheren, lokalen Modell um die Vorhersage(N), die Sie verstehen wollen.
Was mehr ist, Sie haben eine python-Implementierung (https://github.com/marcotcr/lime) mit ziemlich detaillierte Beispiele, wie man es mit sklearn. Zum Beispiel diese eine ist auf zwei-Klassen-random forest problem auf text-Daten, und diese eine ist auf die kontinuierliche und kategorielle Merkmale. Sie alle sind zu finden über die README-Datei auf github.
Die Autoren hatten ein sehr Produktives Jahr 2016 über diesem Bereich, so dass, wenn Sie, wie Sie die Zeitung Lesen, hier ist ein starter:
Bisher habe ich die Prüfung eli5 und treeinterpreter (beide wurden schon erwähnt) und ich denke eli5 werden die meisten hilfreich, denn ich denke die haben mehr Möglichkeiten und mehr generische und aktualisiert.
Dennoch nach einiger Zeit, die ich anwenden eli5 für einen bestimmten Fall und ich könnte nicht erhalten negative Beiträge für ExtraTreesClassifier recherchiert ein bisschen mehr, ich merkte, ich war die Beschaffung der Bedeutung oder Gewicht gesehen hier. Denn ich war mehr daran interessiert, so etwas wie Beitrag, wie bereits der Titel dieses Fragen, ich verstehe, dass einige feature könnte einen negativen Effekt haben, aber bei der Messung der Bedeutung der Zeichen ist nicht wichtig, so Eigenschaft, mit positiven Effekten und negativen zusammen.
Weil ich war sehr daran interessiert, das Schild habe ich wie folgt:
1) erhalten die Beiträge für alle Fälle
2) agreage alle Ergebnisse werden in der Lage zu unterscheiden, die gleichen.
Keine sehr elegante Lösung, wahrscheinlich gibt es etwas besseres gibt, poste ich es hier, falls es hilft.
Ich zu reproduzieren, dass vorherigen post.
Whith Ausgabe
Die bisherigen Ergebnisse der Arbeit mit einem Fall, den ich ausführen möchten alle, und erstellen Sie eine Durchschnittliche:
Dies ist, wie ein datrame mit den Ergebnissen sieht wie folgt aus:
Also ich erstelle eine Funktion zum kombinieren der vorherigen Art der Tische:
So, jetzt muss ich mich nur noch mit vorige Funktion mit allen Beispielen, die ich Wünsche. Ich werde die gesamte Bevölkerung nicht nur dem Trainings-set. Überprüfen Sie die Durchschnittliche Effekt in allen realen Fällen
Mit dem Ergebnis:
Las Tabelle zeigen die durchschnittlichen Effekte der einzelnen Funktionen für alle meine wirklichen Bevölkerung.
Companion-notebook in mein github.