23 votos

R randomForest no puede manejar más de 32 niveles. ¿Cuál es la solución?

R randomForest paquete no puede manejar el factor con más de 32 niveles. Cuando se da más de 32 niveles, se emite un mensaje de error:

No puede manejar los predictores categóricos con más de 32 categorías.

Pero los datos que tengo tiene varios factores. Algunos de ellos tienen más de 1000 niveles y algunos de ellos tienen más de 100. Incluso tiene el 'estado' de estados unidos, que es de 52.

Así que, aquí está mi pregunta.

  1. ¿Por qué hay tal limitación? randomForest negarse a ejecutar incluso para el caso sencillo.

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    Si es simplemente debido a la limitación de memoria, ¿cómo puede scikit aprender del randomForeestRegressor se ejecute con más de 32 niveles?

  2. ¿Cuál es la mejor manera de manejar este problema? Supongamos que tengo X1, X2, ..., X50 variables independientes y y es la variable dependiente. Y supongamos que X1, X2 y X3 cuenta con más de 32 niveles. ¿Qué debo hacer?

    Lo que estoy pensando es que ejecuta el algoritmo de agrupamiento para cada uno de X1, X2 y X3, donde la distancia se define como la diferencia en Y. voy a correr tres conglomerados, ya que hay tres variables problemáticas. Y en cada agrupación, deseo que puedas encontrar niveles similares. Y voy a unirlos.

    ¿Cómo este sonido?

29voto

ESRogs Puntos 1381

En realidad, es bastante razonable restringir debido a una división en función de un factor con $N$ de los niveles es en realidad una selección de una de las $2^N-2$ combinaciones posibles. Así que incluso con $N$ 25 el espacio de combinaciones es tan enorme que tal inferencia se hace menor sentido.

La mayoría de las otras implementaciones, simplemente, tratar factor como un ordinal (es decir, números enteros de 1 a $N$), y esta es una opción de cómo se puede solucionar este problema. En realidad RF es a menudo lo suficientemente sabio como para cortar esto en grupos arbitrarios con varias divisiones.

La otra opción es cambiar la representación-quizá el resultado no dependen directamente de la entidad del estado pero, por ejemplo, la zona, la población, el número de pinos per cápita o de otro atributo(s) que usted puede conectar a su sistema de información en su lugar.

Puede ser también que cada estado es un hecho aislado y no guardan relación de la entidad de que se requiere un modelo independiente por sí mismo.

Clustering basado en una decisión es probablemente una mala idea porque de esta manera usted es el contrabando de información a partir de la decisión en atributos, que a menudo termina en el sobreajuste.

18voto

David Plumpton Puntos 1345

La razón principal es cómo randomForest se implementa. Implementación de R de la siguiente manera mucho de la original Breiman las especificaciones. Aquí lo importante a destacar es que para el factor/variables categóricas, la división de criterios es binario con algunos de los valores de etiqueta a la izquierda y el resto de los valores de etiqueta de la derecha.

Eso significa que las búsquedas para todas las combinaciones de la agrupación de los valores de la etiqueta en dos grupos. Si se denotan con $0$ el grupo de la izquierda y con $1$ el grupo de la derecha y enumerar para cada etiqueta de un dígito, usted recibirá un número en el rango $[0;2^M-1]$ combinaciones, que es prohibitivo desde un punto de vista computacional.

¿Por qué las implementaciones de Weka y funciona Python?

La aplicación weka no use el CARRO de los árboles de forma predeterminada. Utiliza C45 árboles que no tiene este problema computacional, ya que para categórica entradas se divide en varios nodos, uno por cada nivel de valor.

El python bosque aleatorio aplicación no se puede utilizar categórica/factor de variables. Usted tiene que codificar esas variables en ficticio o variables numéricas.

Otra de las implementaciones pueden permitir múltiples niveles (incluyendo weka aquí) porque aunque no use el CARRO, que no necesariamente se implementa twoing. Lo que significa que permiten encontrar la mejor dividir por un factor variable sólo por la agrupación de una etiqueta en contra de todos los otros valores. Esto se requiere por mucho menos de cálculo ya que se necesita comprobar sólo $M$ puntos de división.

2voto

Vincent Warmerdam Puntos 263

Usted puede tratar de representar que una columna diferente. Usted podría representar los mismos datos como una escasa dataframe.

Mínimo viable código;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

Observe cómo cada valor en la columna original ahora se convierte en un aparte ficticio de la columna.

Más extensa de código de ejemplo;

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

Aunque esta pieza de código se muestra que, de hecho, ya no sale el error, te darás cuenta de que el randomForest algoritmo que ahora se necesita un largo tiempo antes de que finalice. Esto es debido a una restricción de CPU, podría reducir el mapa esta tarea a través de muestreo de ahora.

Para obtener más información, por favor echa un vistazo a este blogpost:

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/

0voto

Usted puede utilizar el paquete de extraTrees lugar. Extremadamente aleatorios bosques algoritmo no trate sobre cualquier punto/intervalo, pero sólo un limitado subconjunto aleatorio de divisiones.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X