Każdy otrzymał sugestie dotyczące biblioteki lub kodu dotyczące sposobu wykreślenia kilku przykładowych drzew z:
getTree(rfobj, k, labelVar=TRUE)
(Tak, wiem, że nie powinieneś tego robić operacyjnie, RF to czarna skrzynka itp. Itp. Chcę wizualnie sprawdzić poprawność drzewa, aby zobaczyć, czy jakieś zmienne zachowują się nieintuicyjnie, potrzebuję ulepszenia / połączenia / dyskretyzacji / transformacji, sprawdź jak dobrze działają moje zakodowane czynniki itp.)
Wcześniejsze pytania bez przyzwoitej odpowiedzi:
Tak naprawdę chcę wykreślić przykładowe drzewo . Więc już się ze mną nie sprzeczaj. Nie pytam o varImpPlot
(Zmienna ważność wykresu) lub partialPlot
lub MDSPlot
, lub te inne wykresy , już je mam, ale nie zastępują widoku przykładowego drzewa. Tak, mogę wizualnie sprawdzić wydajność getTree(...,labelVar=TRUE)
.
(Myślę, że plot.rf.tree()
wkład byłby bardzo dobrze przyjęty.)
cforest
(w pakiecie imprezowym ). W przeciwnym razie będziesz musiał przekonwertowaćdata.frame
zwrócony przezrandomForest::getTree
dotree
-Jak obiektu.Odpowiedzi:
Pierwsze (i najłatwiejsze) rozwiązanie: jeśli nie chcesz trzymać się klasycznego RF, jak zaimplementowano w Andy Liaw's
randomForest
, możesz wypróbować pakiet imprezowy , który zapewnia inną implementację oryginalnego algorytmu RF ™ (użycie drzew warunkowych i schematu agregacji na podstawie od średniej masy jednostek). Następnie, zgodnie z tym, co napisano w tym poście z pomocą R , możesz wykreślić jednego członka listy drzew. O ile mi wiadomo, wydaje się, że działa płynnie. Poniżej znajduje się wykres jednego drzewa wygenerowanego przezcforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
.Drugie (prawie tak łatwe) Rozwiązanie: Większość technik oparty na drzewie w R (
tree
,rpart
,TWIX
, itd.) Oferujetree
-Jak strukturę do druku / wykreślenie jednego drzewa. Ideą byłoby przekonwertowanie wynikurandomForest::getTree
na taki obiekt R, nawet jeśli jest to bezsensowne z statystycznego punktu widzenia. Zasadniczo łatwo jest uzyskać dostęp do struktury drzewa ztree
obiektu, jak pokazano poniżej. Należy pamiętać, że będzie się nieco różnić w zależności od rodzaju zadania - regresja vs. klasyfikacja - gdzie w późniejszym przypadku doda prawdopodobieństwa specyficzne dla klasy jako ostatnią kolumnęobj$frame
(która jest adata.frame
).Następnie istnieją metody ładnego drukowania i drukowania tych obiektów. Kluczowe funkcje to ogólna
tree:::plot.tree
metoda (stawiam potrójną,:
która pozwala zobaczyć kod w R bezpośrednio), polegając natree:::treepl
(wyświetlanie graficzne) itree:::treeco
(obliczanie współrzędnych węzłów). Funkcje te oczekująobj$frame
reprezentacji drzewa. Inne subtelne kwestie: (1) argumenttype = c("proportional", "uniform")
w domyślnej metodzie kreśleniatree:::plot.tree
, pomaga zarządzać odległością pionową między węzłami (proportional
oznacza, że jest proporcjonalna do odchylenia,uniform
oznacza, że jest ustalona); (2) musisz uzupełnićplot(tr)
wezwaniem, abytext(tr)
dodać etykiety tekstowe do węzłów i podziałów, co w tym przypadku oznacza, że będziesz musiał także rzucić okiemtree:::text.tree
.getTree
Metoda odrandomForest
zwrotów inna konstrukcja, która jest opisana w pomocy online. Typowe wyjście pokazano poniżej, z węzłami końcowymi oznaczonymistatus
kodem (-1). (Ponownie, dane wyjściowe będą się różnić w zależności od rodzaju zadania, ale tylko od kolumnstatus
iprediction
).Jeśli uda ci się przekształcić powyższą tabelę do jednego generowane przez
tree
, prawdopodobnie będzie w stanie dostosowaćtree:::treepl
,tree:::treeco
itree:::text.tree
do własnych potrzeb, choć nie mam przykład tego podejścia. W szczególności prawdopodobnie chcesz pozbyć się dewiacji, prawdopodobieństw klasowych itp., Które nie mają znaczenia w RF. Wszystko, czego potrzebujesz, to ustawić współrzędne węzłów i podzielić wartości. MożeszfixInNamespace()
do tego wykorzystać , ale szczerze mówiąc, nie jestem pewien, czy jest to właściwa droga.Trzecie (i na pewno sprytne) rozwiązanie: Napisz prawdziwą
as.tree
funkcję pomocnika, która złagodzi wszystkie powyższe „łaty”. Następnie możesz użyć metod kreślenia R lub, prawdopodobnie lepiej, Klimta (bezpośrednio z R), aby wyświetlić pojedyncze drzewa.źródło
Spóźniłem się cztery lata, ale jeśli naprawdę chcesz trzymać się
randomForest
pakietu (a istnieją ku temu dobre powody) i chcesz wizualizować drzewo, możesz użyć pakietu reprtree .Pakiet nie jest bardzo dobrze udokumentowany (możesz znaleźć tutaj dokumenty ), ale wszystko jest dość proste. Aby zainstalować pakiet, zapoznaj się z plikiem initialize.R w repozytorium, więc po prostu uruchom następujące polecenie:
Następnie wykonaj model i drzewo:
I proszę bardzo! Piękny i prosty.
Możesz sprawdzić repozytorium github, aby dowiedzieć się o innych metodach w pakiecie. W rzeczywistości, jeśli zaznaczysz plot.getTree.R , zauważysz, że autor używa własnej implementacji, z
as.tree()
której chl ♦ sugerował, że możesz zbudować siebie w swojej odpowiedzi. Oznacza to, że możesz to zrobić:A następnie potencjalnie użyj
realtree
z innymi pakietami drzewa, takimi jak drzewo .źródło
xgboost
.randomForest
paczki.plot.getTree()
pojedyncze drzewo. Funkcjaplot.reprtree()
w tym pakiecie drukuje reprezentatywne drzewo.reprtree:::plot.getTree(mod_rf_1$finalModel)
, jednak występuje „Błąd w data.frame (var = fr $ var, splits = as.character (gTree [,„ split point ”])): argumenty sugerują różne liczba rzędów: 2631, 0 "Stworzyłem kilka funkcji do wyodrębnienia reguł drzewa.
źródło