Jeder hat Bibliotheks- oder Codevorschläge, wie man tatsächlich ein paar Beispielbäume plottet :
getTree(rfobj, k, labelVar=TRUE)
(Ja, ich weiß, Sie sollten dies nicht operativ tun, RF ist eine Blackbox usw. usw. Ich möchte einen Baum visuell auf Fehler überprüfen, um festzustellen, ob sich Variablen nicht intuitiv verhalten Wie gut funktionieren meine kodierten Faktoren usw.)
Vorherige Fragen ohne angemessene Antwort:
Eigentlich möchte ich einen Beispielbaum zeichnen . Also streiten Sie sich schon jetzt nicht mit mir darüber. Ich frage nicht nach varImpPlot
(Variable Wichtigkeit Plot) oder partialPlot
oder MDSPlot
oder diesen anderen Plots , ich habe diese bereits, aber sie sind kein Ersatz für das Anzeigen eines Beispielbaums. Ja, ich kann die Ausgabe von visuell überprüfen getTree(...,labelVar=TRUE)
.
(Ich denke, ein plot.rf.tree()
Beitrag würde sehr gut angenommen werden.)
cforest
(im Party- Paket) gebaut wurde. Andernfalls müssen Sie das vondata.frame
zurückgegebene ObjektrandomForest::getTree
in eintree
ähnliches Objekt konvertieren .Antworten:
Erste (und einfachste) Lösung: Wenn Sie sich nicht an die klassische RF halten möchten, wie sie in Andy Liaw implementiert ist
randomForest
, können Sie das Party- Paket ausprobieren , das eine andere Implementierung des ursprünglichen RF ™ -Algorithmus bietet (Verwendung von bedingten Bäumen und Aggregationsschema basierend) nach Gewichtseinheiten (Durchschnittsgewicht). Dann können Sie, wie in diesem R-Hilfe-Beitrag berichtet , ein einzelnes Mitglied der Baumliste zeichnen. Es scheint reibungslos zu laufen, soweit ich das beurteilen kann. Unten sehen Sie eine grafische Darstellung eines Baumes, der von erstellt wurdecforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
.Zweitens (fast so einfach) Lösung: Die meisten Baum-basierte Techniken in R (
tree
,rpart
,TWIX
, etc.) bietet einetree
-ähnlichen Struktur für den Druck / einen einzigen Baum Plotten. Die Idee wäre, die Ausgabe vonrandomForest::getTree
in ein solches R-Objekt umzuwandeln , auch wenn es statistisch unsinnig ist. Grundsätzlich ist es einfach, von einemtree
Objekt aus auf die Baumstruktur zuzugreifen , wie unten gezeigt. Bitte beachten Sie, dass es je nach Aufgabentyp - Regression oder Klassifizierung - geringfügige Unterschiede gibt. Im späteren Fall werden klassenspezifische Wahrscheinlichkeiten als letzte Spalte vonobj$frame
(das ist adata.frame
) hinzugefügt .Dann gibt es Methoden zum hübschen Drucken und Plotten dieser Objekte. Die Schlüsselfunktionen sind eine allgemeine
tree:::plot.tree
Methode (ich habe ein Triple angegeben:
, mit der Sie den Code in R direkttree:::treepl
anzeigen können), die sich auf (grafische Anzeige) undtree:::treeco
(Berechnung der Knotenkoordinaten ) stützt . Diese Funktionen erwarten dieobj$frame
Darstellung des Baumes. Andere subtile Probleme: (1) Das Argumenttype = c("proportional", "uniform")
in der Standardplotmethodetree:::plot.tree
hilft, den vertikalen Abstand zwischen Knoten zu verwalten (proportional
bedeutet, dass es proportional zur Abweichung ist, dh,uniform
es ist fest). (2) Sie müssenplot(tr)
durch einen Aufruf zumtext(tr)
Hinzufügen von Textbezeichnungen zu Knoten und Teilungen ergänzen, was in diesem Fall bedeutet, dass Sie auch einen Blick darauf werfen müssentree:::text.tree
.Die
getTree
Methode fromrandomForest
gibt eine andere Struktur zurück, die in der Online-Hilfe dokumentiert ist. Unten ist eine typische Ausgabe dargestellt, bei der die Endknoten durch denstatus
Code (-1) gekennzeichnet sind. (Die Ausgabe unterscheidet sich wiederum je nach Aufgabentyp, jedoch nur nach den Spaltenstatus
undprediction
.)Wenn Sie es schaffen, die obige Tabelle zu dem konvertieren , erzeugt durch
tree
, werden Sie wahrscheinlich in der Lage sein , zu gestaltentree:::treepl
,tree:::treeco
und antree:::text.tree
Ihren Bedürfnissen anpassen, obwohl ich kein Beispiel für diesen Ansatz hat. Insbesondere möchten Sie wahrscheinlich die Verwendung von Abweichungen, Klassenwahrscheinlichkeiten usw. vermeiden, die in RF nicht von Bedeutung sind. Sie möchten lediglich Knotenkoordinaten einrichten und Werte teilen. Sie könnten das gebrauchenfixInNamespace()
, aber um ehrlich zu sein, bin ich mir nicht sicher, ob dies der richtige Weg ist.Dritte (und sicherlich clevere) Lösung: Schreiben Sie eine echte
as.tree
Hilfsfunktion, die alle oben genannten "Patches" lindert. Sie könnten dann die Plotmethoden von R verwenden oder, wahrscheinlich besser, Klimt (direkt von R), um einzelne Bäume anzuzeigen.quelle
Ich bin vier Jahre zu spät, aber wenn Sie sich wirklich an das
randomForest
Paket halten möchten (und es gibt einige gute Gründe dafür) und den Baum tatsächlich visualisieren möchten, können Sie das reprtree- Paket verwenden.Das Paket ist nicht sehr gut dokumentiert (die Dokumente finden Sie hier ), aber alles ist ziemlich einfach. Um das Paket zu installieren, beziehen Sie sich auf initialize.R im Repository. Führen Sie einfach Folgendes aus:
Dann machen Sie Ihr Modell und Ihren Baum:
Und los geht's! Schön und einfach.
Sie können das Github-Repo überprüfen, um mehr über die anderen Methoden im Paket zu erfahren. In der Tat, wenn Sie plot.getTree.R überprüfen , werden Sie feststellen, dass der Autor seine eigene Implementierung verwendet, von
as.tree()
der chl ♦ vorschlug, dass Sie sich selbst in seine Antwort einbauen könnten. Dies bedeutet, dass Sie dies tun können:Und dann möglicherweise
realtree
mit anderen Tree-Plotting-Paketen wie tree verwenden .quelle
xgboost
.randomForest
Paket festhalten .plot.getTree()
zeichnet einen einzelnen Baum. Die Funktionplot.reprtree()
in diesem Paket zeichnet einen repräsentativen Baum.reprtree:::plot.getTree(mod_rf_1$finalModel)
gibt jedoch einen "Fehler in data.frame" (var = fr $ var, splits = as.character (gTree [, "split point"]) Anzahl der Zeilen: 2631, 0 "Ich habe einige Funktionen erstellt, um die Regeln eines Baums zu extrahieren.
quelle