Bosque aleatorio y predicción


13

Estoy tratando de entender cómo funciona Random Forest. Tengo una idea de cómo se construyen los árboles, pero no puedo entender cómo Random Forest hace predicciones sobre muestras fuera de bolsa. ¿Alguien podría darme una explicación simple, por favor? :)

Respuestas:


16

Cada árbol en el bosque se construye a partir de una muestra de bootstrap de las observaciones en sus datos de entrenamiento. Esas observaciones en la muestra de bootstrap construyen el árbol, mientras que las que no están en la muestra de bootstrap forman las muestras fuera de bolsa (u OOB).

Debe quedar claro que las mismas variables están disponibles para los casos en los datos utilizados para construir un árbol que para los casos en la muestra OOB. Para obtener predicciones para la muestra OOB, cada una se pasa por el árbol actual y se siguen las reglas para el árbol hasta que llega a un nodo terminal. Eso produce las predicciones OOB para ese árbol en particular.

Este proceso se repite una gran cantidad de veces, cada árbol entrenado en una nueva muestra de arranque a partir de los datos de entrenamiento y las predicciones para las nuevas muestras OOB derivadas.

A medida que crece el número de árboles, cualquier muestra estará en las muestras OOB más de una vez, por lo tanto, el "promedio" de las predicciones sobre los N árboles donde una muestra está en el OOB se utiliza como la predicción OOB para cada muestra de entrenamiento para árboles 1, ..., N. Por "promedio" usamos la media de las predicciones para una respuesta continua, o el voto mayoritario puede usarse para una respuesta categórica (el voto mayoritario es la clase con más votos sobre el conjunto de árboles 1, ..., N).

Por ejemplo, supongamos que tenemos las siguientes predicciones OOB para 10 muestras en el conjunto de entrenamiento en 10 árboles

set.seed(123)
oob.p <- matrix(rpois(100, lambda = 4), ncol = 10)
colnames(oob.p) <- paste0("tree", seq_len(ncol(oob.p)))
rownames(oob.p) <- paste0("samp", seq_len(nrow(oob.p)))
oob.p[sample(length(oob.p), 50)] <- NA
oob.p

> oob.p
       tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1     NA    NA     7     8     2     1    NA     5     3      2
samp2      6    NA     5     7     3    NA    NA    NA    NA     NA
samp3      3    NA     5    NA    NA    NA     3     5    NA     NA
samp4      6    NA    10     6    NA    NA     3    NA     6     NA
samp5     NA     2    NA    NA     2    NA     6     4    NA     NA
samp6     NA     7    NA     4    NA     2     4     2    NA     NA
samp7     NA    NA    NA     5    NA    NA    NA     3     9      5
samp8      7     1     4    NA    NA     5     6    NA     7     NA
samp9      4    NA    NA     3    NA     7     6     3    NA     NA
samp10     4     8     2     2    NA    NA     4    NA    NA      4

Donde NAsignifica que la muestra estaba en los datos de entrenamiento para ese árbol (en otras palabras, no estaba en la muestra OOB).

La media de los no NAvalores para cada fila da la predicción OOB para cada muestra, para todo el bosque

> rowMeans(oob.p, na.rm = TRUE)
 samp1  samp2  samp3  samp4  samp5  samp6  samp7  samp8  samp9 samp10 
  4.00   5.25   4.00   6.20   3.50   3.80   5.50   5.00   4.60   4.00

A medida que se agrega cada árbol al bosque, podemos calcular el error OOB hasta incluir ese árbol. Por ejemplo, a continuación se muestran los medios acumulativos para cada muestra:

FUN <- function(x) {
  na <- is.na(x)
  cs <- cumsum(x[!na]) / seq_len(sum(!na))
  x[!na] <- cs
  x
}
t(apply(oob.p, 1, FUN))

> print(t(apply(oob.p, 1, FUN)), digits = 3)
       tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1     NA    NA  7.00  7.50  5.67  4.50    NA   4.6  4.33    4.0
samp2      6    NA  5.50  6.00  5.25    NA    NA    NA    NA     NA
samp3      3    NA  4.00    NA    NA    NA  3.67   4.0    NA     NA
samp4      6    NA  8.00  7.33    NA    NA  6.25    NA  6.20     NA
samp5     NA     2    NA    NA  2.00    NA  3.33   3.5    NA     NA
samp6     NA     7    NA  5.50    NA  4.33  4.25   3.8    NA     NA
samp7     NA    NA    NA  5.00    NA    NA    NA   4.0  5.67    5.5
samp8      7     4  4.00    NA    NA  4.25  4.60    NA  5.00     NA
samp9      4    NA    NA  3.50    NA  4.67  5.00   4.6    NA     NA
samp10     4     6  4.67  4.00    NA    NA  4.00    NA    NA    4.0

