141 votos

La obtención de conocimiento a partir de un bosque aleatorio

Bosques aleatorios se consideran las cajas negras, pero hace poco estuve pensando en lo que el conocimiento puede ser obtenido a partir de un bosque aleatorio?

La cosa más obvia es la importancia de las variables, en la variante más simple que puede ser realizado mediante el cálculo del número de apariciones de una variable.
La segunda cosa que estuve pensando acerca de las interacciones. Yo creo que si el número de árboles es lo suficientemente grande, el número de ocurrencias de los pares de variables puede ser probado (algo así como el chi cuadrado de independencia). La tercera cosa es la falta de linealidad de las variables. Mi primera idea fue la de simplemente mirar un gráfico de una variable Vs puntuación, pero todavía no estoy seguro si esto tiene algún sentido.

Estas cosas son, probablemente, bien estudiado (sólo una intuición). Agradecería si alguien me podría señalar cómo examinar esas cosas correctamente.

Añadido 23.01.2012
La motivación

Quiero utilizar este conocimiento para mejorar un modelo logit. Creo (o al menos eso espero) que es posible encontrar interacciones y las no linealidades que se pasaron por alto.

131voto

Boris Tsirelson Puntos 191

Bosques aleatorios son apenas una caja negra. Están basados en árboles de decisión, que son muy fáciles de interpretar:

#Setup a binary classification problem
require(randomForest)
data(iris)
set.seed(1)
dat <- iris
dat$Species <- factor(ifelse(dat$Species=='virginica','virginica','other'))
trainrows <- runif(nrow(dat)) > 0.3
train <- dat[trainrows,]
test <- dat[!trainrows,]

#Build a decision tree
require(rpart)
model.rpart <- rpart(Species~., train)

Esto se traduce en un simple árbol de decisión:

> model.rpart
n= 111 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 111 35 other (0.68468468 0.31531532)  
  2) Petal.Length< 4.95 77  3 other (0.96103896 0.03896104) *
  3) Petal.Length>=4.95 34  2 virginica (0.05882353 0.94117647) *

Si Pétalo.Longitud < 4.95, este árbol clasifica a la observación como "otros". Si es mayor que 4.95, clasifica a la observación como "virginica." Un bosque aleatorio simple es una colección de muchos árboles, donde cada uno está entrenado en un subconjunto aleatorio de los datos. Cada árbol, a continuación, "votos" en la clasificación final de cada observación.

model.rf <- randomForest(Species~., train, ntree=25, proximity=TRUE, importance=TRUE, nodesize=5)
> getTree(model.rf, k=1, labelVar=TRUE)
  left daughter right daughter    split var split point status prediction
1             2              3  Petal.Width        1.70      1       <NA>
2             4              5 Petal.Length        4.95      1       <NA>
3             6              7 Petal.Length        4.95      1       <NA>
4             0              0         <NA>        0.00     -1      other
5             0              0         <NA>        0.00     -1  virginica
6             0              0         <NA>        0.00     -1      other
7             0              0         <NA>        0.00     -1  virginica

Usted puede incluso tirar de árboles individuales de la rf, y un vistazo a su estructura. El formato es ligeramente diferente a la de rpart modelos, pero usted podría inspeccionar cada árbol, si usted quería y ver cómo es el modelado de los datos.

Además, ningún modelo es realmente una caja negra, porque puede examinar las respuestas de la predicción vs real las respuestas de cada variable en el conjunto de datos. Esta es una buena idea, independientemente de qué tipo de modelo que se está construyendo:

library(ggplot2)
pSpecies <- predict(model.rf,test,'vote')[,2]
plotData <- lapply(names(test[,1:4]), function(x){
  out <- data.frame(
    var = x,
    type = c(rep('Actual',nrow(test)),rep('Predicted',nrow(test))),
    value = c(test[,x],test[,x]),
    species = c(as.numeric(test$Species)-1,pSpecies)
    )
  out$value <- out$value-min(out$value) #Normalize to [0,1]
  out$value <- out$value/max(out$value)
  out
})
plotData <- do.call(rbind,plotData)
qplot(value, species, data=plotData, facets = type ~ var, geom='smooth', span = 0.5)

plot

He normalizado de las variables (sépalos y pétalos de longitud y anchura) para un rango 0-1. La respuesta también es de 0 a 1, donde 0 es el otro y 1 es virginica. Como se puede ver el bosque aleatorio es un buen modelo, incluso en el conjunto de prueba.

