2011-11-29 19 views
6

Ho recentemente iniziato a utilizzare R per l'analisi dei dati. Ora ho un problema nel classificare un set di dati di una grande query (~ 1 GB in modalità ASCII, sulla RAM del mio portatile da 4 GB in modalità binaria). Utilizzando bigmemory::big.matrix per questo insieme di dati è una bella soluzione, ma fornire tale matrice 'm' nei gbm() o randomForest() algoritmi causa l'errore:big.matrix as data.frame in R

cannot coerce class 'structure("big.matrix", package = "bigmemory")' into a data.frame 

classe (m) emette il folowing:

[1] "big.matrix" 
attr(,"package") 
[1] "bigmemory" 

C'è un modo per passare correttamente un'istanza in questi algoritmi?

+1

se altre soluzioni non riescono, si consiglia di provare Revolutions. Non so se supporta 'randomForest' o no, ma penso che abbiano supporto per grandi necessità di memoria. Vedi, per esempio, 'http: // www.revolutionanalytics.com/products/enterprise-big-data.php'. Si noti che è un software proprietario. C'è una versione accademica gratuita. –

+1

Puoi fornire le chiamate effettive di 'gbm' e' randomForest' che stai utilizzando? In particolare, stai usando l'interfaccia di formula per 'randomForest'? – joran

risposta

11

Io, ovviamente, non può verificare questa utilizzando i dati della bilancia, ma posso riprodurre i vostri errori utilizzando l'interfaccia formula di ogni funzione:

require(bigmemory) 
m <- matrix(sample(0:1,5000,replace = TRUE),1000,5) 
colnames(m) <- paste("V",1:5,sep = "") 

bm <- as.big.matrix(m,type = "integer") 

require(gbm) 
require(randomForest) 

#Throws error you describe 
rs <- randomForest(V1~.,data = bm) 
#Runs without error (with a warning about the response only having two values) 
rs <- randomForest(x = bm[,-1],y = bm[,1]) 

#Throws error you describe 
rs <- gbm(V1~.,data = bm) 
#Runs without error 
rs <- gbm.fit(x = bm[,-1],y = bm[,1]) 

Non utilizzando l'interfaccia formula per randomForest è un consiglio abbastanza comune per set di dati di grandi dimensioni; può essere abbastanza inefficiente. Se leggi ?gbm, vedrai una raccomandazione simile che ti indirizza verso lo gbm.fit anche per i dati di grandi dimensioni.

+0

Posso convertire un 'data.frame' in' big.matrix' usando 'as.big.matrix'? Perché quando converto non riesco ad accedere agli elementi del 'big.matrix' convertito come in: '> cp2006.big.matrix <-as.big.matrix (cp.2006) Messaggio di avviso: In as.big.matrix (cp.2006): Coercizione data.frame a matrice tramite numerazioni a livello di fattore. > Classe (cp.2006) [1] "data.frame" > classe (cp2006.big.matrix) [1] "big.matrix" attr ("pacchetto") [1] "bigmemory " > cp2006.big.matrix Un oggetto di classe" big.matrix " " indirizzo "di slot: ' –

2

Spesso accade che la memoria occupata da oggetti numerici sia maggiore dello spazio su disco. Ogni elemento "doppio" in un vettore o una matrice richiede 8 byte. Quando costruisci un oggetto su un data.frame, potrebbe essere necessario copiarlo nella RAM. Evitare di provare a utilizzare funzioni e strutture di dati esterne a quelle supportate dalla suite bigmemory/big *** di pacchetti. "biglm" è disponibile, ma dubito che ci si possa aspettare gbm() o randomForest() per riconoscere e utilizzare le strutture nella famiglia "grande".

Problemi correlati