7

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

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

class(m) 输出以下内容:

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

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

4

2 回答 2

12

我显然无法使用您的规模数据对此进行测试,但我可以通过使用每个函数的公式接口来重现您的错误:

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大数据。

于 2011-11-29T18:42:37.890 回答
2

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

于 2011-11-29T18:42:49.137 回答