57 votos

Bosque aleatorio de tiempo de cálculo en R

Yo estoy usando la parte del paquete en R con 10.000 filas y 34 características, y de algún factor que características tiene más de 300 niveles. El tiempo de cálculo es demasiado largo. (Se ha tomado 3 horas hasta el momento y no ha terminado todavía.)

Quiero saber qué elementos tienen un gran efecto sobre el tiempo de cómputo de un bosque aleatorio. Es lo que tiene factores con demasiados niveles? Hay métodos optimizados para mejorar la RF tiempo de cómputo?

72voto

ESRogs Puntos 1381

La complejidad general de RF es algo así como $\text{ntree}\cdot\text{mtry}\cdot(\text{# objetos})\log( \text{# objetos})$; si usted quiere acelerar sus cálculos, puede intentar lo siguiente:

  1. Uso randomForest en lugar de partyo, aún mejor, ranger o Rborist (a pesar de que ambos aún no son a prueba de batallas).
  2. No utilice la fórmula, es decir, llamar a randomForest(predictors,decision) en lugar de randomForest(decision~.,data=input).
  3. Uso do.trace argumento para ver el OOB error en tiempo real, de esta manera se puede detectar que usted puede bajar ntree.
  4. Acerca de los factores; RF (y de todos los árboles métodos) intenta encontrar un subconjunto óptimo de los niveles así escaneo de $2^\text{(# de niveles-1)}$ posibilidades; para este fin es bastante ingenuo este factor puede dar tanta información, por no hablar de que randomForest no se comen los factores con más de 32 niveles. Tal vez usted puede tratar simplemente como una ordenada (y por lo tanto equivalente a una normal, numérico de la variable de RF) o clúster en algunos grupos, la división de este atributo en varios?
  5. Compruebe si su ordenador no ha de ejecutar fuera de RAM y es el uso de espacio de intercambio. Si es así, comprar un equipo grande.
  6. Por último, se pueden extraer algunas subconjunto aleatorio de objetos y hacer algunos experimentos iniciales sobre este.

14voto

josef Puntos 113

Porque randomForest es una colección de independiente carros formados sobre un subconjunto aleatorio de características y registros, se presta a la paralelización. La cosechadora() en función de la randomForest paquete de unir de forma independiente capacitados bosques. Aquí es un juguete ejemplo. Como @mpq 's respuesta por encima de los estados no se debe utilizar la fórmula de la notación, pero pasar en un dataframe/matriz de variables y un vector de resultados. Yo descarada levantado estos de la documentación.

library("doMC")
library("randomForest")
data(iris)

registerDoMC(4) #number of cores on the machine
darkAndScaryForest <- foreach(y=seq(10), .combine=combine ) %dopar% {
   set.seed(y) # not really needed
   rf <- randomForest(Species ~ ., iris, ntree=50, norm.votes=FALSE)
}

Pasé la randomForest función de combinar a la del mismo nombre .combinar parámetro( que controla la función de la salida del bucle. El lado negativo es que no OOB de la tasa de error o más trágico de importancia variable.

Espero que ayude.

Editar:

Después de releer el post me doy cuenta de que puedo hablar nada sobre el 34+ factor de emisión. Un wholey de la onu-el pensamiento de las respuestas podría ser que los representen, como variables binarias. es decir, a cada factor una columna que está codificado 0/1 -nivel de factor acerca de su presencia/no presencia. Haciendo algunas de selección de variables en importancia los factores y de la eliminación de ellos usted podría tener espacio de características de crecimiento demasiado grande. Sólo un pensamiento.

4voto

Carsten Thiel Puntos 751

Me gustaría sugerir un par de enlaces:

1) Reducir el número de niveles de un factor variable es un enlace a una pregunta en stackoverflow a lidiar con un problema similar, mientras que el uso de la randomForest paquete. Específicamente se trata con el uso de sólo el más frecuente de los niveles y la asignación de un nuevo nivel para que todos los demás, menos frecuente de los niveles.

La idea vino de aquí: 2009 KDD Cup Lento Reto. Los datos para esta competencia tenía un montón de factores con un montón de niveles y se describen algunos de los métodos que utilizan para recortar los datos de 50.000 filas por columnas de 15.000 a ejecutar en un 2-core y 2GB de RAM de la computadora portátil.

Mi última sugerencia sería mirar ejecutando el problema, como se sugirió anteriormente, en paralelo en un hi-CPU de instancia de Amazon EC2.

3voto

mat_geek Puntos 1367

Yo no puedo hablar a la velocidad de algoritmos específicos en R pero debería ser obvio cuál es la causa de mucho tiempo de cálculo. Para cada árbol en cada rama CARRO está buscando la mejor forma binaria split. Así que para cada uno de los 34 características de la mayoría de mirar las divisiones de cada uno de los niveles de las variables. Multiplique el tiempo de ejecución para cada división en un árbol por el número de ramas en el árbol y, a continuación, múltiple, que por el número de árboles en el bosque y tiene un largo tiempo de funcionamiento. Quién sabe? Tal vez incluso con un ordenador rápido y esto podría tomar años para terminar?

La mejor manera de acelerar las cosas creo que sería bulto algunos de los niveles juntos, de modo que cada variable es hasta tal vez de 3 a 5 niveles en lugar de 300. Por supuesto, esto depende de ser capaz de hacer esto sin perder información importante en sus datos.

Después de que tal vez usted podría mirar a ver si hay algún algoritmo inteligente que puede acelerar el tiempo de búsqueda por la división en cada uno de los nodos de los árboles individuales. podría ser que en un árbol en particular la división de búsqueda es una repetición de una búsqueda que ha hecho en la anterior árbol. Así que si usted puede guardar las soluciones de la anterior división de decisiones e identificar cuando estás repitiendo tal vez esa estrategia podría ahorrar un poco en el tiempo de cómputo.

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