lunes, 8 de junio de 2015

Paralelizar Random Forest

Si se quiere disminuir el tiempo de ejecución del algoritmo randomForest, (ver ejemplo de randomForest AQUI) puede utilizarse el package foreach, que distribuye las ejecuciones de los diferentes arboles en distintos procesadores logrando una ejecución en paralelo.

El siguiente script distribuye 1000 arboles de un randomForest  en 4 procesadores, asignando 250  arboles a cada procesador y luego uniéndolos en un único modelo. En un procesador i7 el tiempo de ejecucion tarda 30 segundos sin paralelizar, luego de paralelizar tarda 6 segundo

Conceptualmente el package foreach hace esto:




























# CARGA LIBRERIA Y DATOS
#---------------------------------------------------
library(doParallel);library(foreach);library(C50);data(churn)
inicio    <- Sys.time()           
datos     <- churnTrain[sample(3333,10000,replace = T),]
 
 
# REGISTRO DE PARALLEL BACKEND
#---------------------------------------------------
cl <- makeCluster(detectCores())
registerDoParallel(cl)
getDoParWorkers()
 
 
#RANDOM FOREST
#---------------------------------------------------
modelo.rf <- foreach(ntree=rep(250, 4),         # 250 arboles x 4 nodo: 1000 arboles
                    # .combine      =  combine,  # creacion de arboles en paralelo
                     .multicombine = TRUE,      # creacion de resultados en paralelo
                     .packages     = 'randomForest') %dopar%  
   randomForest(churn ~.,data=datos, mtry = 6, ntree=ntree)
 
 
# STOP CLUSTER
#---------------------------------------------------
stopCluster(cl)
print(duracion<-Sys.time()-inicio)
 
 



1. http://stackoverflow.com/questions/14106010/parallel-execution-of-random-forest-in-r
2. http://cran.r-project.org/web/packages/foreach/vignettes/foreach.pdf
3. https://github.com/tobigithub/R-parallel/wiki/R-parallel-Errors


No hay comentarios:

Publicar un comentario