Además, un bosque aleatorio calculará diversos medida de importancia variable, que puede ser muy informativo:

> importance(model.rf, type=1)
             MeanDecreaseAccuracy
Sepal.Length           0.28567162
Sepal.Width           -0.08584199
Petal.Length           0.64705819
Petal.Width            0.58176828

Esta tabla representa la eliminación de cada variable, se reduce la precisión del modelo. Por último, hay muchas otras parcelas usted puede hacer de un bosque aleatorio del modelo, para ver lo que está pasando en la caja negra:

plot(model.rf)
plot(margin(model.rf)) 
MDSplot(model.rf, iris$Species, k=5)
plot(outlier(model.rf), type="h", col=c("red", "green", "blue")[as.numeric(dat$Species)])

Usted puede ver los archivos de ayuda para cada una de estas funciones para obtener una mejor idea de lo que muestran.

26voto

Psycho Bob Puntos 661

Para complementar estas bellas respuestas, me gustaría mencionar el uso de gradiente impulsado árboles (por ejemplo, el GBM Paquete en R). En R, prefiero este al azar a los bosques, ya que los valores perdidos se permite en comparación a randomForest donde la imputación es necesario. De importancia Variable y parcial de las parcelas están disponibles (como en randomForest) para la ayuda en la selección de características y una transformación no lineal de exploración en el modelo logit. Además, la variable de interacción se dirige con Friedman-H de estadística (interact.gbm) con referencia dado como J.H. Friedman and B.E. Popescu (2005). "Predictive Learning via Rule Ensembles." Section 8.1. Una versión comercial llamada TreeNet está disponible a partir de Salford y Sistemas de esta presentación en video habla de su visión de la variable de interacción estimación de Vídeo.

15voto

Even Mien Puntos 10122

Tardanza en responderte, pero me encontré con un reciente paquete de R forestFloor (2015) que le ayuda a hacer esto "unblackboxing" la tarea de una forma automatizada. Se ve muy prometedor!

library(forestFloor)
library(randomForest)
#simulate data
obs=1000
vars = 18
X = data.frame(replicate(vars,rnorm(obs)))
Y = with(X, X1^2 + sin(X2*pi) + 2 * X3 * X4 + 1 * rnorm(obs))
#grow a forest, remeber to include inbag
rfo=randomForest(X,Y,keep.inbag = TRUE,sampsize=250,ntree=50)
#compute topology
ff = forestFloor(rfo,X)
ggPlotForestFloor(ff,1:9)

Produce los siguientes parcelas:

enter image description here

También proporciona la visualización tridimensional si usted está buscando para las interacciones.

10voto

Stephen Milborrow Puntos 121

Como se ha mencionado por Zach, una forma de entender un modelo es marcar la respuesta como los predictores variar. Usted puede hacer esto fácilmente "cualquier" modelo con el plotmo paquete. Por ejemplo

library(randomForest)
data <- iris
data$Species <- factor(ifelse(data$Species=='virginica','virginica','other'))
mod <- randomForest(Species~Sepal.Length+Sepal.Width, data=data)
library(plotmo)
plotmo(mod, type="prob")

lo que da

plot

Esto cambia una variable, mientras que la celebración de los demás en sus valores medios. Para la interacción de las parcelas, los cambios de dos variables.

El ejemplo anterior utiliza sólo dos variables; más complicado modelos pueden ser visualizados en forma dispersa por mirar una o dos variables en un momento. Desde el "otro" variables se mantienen en sus valores medios, esta muestra sólo una parte de los datos, pero todavía puede ser útil. Algunos ejemplos se pueden encontrar en el Capítulo 9 de Trazado rpart árboles con prp.

4voto

Jerald Puntos 21

Estoy muy interesado en este tipo de preguntas a mí mismo. Sí creo que hay una gran cantidad de información que puede obtener de un bosque aleatorio.

Acerca de las Interacciones, parece Breiman y Cultier ya han tratado de buscar en ella, especialmente para la clasificación de RFs.

A mi entender, este no ha sido implementado en el randomForest paquete de R. Tal vez porque podría no ser tan simple y debido a que el significado de la variable de "interacciones" es muy dependiente de su problema.

Acerca de la no linealidad, no estoy seguro de lo que usted está buscando, la regresión del bosque se utilizan para no lineal de regresión múltiple de los problemas sin ningún tipo de dudas sobre qué tipo de función no lineal a utilizar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X