2012-09-17 5 views
5

C'è un modo per eseguire foresta casuale su file di grandi dimensioni (circa 10 Gb) XDF (rivoluzione R formato)? Ovviamente posso provare rxReadXdf e copiarlo in un dataframe ... ma la mia macchina ha solo RAM da 8 GB e potrei avere a che fare con set di dati ancora più grandi in futuro. Ad esempio, utilizzando il ciclo foreach, mi piace correre 1000 alberi sulla mia macchina quad core:a caso Foresta su grandi file XDF senza leggere in un dataframe

#'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) 

Ma foresta casuale non è in grado di prendere in (un XDF) file "treno". C'è un modo per eseguire la foresta casuale direttamente su xdf senza leggere in un dataframe?

Cheers, agsub

+0

Non penso sia possibile, ma non ho mai lavorato con i file xdf. Vorrei invece provare a dividere i dati in blocchi più piccoli, addestrare foreste casuali su quelli e costruire un modello finale sulle migliori caratteristiche di tutti i blocchi combinati. È piuttosto ingombrante però. – Backlin

+0

Ya che è probabilmente il modo in cui me ne andrò per ora – thiakx

+0

Il lato positivo di esso è che se l'analisi dei dati è stato facile non avrei un lavoro :) – Backlin

risposta

3

No, non senza modificare il codice R che è alla base del pacchetto foresta casuale e anche allora potrebbe non essere possibile in quanto le routine FORTRAN che erano alla base del metodo RF probabilmente richiedono tutti i dati a essere tenuto in memoria. Potresti essere meglio servito in generale, ottenendo una pila di RAM in più per la tua macchina o trovando alcune workstation/gruppi di macchine più grandi su cui eseguire questo problema.

(Perché vuoi 1000 foreste casuali?)

+2

Non ho dimestichezza con il formato di file rivoluzione, ma è possibile lanciate 'randomForest' su diversi sottoinsiemi dei vostri dati e combinate i risultati in un unico ensemble. – joran

+0

+1 Buon punto; Stavo per fare lo stesso punto nella mia risposta ma non ero sicuro se ciò significherebbe caricare tutti i dati nella RAM per generare un sottoinsieme; Dato quello che dice l'OP, anche questo potrebbe non essere possibile sulla loro macchina, ma deve essere stato possibile creare il file in primo luogo. –

+0

Sì, immagino che il modo migliore per me sia dividere i dati e creare una foresta casuale alcune volte. Il file xdf crea fondamentalmente un dump di memoria virtuale su hdd, puoi considerarlo come memoria virtuale a cui R può accedere rapidamente. Inoltre, ho apportato una correzione al mio qn, sto cercando di eseguire 1000 alberi, non 1000 foreste casuali. Grazie per il tuo aiuto ragazzi =) – thiakx

2

foreste casuali di solito sono addestrati in profondità, cioè la formazione sul nodo corrente, e quindi in modo ricorsivo treno sui nodi figlio. Ciò richiede che l'intero set di dati sia conservato in memoria.

per superare questa limitazione, ho scritto il quadro casuale formazione forestale per gestire i dati in modo incrementale (a volte chiamato 'online), non tenendo più di una voce alla volta. Ciò richiede una costruzione in scala degli alberi e richiede il calcolo delle statistiche di purezza utilizzando algoritmi online. Ogni livello dell'albero vede i dati esattamente una volta, quindi il tuo file xdf non deve essere archiviato in memoria, ma verrà letto D volte, dove D è la profondità massima dell'albero.

So che questo è probabilmente non è utile, perché non è possibile modificare il codice dato, ma forse troverete attuazione di tali versioni online dell'algoritmo (provate Amir Safar's group)

1

per superare le limitazioni di memoria, uso :

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

io uso uno SSD come unità per memorizzare il file di paging e la quantità di spazio libero può essere utilizzato come memoria (il seguente esempio funziona su 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)