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 partialPlot
o 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.frame
devueltorandomForest::getTree
en untree
objeto 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 unatree
estructura -como para la impresión / trazado un solo árbol. La idea sería convertir la salida derandomForest::getTree
tal 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 untree
objeto, 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.tree
mé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$frame
representació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 (proportional
significa que es proporcional a la desviación,uniform
significa 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
getTree
método derandomForest
devuelve 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 elstatus
código (-1). (Nuevamente, la salida diferirá según el tipo de tarea, pero solo en las columnasstatus
yprediction
)Si usted puede manejar para convertir la tabla anterior a la generada por
tree
, que probablemente no será capaz de personalizartree:::treepl
,tree:::treeco
ytree:::text.tree
para 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.tree
funció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
randomForest
paquete (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
realtree
con otros paquetes de trazado de árboles, como el árbol .fuente
xgboost
también.randomForest
paquete.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