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 NA
significa 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 NA
valores 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 NA
valor 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 mtry
variables seleccionadas al azar.
"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 querules for the tree
son? ¿Y entiendosample
correctamente como una fila si entiendo que las muestras songroups
de observaciones en las que los árboles dividen los datos?