2011-11-29 108 views
6

我最近开始使用R进行数据分析。现在,我在排列大型查询数据集时遇到了问题(在ASCII模式下〜1 GB,在我的笔记本电脑的4GB RAM中以二进制模式)。此数据集使用bigmemory::big.matrix是一个很好的解决方案,但在gbm()randomForest()算法提供这样的矩阵“M”导致错误:big.matrix as data.frame in R

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

类(M)输出如下因素:

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

有没有办法将big.matrix实例正确传递到这些算法中?

+1

如果其他解决方案失败,您可能想尝试革命。我不知道它是否支持'randomForest',但我认为它们支持大内存需求。例如,参见“http:// www.revolutionanalytics.com/products/enterprise-big-data.php”。请注意,它是专有软件。有一个免费的学术版本。 –

+1

你能提供你正在使用的实际的'gbm'和'randomForest'调用吗?具体来说,你是否使用'randomForest'的公式接口? – joran

回答

11

我显然不能对此进行测试使用规模的数据,但我可以通过使用每个功能的配方接口重现你的错误:

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

不使用公式接口randomForest是相当普遍的意见用于大数据集;它可能相当低效。如果您阅读?gbm,您也会看到一条类似的建议,指导您针对大数据对gbm.fit

+0

我可以使用'as.big.matrix'将'data.frame'转换为'big.matrix'吗?因为当我转换我不能访问转换后的'big.matrix'的元素,如:'> cp2006.big.matrix <-as.big.matrix(cp.2006) 警告消息: 在as.big.matrix (cp.2006): 通过因子级别编号强制data.frame到矩阵。 >类(cp.2006) [1] “data.frame” >类(cp2006.big.matrix) [1] “big.matrix” ATTR( “包”) [1]“bigmemory “ > cp2006.big.matrix 类”big.matrix“的对象 插槽”地址“: <指针:0x7fceb865caa0> –

2

通常情况下,数字对象占用的内存大于磁盘空间。矢量或矩阵中的每个“双”元素需要8个字节。将对象强制转换为data.frame时,可能需要将其复制到RAM中。您应该避免尝试使用超出bigmemory/big ***软件包套件支持的功能和数据结构。 “biglm”是可用的,但我怀疑你可以期望gbm()或randomForest()来识别和使用“大”系列中的设施。