De esta manera, vemos cómo se acumula la predicción sobre los N árboles en el bosque hasta una iteración dada. Si lee a través de las filas, el no NAvalor más a la derecha es el que muestro arriba para la predicción OOB. Así es como se pueden hacer trazas del rendimiento de OOB: se puede calcular un RMSEP para las muestras de OOB en función de las predicciones de OOB acumuladas acumulativamente sobre los N árboles.

Tenga en cuenta que el código R que se muestra no está tomado de las partes internas del código randomForest en el paquete randomForest para R: acabo de extraer un código simple para que pueda seguir lo que sucede una vez que se determinan las predicciones de cada árbol.

Debido a que cada árbol se construye a partir de una muestra de arranque y que hay una gran cantidad de árboles en un bosque aleatorio, de modo que cada observación del conjunto de entrenamiento está en la muestra OOB para uno o más árboles, se pueden proporcionar predicciones OOB para todos muestras en los datos de entrenamiento.

He pasado por alto problemas como la falta de datos para algunos casos OOB, etc., pero estos problemas también pertenecen a un solo árbol de regresión o clasificación. También tenga en cuenta que cada árbol en un bosque usa solo mtryvariables seleccionadas al azar.


Gran respuesta Gavin! Cuando escribes "To get predictions for the OOB sample, each one is passed down the current tree and the rules for the tree followed until it arrives in a terminal node", ¿tienes una explicación simple de lo que rules for the treeson? ¿Y entiendo samplecorrectamente como una fila si entiendo que las muestras son groupsde observaciones en las que los árboles dividen los datos?
user1665355

@ user1665355 ¿Supuse que entendía cómo se construyeron los árboles de regresión o clasificación? Los árboles en RF no son diferentes (excepto quizás en las reglas de detención). Cada árbol divide los datos de entrenamiento en grupos de muestras con "valores" similares para la respuesta. La ubicación variable y dividida (por ejemplo, pH> 4.5) que mejor predice (es decir, minimiza el "error") forma la primera división o regla en el árbol. Cada rama de esta división se considera a su vez y se identifican nuevas divisiones / reglas que minimizan el "error" del árbol. Este es el algoritmo de particionamiento recursivo binario. Las divisiones son las reglas.
Restablece a Monica - G. Simpson el

@ user1665355 Sí, lo siento, vengo de un campo donde una muestra es una observación, una fila en el conjunto de datos. Pero cuando comienza a hablar de una muestra de bootstrap, es un conjunto de N observaciones, extraídas con reemplazo de los datos de entrenamiento y, por lo tanto, tiene N filas u observaciones. Intentaré limpiar mi terminología más tarde.
Restablecer a Monica - G. Simpson

¡Gracias! Soy muy nuevo en RF, lo siento por tal vez preguntas estúpidas :) Creo que entiendo casi todo lo que escribiste, ¡muy buena explicación! Simplemente me pregunto acerca de la ubicación variable y dividida (por ejemplo, pH> 4.5) que mejor predice (es decir, minimiza el "error") forma la primera división o regla en el árbol ... No puedo entender cuál es el error. : / Estoy leyendo y tratando de entender http://www.ime.unicamp.br/~ra109078/PED/Data%20Minig%20with%20R/Data%20Mining%20with%20R.pdf. En la página 115-116, los autores usan RF para elegir variable importanceindicadores técnicos.
user1665355

El "error" depende del tipo de árbol que se esté instalando. La desviación es la medida habitual para las respuestas continuas (gaussianas). En el paquete rpart, el coeficiente de Gini es el valor predeterminado para las respuestas categóricas, pero hay otros para diferentes modelos, etc. Debe utilizar un buen libro sobre Árboles y RF si desea implementarlo con éxito. Las medidas de mejora de variables son algo diferente: miden la "importancia" de cada variable en el conjunto de datos al ver cuánto cambia algo cuando esa variable se usa para ajustar un árbol y cuando esa variable no se usa.
Restablece a Monica - G. Simpson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.