2011-11-29 39 views
6

Recientemente comencé a usar R para el análisis de datos. Ahora tengo un problema al clasificar un gran conjunto de datos de consulta (~ 1 GB en modo ASCII, sobre la memoria RAM de 4 GB de mi computadora portátil en modo binario). Uso de bigmemory::big.matrix para este conjunto de datos es una buena solución, pero proporcionar una matriz 'm' tal en los gbm() o randomForest() algoritmos provoca el error:big.matrix como data.frame en R

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

clase (m) da salida a la folowing:

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

¿Hay alguna manera de pasar correctamente una instancia big.matrix en estos algoritmos?

+1

si fallan otras soluciones, es posible que desee probar Revolutions. No sé si admite 'randomForest' o no, pero creo que tienen soporte para grandes necesidades de memoria. Ver, por ejemplo, 'http: // www.revolutionanalytics.com/products/enterprise-big-data.php'. Tenga en cuenta que es un software propietario. Hay una versión académica gratuita. –

+1

¿Puede proporcionar las llamadas reales 'gbm' y' randomForest' que está utilizando? Específicamente, ¿está utilizando la interfaz de fórmula para 'randomForest'? – joran

Respuesta

11

Yo, obviamente, no puede probar esto utilizando datos de su escala, pero puede reproducir sus errores mediante la interfaz fórmula de cada función:

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]) 

no se utiliza el interfaz de fórmula para randomForest es un consejo bastante comunes para grandes conjuntos de datos; puede ser bastante ineficiente. Si lees ?gbm, verás una recomendación similar que te dirige hacia gbm.fit para datos grandes también.

+0

¿Puedo convertir un 'data.frame' en' big.matrix' usando 'as.big.matrix'? Porque cuando convierto no puedo acceder a los elementos de la 'big.matrix' convertida como en: '> cp2006.big.matrix <-as.big.matrix (cp.2006) Mensaje de advertencia: En as.big.matrix (cp.2006): Coaccionar data.frame a la matriz a través de las numeraciones del nivel de los factores. > clase (cp.2006) [1] "data.frame" > clase (cp2006.big.matrix) [1] "big.matrix" attr ("paquete") [1] "bigmemory " > cp2006.big.matrix Un objeto de la clase" big.matrix " " Dirección "de la ranura: ' –

2

A menudo sucede que la memoria ocupada por objetos numéricos es más que el espacio en disco. Cada elemento "doble" en un vector o matriz toma 8 bytes. Cuando coacciona un objeto a un data.frame, es posible que deba copiarse en la RAM. Debería evitar intentar usar funciones y estructuras de datos que están fuera de las admitidas por el conjunto de paquetes bigmemory/big ***. "biglm" está disponible, pero dudo que pueda esperar que gbm() o randomForest() reconozcan y usen las instalaciones en la "gran" familia.

Cuestiones relacionadas