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

Así pues, para reducir la clase de desequilibrio, he jugado con sampsize parámetro de configuración a c(5000, 1000, 1000, 50) y algunos otros valores, pero no había mucho uso de ella. En realidad, la exactitud de la clase 1 disminución, mientras yo jugaba con sampsize, a pesar de la mejora en la otra clase de predicciones fue muy minuto.

Mientras que cavar a través de los archivos, me encontré con dos características más de randomForest(), que son strata y classwt que se utilizan para compensar clase de desequilibrio problema.

Todos los documentos en classwt fueron la edad (generalmente pertenecientes a los años 2007, 2008 años), todos los cuales propuso el uso de la classwt característica de randomForest paquete en R como no completamente implementar su funcionalidad completa como lo hace en la fortran. Así que la primera pregunta es:

Es classwt completamente implementado ahora en randomForest paquete de R? Si sí, ¿qué pasa c(1, 10, 10, 10) a la classwt argumento representan? (Suponiendo que el caso anterior de 4 clases en la variable de destino)

Otro argumento que se dice para compensar clase de desequilibrio problema es el muestreo estratificado, que se utiliza siempre en combinación con sampsize. Entiendo lo que sampsize es a partir de la documentación, pero no hay suficiente documentación o ejemplos que dio una visión más clara en el uso de strata para la superación de la clase de desequilibrio problema. Entonces, la segunda pregunta es:

Qué tipo de argumentos que se pasan a strataen randomForest y lo que representa?

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

  • Me gustaría ejecutar un bosque en sólo tres clases más pequeñas. Eso le dará una idea de cuán bien un modelo rf podría distinguir las tres clases sin la clase dominante en todo. Si la precisión es muy baja, entonces la clase de desequilibrio no es probablemente su verdadero problema, en lugar de las tres clases no son fácilmente distinguidos con las características que tiene.
  • Gracias @joran . Lo siento por un poco de confusión, aquí es la instancia de la clase de relación que también me han cambiado en la pregunta: 60000:1000:1000:50. ¿Crees que la omisión de la primera clase en este caso va a ayudar? Porque cuando ejecuto el RF con todas las 4 clases puedo conseguir la exactitud en el orden siguiente para cada clase: c(90%, 70%, 70%, menos del 10%). Estoy más preocupado por mejorar la exactitud de las 4 de la clase que está a menos de 10%. Y una cosa más, es el classwt implementado correctamente en randomForest de R a partir de ahora?
  • Como para classwt aplicación – supongo que no está implementado, ya que cran.r-project.org/web/packages/randomForest/NEWS se puede leer que «* Implementar el nuevo esquema de manejo de classwt en la clasificación.» está en la lista de deseos.
  • Ejemplos de cómo utilizar strata y sampsize puede ser que ahora se encuentra en dos puestos, here y here
  • Sí, no creo que classwt se implementa. He probado con diferentes valores y mis resultados son idénticos a los que se ejecuta con la configuración predeterminada, donde classwt = NULL
  • classwt SE implementa. es el cambio de mis predicciones.
  • classwt se transmite correctamente a la base del código de randomForest, check it.
  • Trate de valores más grandes. He encontrado que sólo conseguí resultados cuando he aumentado el peso de un par de órdenes de magnitud. Por ejemplo, c(1,10,50) fue incapaz de cambiar una cosa, pero c(1,10,50000) comenzó a hacer una diferencia. ¿Por qué es esto?

InformationsquelleAutor StrikeR | 2013-11-27

3 Comentarios

  1. 3

    classwt se transmite correctamente a randomForest, compruebe 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

    Clase pesos son los priores de los resultados. Es necesario un equilibrio entre ellos para lograr los resultados que desea.


    Sobre strata y sampsize esta respuesta puede ser de ayuda: https://stackoverflow.com/a/20151341/2874779

    En general, sampsize con el mismo tamaño para todas las clases parece razonable. strata es un factor que va a ser utilizado para estratificado de remuestreo, en su caso, usted no necesita la entrada de cualquier cosa.

  2. 1

    Bosques aleatorios no son probablemente el derecho clasificador para su problema, ya que son extremadamente sensibles a la clase de desequilibrio.

    Cuando tengo un desequilibrio en el problema que se me suelen tratar con él mediante sampsize como la has probado. Sin embargo todos los estratos de igual tamaño y uso de muestreo sin reemplazo.
    Muestreo sin reemplazo es importante aquí, ya que de lo contrario las muestras procedentes de las clases más pequeñas contienen muchas más repeticiones, y la clase se siguen estando subrepresentadas. Puede ser necesario aumentar mtry si este enfoque conduce a muestras pequeñas, a veces incluso de la configuración para el número total de características.

    Esto funciona tranquila bien cuando hay suficientes elementos en el más pequeño de la clase. Sin embargo, el más pequeño de la clase sólo tiene 50 artículos. Dudo que iba a obtener resultados útiles con sampsize=c(50,50,50,50).

    También classwt nunca ha trabajado para mí.

  3. 0

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

    Por ejemplo, si la variable de destino y tiene dos clases de «y» y «N», y desea establecer equilibrada del peso, usted debe hacer:

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

    A continuación, establezca classwt = c("N"=wn, "Y"=wy)

    Alternativamente, puede que desee utilizar ranger paquete. Este paquete ofrece flexible construye de bosques aleatorios, y la especificación de la clase /peso de la muestra es fácil. ranger también es apoyado por caret paquete.

    • Supongo que y = «N» debe ser cambiado a y == «N»

Dejar respuesta

Please enter your comment!
Please enter your name here