Muestreo con reemplazo en R randomForest

11

La implementación randomForest no permite el muestreo más allá del número de observaciones, incluso cuando se realiza un muestreo con reemplazo. ¿Por qué es esto?

Funciona bien:

rf <- randomForest(Species ~ ., iris, sampsize=c(1, 1, 1), replace=TRUE)
rf <- randomForest(Species ~ ., iris, sampsize=3, replace=TRUE)

Lo que quiero hacer:

rf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), replace=TRUE)
Error in randomForest.default(m, y, ...) : 
  sampsize can not be larger than class frequency

Error similar sin muestra estratificada:

rf <- randomForest(Species ~ ., iris, sampsize=151, replace=TRUE)
Error in randomForest.default(m, y, ...) : sampsize too large

Como esperaba que el método tomara muestras de bootstrap cuando se reemplaza = VERDADERO en ambos casos, no esperaba este límite.

Mi objetivo es usar esto con la opción de muestreo estratificado, con el fin de obtener una muestra suficientemente grande de una clase relativamente rara.

Cohoz
fuente
No estoy seguro de cuál es la verdadera razón, pero una muestra de bootstrap suele ser del mismo tamaño que su muestra original, por lo que este comportamiento parece perfectamente en línea con lo que esperaría de algo que dice tomar muestras de bootstrap.
joran
1
Bueno, esa fue mi elección de palabra, no la documentación, pero su punto está bien tomado. Aún así, esto es inconveniente cuando se trata de reequilibrar la distribución y no sé por qué es una restricción útil para imponer.
cohoz

Respuestas:

5

Esto no responde por qué , pero para evitar esto, uno puede duplicar los datos para la clase rara en los datos de entrenamiento y tomar una muestra estratificada del resultado.

Dos inconvenientes de este enfoque, en comparación con un sobremuestreo "natural":

  • las estimaciones fuera de bolsa ya no son significativas
  • Se requieren más recursos para almacenar el objeto y tomar muestras aleatorias

pero le permitirá a uno construir el bosque con las proporciones de clase deseadas.

Cohoz
fuente
4

Tengo exactamente la misma pregunta y encontré esto en el registro de cambios para randomForest :

Cambios en 4.1-0:

  • En randomForest (), si se da el tamaño de muestra, el muestreo ahora se realiza sin reemplazo, además de estratificado por clase. Por lo tanto, el tamaño de muestra no puede ser mayor que las frecuencias de clase.

Establecer reemplazar = VERDADERO manualmente tampoco parece anular esto.

hgcrpd
fuente
2
Puede darse el caso de que el parámetro de reemplazo simplemente se ignore, pero más adelante en ese registro de cambios: Cambios en 4.5-12: * Se agregó el argumento 'estratos' a randomForest, que, junto con 'sampsize', permite el muestreo (con o sin reemplazo) de acuerdo con una variable de estratos (que puede ser algo diferente a la variable de clase). Actualmente solo funciona en clasificación.
cohoz
Por ejemplo, el mismo error se genera a través derf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), strata=iris$Species, replace=TRUE)
cohoz
Además, algunos casos de prueba con la versión actual (4.6-7) indican que las muestras se toman con reemplazo, por lo que esta no es la explicación.
cohoz
1
Terminé sobremuestreando antes de ejecutar randomForest. Probablemente haya algo mal con esta metodología, pero parece funcionar cuando pruebo los resultados.
hgcrpd
1
No, esa es la solución que uso y hace exactamente lo que uno quiere. Especialmente para el caso de uso de una clase relativamente rara, duplicar los datos para esa clase en el conjunto de entrenamiento y antes de tomar una muestra estratificada funciona bien y el "costo" en términos de memoria / CPU adicional no es demasiado alto. Creo que vale la pena escribir hasta una A "respuesta" a pesar de que en realidad no es uno ...
cohoz