2012-09-17 11 views
5

¿Hay alguna forma de ejecutar bosque aleatorio en archivos xdf grandes (aproximadamente 10 gb) xdf (revolución R)? Obviamente puedo probar rxReadXdf y encubrirlo en un marco de datos ... pero mi máquina solo tiene 8 GB de RAM y puedo estar lidiando con conjuntos de datos aún mayores en el futuro. Por ejemplo, usando el bucle foreach, me gusta correr 1000 árboles en mi máquina de cuatro núcleos:Random Forest en archivos xdf grandes sin leer en un marco de datos

#'train.xdf" is a 10gb training data set 
rf<- foreach(ntree=rep(250, 4), .combine=combine, 
      .packages='randomForest') %do% 
    randomForest(amount2~.,data="train", ntree=ntree, importance=TRUE, 
       na.action=na.omit, replace=FALSE) 

Pero randomForest no puede tomar en "tren" (un xdf) archivo. ¿Hay alguna forma de ejecutar bosque aleatorio directamente en xdf sin leer en un marco de datos?

Saludos, agsub

+0

No creo que eso sea posible, pero nunca he trabajado con archivos xdf. En cambio, trataría de dividir los datos en trozos más pequeños, formar bosques aleatorios sobre ellos y construir un modelo final sobre las mejores características de todos los trozos combinados. Aunque es bastante engorroso. – Backlin

+0

Ya esa es probablemente la forma en que iré ahora – thiakx

+0

Lo bueno es que si el análisis de datos fuera fácil no tendría trabajo :) – Backlin

Respuesta

3

No, sin cambiar el código R que subyace en el paquete randomForest e incluso entonces puede que no sea posible, ya que las rutinas FORTRAN que subyacen el método de RF probablemente requieren todos los datos a se celebrará en la memoria. Puede ser mejor que en general consigas una pila de RAM más para tu máquina o encuentres algunas estaciones de trabajo/grupos de máquinas más grandes para ejecutar este problema.

(¿Por qué quieres 1000 bosques al azar?)

+2

No estoy familiarizado con el formato de archivo Revolution, pero es posible ejecuta 'randomForest' en varios subconjuntos de tus datos y luego combina los resultados en un solo conjunto. – joran

+0

+1 Buen punto; Iba a hacer el mismo punto en mi respuesta, pero no estaba seguro de si eso significaría cargar todos los datos en la RAM para generar un subconjunto; Dado lo que dice el OP, incluso eso puede no ser posible en su máquina, pero debe haber sido posible crear el archivo en primer lugar. –

+0

Sí, supongo que la mejor manera para mí es dividir los datos y hacer un bosque aleatorio varias veces. El archivo xdf básicamente crea un volcado de memoria virtual en el disco duro, puede pensar que es una memoria virtual a la que R puede acceder rápidamente. Además, hice una corrección a mi qn, estoy tratando de ejecutar 1000 árboles, no 1000 bosques aleatorios. Gracias por su ayuda chicos =) – thiakx

2

Random bosques suelen ser entrenados primero en profundidad, es decir la formación en el nodo actual y luego se entrenan de forma recursiva en los nodos secundarios. Esto requiere que todo el conjunto de datos se mantenga en la memoria.

Para superar esta limitación, escribí el marco de capacitación de bosque aleatorio para manejar los datos de forma incremental (a veces llamado 'en línea'), nunca deteniendo más de una entrada a la vez. Esto requiere una construcción de los árboles en amplitud, y requiere el cálculo de las estadísticas de pureza utilizando algoritmos en línea. Cada nivel del árbol ve los datos exactamente una vez, por lo que su archivo xdf no necesita almacenarse en la memoria, sino que se leerá D veces, donde D es la profundidad máxima del árbol.

Sé que esto probablemente no es muy útil, porque no se puede cambiar el código dado, pero tal vez encuentres aplicación de esas versiones en línea del algoritmo (TRY Amir Safar's group)

1

Para superar las limitaciones de memoria, uso :

max_size_of_pagefiles <- 60000 # in MBs 
memory.limit(size = max_size_of_pagefiles) 

utilizo un SSD como unidad para almacenar el archivo de paginación y la cantidad de espacio libre puede ser utilizado como memoria (el siguiente ejemplo funciona en Windows):

freespace <- as.numeric(gsub("Total # of free bytes  : ", "", 
    system2('fsutil', 'volume diskfree c:', stdout = TRUE)[1]))/(1024*1024) 
memory.limit(size = freespace*0.9) 
Cuestiones relacionadas