¿La mejor manera de presentar un bosque aleatorio en una publicación?

75

Estoy usando el algoritmo de bosque aleatorio como un clasificador robusto de dos grupos en un estudio de microarrays con miles de características.

  • ¿Cuál es la mejor manera de presentar el bosque aleatorio para que haya suficiente información para que sea reproducible en un documento?
  • ¿Existe un método de trazado en R para trazar realmente el árbol, si hay una pequeña cantidad de características?
  • ¿Es la estimación OOB de la tasa de error la mejor estadística para citar?
danielsbrewer
fuente
2
No hay un solo árbol ... Pero vea la respuesta de @ Shane para trazar uno de ellos con fines ilustrativos.
chl
Ciertamente vale la pena considerar randomForest :: partialPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling
1
puedes probar mi paquete de visualización de bosque aleatorio, forestFloor - forestfloor.dk
Soren Havelund Welling el

Respuestas:

48

Con respecto a hacerlo reproducible, la mejor manera es proporcionar una investigación reproducible (es decir, código y datos) junto con el documento. Póngalo a disposición en su sitio web o en un sitio de alojamiento (como github).

Con respecto a la visualización, Leo Breiman ha hecho un trabajo interesante al respecto (consulte su página de inicio , en particular la sección de gráficos ).

Pero si está utilizando R, entonces el randomForestpaquete tiene algunas funciones útiles:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

Y

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

No conozco una forma simple de trazar un árbol, pero puede usar la getTreefunción para recuperar el árbol y trazarlo por separado.

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

La presentación de Strobl / Zeileis sobre "Por qué y cómo usar medidas aleatorias de importancia variable del bosque (y cómo no debería)" tiene ejemplos de árboles que deben haberse producido de esta manera. Esta publicación de blog sobre modelos de árbol tiene algunos buenos ejemplos de diagramas de árbol CART que puede usar, por ejemplo.

Como comentó @chl, un solo árbol no es especialmente significativo en este contexto, por lo que, a menos que lo use para explicar qué es un bosque aleatorio, no lo incluiría en un documento.

Shane
fuente
44
Pequeña extensión sobre las parcelas: plot.randomForestmuestra cómo el error OOB y el error OOB en clase evolucionaron con un número creciente de árboles; varImpPlotmuestra las medidas de importancia de los atributos principales y MDSplottodos los objetos trazados en la proyección 2D de la medida de proximidad de objetos RF.
+1 para citar la MDSplot()función. Debo admitir que a menudo uso RF como una forma de resaltar grupos de individuos (en función de la medida de proximidad de RF) en lugar de seleccionar las mejores características. Los médicos a menudo leen mucho más fácilmente tales diagramas que el diagrama de puntos de la var. importancia ...
CHL
18
  1. Como Shane escribió; hacer que la investigación reproducible + incluya semillas aleatorias, porque la RF es estocástica.
  2. En primer lugar, trazar árboles individuales que forman RF no tiene sentido; Este es un clasificador de conjunto, tiene sentido solo como un todo. Pero incluso trazar todo el bosque no tiene sentido: es un clasificador de caja negra, por lo que no está destinado a explicar los datos con su estructura, sino a replicar el proceso original. En cambio, haga algunas de las tramas que sugirió Shane.
  3. En la práctica, OOB es una muy buena aproximación de error; Sin embargo, este no es un hecho ampliamente aceptado, por lo que para la publicación es mejor también hacer un CV para confirmarlo.

fuente
Entonces, @mbq al hacer un CV es válido hacer primero un bosque aleatorio con todas las muestras seleccionadas; haciéndolo dos veces una vez con todas y en segundo lugar con las 10 principales variables (que se pueden citar en un documento). Luego, ¿realiza una validación cruzada de omisión (seleccionando los 10 genes principales en cada intento) y cita el error de CV a partir de eso?
danielsbrewer
1
@danielsbrewer Haría esto de alguna otra manera (prestando más atención a la selección de funciones), pero esto es correcto; Sin embargo, se trata más del tema de la evaluación comparativa de la selección de funciones de RF que de seleccionar los mejores marcadores para su problema biológico.
2
El problema principal es que es realmente difícil comparar dos modelos (modelo = método de aprendizaje + método de selección de funciones), pero por simplicidad, puede asumir algo (como usaré RF y seleccionaré los 10 atributos principales) y admitir que usted sabe que esto puede ser subóptimo, pero usted está de acuerdo con eso mientras, por ejemplo, está satisfecho con la precisión. En ese caso, su único problema es eliminar el sesgo de la selección de atributos. por confirmar
2
Entonces, haría un simple embolsado: crea 10 (o 30 si tienes una buena computadora) submuestras de objetos al azar (digamos escogiendo al azar con reemplazo), entrena RF en cada uno, obtén su importancia y devuelve un rango de cada uno atributo promediado sobre todas las repeticiones (el mejor atributo obtiene el rango 1, el segundo mejor 2 y así sucesivamente; se puede promediar para que el atributo que fue 12 veces primero y 18 veces segundo tenga un rango de 1.6), finalmente seleccione 10 con los mejores rangos y llámelos sus marcadores Luego use un CV (LOO, muestreo de 10 veces o preferiblemente aleatorio) para obtener una aproximación de error de RF usando sus marcadores. por confirmar
2
Informe los rangos (con suerte, deberían estar bastante cerca de 1,2,3 ...), el error CV con su desviación (solo cuente la desviación estándar de los resultados de cada ronda CV) y el error OOB (probablemente será idéntico al error CV). DESCARGO DE RESPONSABILIDAD: Este no es un método para seleccionar el número óptimo de atributos: necesita RFE y CV anidado para hacerlo. DESCARGO DE RESPONSABILIDAD2: No he trabajado con esos datos, por lo que no garantizo que sus árbitros estén contentos con ellos (aunque creo que deberían hacerlo).
13

Tenga en cuenta las advertencias en las otras respuestas sobre que la trama necesariamente tiene sentido. Pero si desea una trama con fines ilustrativos / pedagógicos, el siguiente fragmento de R podría ser útil. No es difícil agregar "punto de división" al texto del borde si lo necesita.

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))
Patrick Caldon
fuente
1
El código produce un muy buen diagrama de árbol. Pero los valores no se muestran. Probablemente, se debe agregar una función text () después de la última declaración (plot).
rnso