Tout le monde a des suggestions de code ou de bibliothèque sur la manière de tracer réellement quelques échantillons d’arbres de:
getTree(rfobj, k, labelVar=TRUE)
(Oui, je sais que vous n’êtes pas censé le faire de manière opérationnelle, RF est une boîte noire, etc., etc. comment bien mes facteurs encodés fonctionnent, etc.)
Questions précédentes sans réponse décente:
Obtenir également des connaissances à partir d'une forêt aléatoire
Je veux en fait tracer un arbre de l'échantillon . Alors ne discutez pas avec moi à ce sujet, déjà. Je ne demande pas au sujet varImpPlot
(importance variable Plot) ou partialPlot
ou MDSPlot
ou ces parcelles , j'ai déjà ceux -ci , mais ils ne sont pas un substitut à voir un arbre échantillon. Oui, je peux inspecter visuellement la sortie de getTree(...,labelVar=TRUE)
.
(Je suppose qu'une plot.rf.tree()
contribution serait très bien reçue.)
cforest
(dans le paquet du parti ). Sinon, vous devrez convertir l'objetdata.frame
renvoyé parrandomForest::getTree
en untree
objet de type.Réponses:
Première solution (et la plus simple): si vous ne souhaitez pas vous en tenir à la RF classique, telle qu'implémentée dans Andy Liaw
randomForest
, vous pouvez essayer le paquet party qui fournit une implémentation différente de l' algorithme RF ™ original (utilisation d'arbres conditionnels et de schémas d'agrégation). sur le poids moyen des unités). Ensuite, comme indiqué dans cette publication R-help , vous pouvez tracer un seul membre de la liste des arbres. Il semble que tout se passe bien, pour autant que je sache. Ci-dessous, un graphique d’un arbre généré parcforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
.Deuxième (presque aussi facile) solution: La plupart des techniques à base d' arbres dans R (
tree
,rpart
,TWIX
, etc.) offre unetree
structure de -comme pour l' impression / traçage d' un seul arbre. L'idée serait de convertir la sortie derandomForest::getTree
en un tel objet R, même si cela n'a aucun sens d'un point de vue statistique. En gros, il est facile d’accéder à l’arborescence à partir d’untree
objet, comme indiqué ci-dessous. Veuillez noter que cela diffère légèrement en fonction du type de tâche (régression ou classification). Dans ce dernier cas, les probabilités spécifiques à la classe seront ajoutées à la dernière colonne deobj$frame
(qui est adata.frame
).Ensuite, il existe des méthodes permettant d’imprimer et de tracer ces objets. Les fonctions de touche sont une
tree:::plot.tree
méthode générique (je mets un triple:
qui permet de visualiser directement le code en R) en s'appuyant surtree:::treepl
(affichage graphique) ettree:::treeco
(calculer les coordonnées des nœuds). Ces fonctions attendent laobj$frame
représentation de l'arbre. Autres problèmes subtils: (1) l’argumenttype = c("proportional", "uniform")
dans la méthode de tracé par défauttree:::plot.tree
, aide à gérer la distance verticale entre les nœuds (proportional
signifie qu’il est proportionnel à la déviance,uniform
qu’il est fixe); (2) vous devez compléterplot(tr)
par un appel àtext(tr)
pour ajouter des étiquettes de texte aux noeuds et aux divisions, ce qui signifie dans ce cas que vous devrez également jeter un coup d'œiltree:::text.tree
.La
getTree
méthode derandomForest
renvoie une structure différente, documentée dans l'aide en ligne. Une sortie typique est illustrée ci-dessous, avec les nœuds terminaux indiqués par lestatus
code (-1). (Là encore, le résultat sera différent selon le type de tâche, mais uniquement sur les colonnesstatus
etprediction
.)Si vous parvenez à convertir le tableau ci-dessus en celui généré par
tree
, vous pourrez probablement le personnalisertree:::treepl
,tree:::treeco
ettree:::text.tree
pour l'adapter à vos besoins, bien que je ne possède pas d'exemple de cette approche. En particulier, vous voudrez probablement vous débarrasser de l'utilisation de la déviance, des probabilités de classe, etc., qui n'ont pas de sens dans RF. Tout ce que vous voulez, c'est définir les coordonnées des nœuds et les valeurs fractionnées. Vous pourriez utiliserfixInNamespace()
pour cela, mais, pour être honnête, je ne suis pas sûr que ce soit la bonne façon de faire.Troisième solution (et certainement astucieuse): écrivez une vraie
as.tree
fonction d’assistance qui atténuera tous les "correctifs" ci-dessus. Vous pouvez ensuite utiliser les méthodes de traçage de R ou, probablement mieux, Klimt (directement à partir de R) pour afficher des arbres individuels.la source
J'ai quatre ans de retard, mais si vous voulez vraiment vous en tenir au
randomForest
paquet (et il y a de bonnes raisons de le faire) et si vous voulez réellement visualiser l'arbre, vous pouvez utiliser le paquet de reproches .Le paquet n'est pas très bien documenté (vous pouvez trouver la documentation ici ), mais tout est assez simple. Pour installer le package, reportez-vous à initialize.R dans le référentiel, exécutez simplement les éléments suivants:
Alors allez-y et faites votre modèle et votre arbre:
Et voilà! Beau et simple.
Vous pouvez consulter le dépôt github pour en savoir plus sur les autres méthodes du package. En fait, si vous vérifiez sur plot.getTree.R , vous remarquerez que l'auteur utilise sa propre implémentation
as.tree()
dont chl ♦ suggère de vous construire vous-même dans sa réponse. Cela signifie que vous pourriez faire ceci:Et puis potentiellement utiliser
realtree
avec d'autres paquets de traçage d'arbres tels que tree .la source
xgboost
aussi.randomForest
paquet.plot.getTree()
trace un arbre individuel. La fonctionplot.reprtree()
dans ce package trace un arbre représentatif.reprtree:::plot.getTree(mod_rf_1$finalModel)
, cependant, il y a une "erreur dans data.frame (var = fr $ var, splits = as.character (gTree [," point de partage "]),: les arguments impliquent différant. nombre de rangées: 2631, 0 "J'ai créé des fonctions pour extraire les règles d'un arbre.
la source