tutorial titanic studio rbloggers forest examples bloggers r random-forest

titanic - ¿Cómo usar classwt en randomForest of R?



random forest tutorial r (3)

Tengo un conjunto de datos altamente desequilibrado con instancias de clase objetivo en la siguiente proporción (edición :) 60000: 1000: 1000: 1000 60000:1000:1000:50 (es decir, un total de 4 clases). Quiero usar randomForest para hacer predicciones de la clase objetivo.

Por lo tanto, para reducir el desequilibrio de clase, jugué con el parámetro sampsize , configurándolo para (edición :) c(5000, 1000, 1000, 1000) c(5000, 1000, 1000, 50) y algunos otros valores, pero no había mucho uso de ella. En realidad, la precisión de la 1ra clase disminuyó mientras jugaba con sampsize , aunque la mejora en otras predicciones de clase fue muy pequeña.

Mientras revisaba los archivos, encontré dos características más de randomForest() , que son strata y classwt que se usan para compensar el problema de desequilibrio de clase.

Todos los documentos sobre classwt eran antiguos (generalmente pertenecientes a los años 2007, 2008), los cuales no sugerían el uso de la característica randomForest paquete randomForest en R ya que no implementa completamente su funcionalidad completa como lo hace en fortran . Así que la primera pregunta es:
¿Está classwt completamente implementado ahora en el paquete randomForest de R? En caso afirmativo, ¿qué representa pasar c(1, 10, 10, 10) al argumento classwt ? (Suponiendo el caso anterior de 4 clases en la variable de destino)

Otro argumento que se dice que contrarresta el problema del desequilibrio de clase es el muestreo estratificado, que siempre se utiliza junto con sampsize . Entiendo qué sampsize tiene la documentación, pero no hay suficiente documentación o ejemplos que brinden una visión clara del uso de strata para superar el problema de desequilibrio de clase. Entonces la segunda pregunta es:
¿Qué tipo de argumentos se deben pasar a los strata en randomForest y qué representa?

Supongo que la palabra peso que no he mencionado explícitamente en la pregunta debería desempeñar un papel importante en la respuesta.


Los bosques aleatorios probablemente no sean el clasificador correcto para su problema, ya que son extremadamente sensibles al desequilibrio de clase.

Cuando tengo un problema de desequilibrio, generalmente trato con él utilizando sampsize como lo intentaste. Sin embargo, hago que todos los estratos tengan el mismo tamaño y uso el muestreo sin reemplazo. El muestreo sin reemplazo es importante aquí, ya que de lo contrario las muestras de las clases más pequeñas contendrán muchas más repeticiones, y la clase seguirá estando subrepresentada. Puede ser necesario aumentar el mtry si este enfoque conduce a pequeñas muestras, a veces incluso configurándolo para el número total de características.

Esto funciona bien cuando hay suficientes artículos en la clase más pequeña. Sin embargo, tu clase más pequeña tiene solo 50 artículos. Dudo que obtendrías resultados útiles con sampsize=c(50,50,50,50) .

También classwt nunca me ha funcionado.


Puede pasar un vector con nombre a classwt . Pero cómo se calcula el peso es muy complicado.

Por ejemplo, si su variable de destino y tiene dos clases "Y" y "N", y desea establecer un peso equilibrado, debe hacer:

wn = sum(y="N")/length(y) wy = 1

Luego establece classwt = c("N"=wn, "Y"=wy)

Alternativamente, es posible que desee utilizar el paquete de ranger . Este paquete ofrece compilaciones flexibles de bosques aleatorios, y especificar el peso de la clase / muestra es fácil. ranger también es compatible con el paquete caret .


classwt se pasa correctamente a randomForest , verifique este ejemplo:

library(randomForest) rf = randomForest(Species~., data = iris, classwt = c(1E-5,1E-5,1E5)) rf #Call: # randomForest(formula = Species ~ ., data = iris, classwt = c(1e-05, 1e-05, 1e+05)) # Type of random forest: classification # Number of trees: 500 #No. of variables tried at each split: 2 # # OOB estimate of error rate: 66.67% #Confusion matrix: # setosa versicolor virginica class.error #setosa 0 0 50 1 #versicolor 0 0 50 1 #virginica 0 0 50 0

Los pesos de clase son los antecedentes de los resultados. Necesita equilibrarlos para lograr los resultados que desea.

En los strata y el sampsize esta respuesta podría ser de ayuda: https://.com/a/20151341/2874779

En general, parece razonable un tamaño sampsize con el mismo tamaño para todas las clases. strata son un factor que se utilizará para el remuestreo estratificado, en su caso, no necesita ingresar nada.