Cualquiera recibió sugerencias de biblioteca o código sobre cómo trazar un par de árboles de muestra de:
getTree(rfobj, k, labelVar=TRUE)
(Sí, sé que se supone que no debes hacer esto operacionalmente, RF es una caja negra, etc., etc.) Quiero verificar visualmente el estado de un árbol para ver si alguna variable se comporta de manera no intuitiva, necesito ajustes / combinaciones / discretización / transformación, verificar qué tan bien funcionan mis factores codificados, etc.)
Preguntas anteriores sin una respuesta decente:
De hecho, quiero trazar un árbol de muestra . Así que no discutas conmigo sobre eso, ya. No estoy preguntando sobre varImpPlot(Gráfico de importancia variable) o partialPloto MDSPlot, o estos otros gráficos , ya los tengo, pero no son un sustituto para ver un árbol de muestra. Sí, puedo inspeccionar visualmente la salida de getTree(...,labelVar=TRUE).
(Supongo que una plot.rf.tree()contribución sería muy bien recibida).

cforest(en el paquete de fiesta ). De lo contrario, tendrá que convertir eldata.framedevueltorandomForest::getTreeen untreeobjeto similar.Respuestas:
Primera (y más fácil) solución: si no está interesado en seguir con la RF clásica, como se implementó en Andy Liaw's
randomForest, puede probar el paquete de fiesta que proporciona una implementación diferente del algoritmo RF ™ original (uso de árboles condicionales y esquema de agregación basado en unidades de peso promedio). Luego, como se informó en esta publicación de R-help , puede trazar un solo miembro de la lista de árboles. Parece que funciona sin problemas, por lo que puedo decir. A continuación se muestra un diagrama de un árbol generado porcforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0)).En segundo lugar (casi tan fácil) Solución: La mayoría de las técnicas basadas en árboles en R (
tree,rpart,TWIX, etc.) ofrece unatreeestructura -como para la impresión / trazado un solo árbol. La idea sería convertir la salida derandomForest::getTreetal objeto R, incluso si no tiene sentido desde un punto de vista estadístico. Básicamente, es fácil acceder a la estructura de árbol desde untreeobjeto, como se muestra a continuación. Tenga en cuenta que diferirá ligeramente según el tipo de tarea (regresión frente a clasificación), donde en el último caso agregará probabilidades específicas de la clase como la última columna de laobj$frame(que es adata.frame).Luego, hay métodos para imprimir y trazar bonitos esos objetos. Las funciones clave son un
tree:::plot.treemétodo genérico (pongo un triple:que le permite ver el código en R directamente) confiando entree:::treepl(visualización gráfica) ytree:::treeco(calcular las coordenadas de los nodos). Estas funciones esperan laobj$framerepresentación del árbol. Otros problemas sutiles: (1) el argumentotype = c("proportional", "uniform")en el método de trazado predeterminadotree:::plot.tree, ayuda a gestionar la distancia vertical entre los nodos (proportionalsignifica que es proporcional a la desviación,uniformsignifica que es fijo); (2) debe complementarplot(tr)con una llamada atext(tr)para agregar etiquetas de texto a los nodos y divisiones, lo que en este caso significa que también tendrá que echar un vistazotree:::text.tree.El
getTreemétodo derandomForestdevuelve una estructura diferente, que se documenta en la ayuda en línea. A continuación se muestra una salida típica, con los nodos terminales indicados por elstatuscódigo (-1). (Nuevamente, la salida diferirá según el tipo de tarea, pero solo en las columnasstatusyprediction)Si usted puede manejar para convertir la tabla anterior a la generada por
tree, que probablemente no será capaz de personalizartree:::treepl,tree:::treecoytree:::text.treepara satisfacer sus necesidades, aunque no tengo un ejemplo de este enfoque. En particular, probablemente desee deshacerse del uso de desviaciones, probabilidades de clase, etc., que no son significativas en RF. Todo lo que desea es configurar coordenadas de nodos y valores divididos. Podrías usarfixInNamespace()eso, pero, para ser honesto, no estoy seguro de que este sea el camino correcto.Tercera (y ciertamente inteligente) solución: escriba una verdadera
as.treefunción auxiliar que alivie todos los "parches" anteriores. Entonces podría usar los métodos de trazado de R o, probablemente mejor, Klimt (directamente de R) para mostrar árboles individuales.fuente
Llego cuatro años tarde, pero si realmente quieres apegarte al
randomForestpaquete (y hay algunas buenas razones para hacerlo), y realmente quieres visualizar el árbol, puedes usar el paquete reprtree .El paquete no está muy bien documentado (puede encontrar los documentos aquí ), pero todo es bastante sencillo. Para instalar el paquete, consulte initialize.R en el repositorio, así que simplemente ejecute lo siguiente:
Luego adelante y haga su modelo y árbol:
Y ahi tienes! Hermoso y sencillo.
Puede consultar el repositorio de Github para conocer los otros métodos del paquete. De hecho, si marca plot.getTree.R , notará que el autor usa su propia implementación de la
as.tree()cual chl ♦ sugirió que podría construir su respuesta. Esto significa que puedes hacer esto:Y luego, potencialmente, utilícelo
realtreecon otros paquetes de trazado de árboles, como el árbol .fuente
xgboosttambién.randomForestpaquete.plot.getTree()traza un árbol individual. La funciónplot.reprtree()en ese paquete traza un árbol representativo.reprtree:::plot.getTree(mod_rf_1$finalModel), sin embargo, hay un "Error en data.frame (var = fr $ var, splits = as.character (gTree [," punto dividido "]): los argumentos implican diferencias número de filas: 2631, 0 "He creado algunas funciones para extraer las reglas de un árbol.
fuente