在R中将big.matrix转换成data.frame

7

我最近开始使用R进行数据分析。现在我在对一个大查询数据集(~1 GB的ASCII模式,在二进制模式下超过了我的笔记本电脑4GB RAM)进行排名时遇到了问题。使用bigmemory::big.matrix可以解决这个数据集的问题,但是将这样的矩阵'm'提供给gbm()randomForest()算法会导致错误:

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

class(m)会输出以下内容:

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

有没有一种正确的方法可以将big.matrix实例传递到这些算法中?

1
如果其他解决方案失败,您可能想尝试使用Revolutions。我不知道它是否支持randomForest,但我认为他们支持大内存需求。例如,请参见http://www.revolutionanalytics.com/products/enterprise-big-data.php。请注意,这是专有软件。有一个免费的学术版本。 - Xu Wang
1
你能提供你正在使用的实际 gbmrandomForest 调用吗?具体来说,你是否在使用 randomForest 的公式接口? - joran
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


我可以使用 "as.big.matrix" 将“data.frame”转换为“big.matrix” 吗? 因为当我转换时,我无法像这样访问转换后的 'big.matrix' 元素:`> cp2006.big.matrix<-as.big.matrix(cp.2006) 警告信息: In as.big.matrix(cp.2006) : Coercing data.frame to matrix via factor level numberings.
class(cp.2006) [1] "data.frame" class(cp2006.big.matrix) [1] "big.matrix" attr(,"package") [1] "bigmemory" cp2006.big.matrix 类 "big.matrix" 的对象 Slot "address": <pointer: 0x7fceb865caa0>`
- Mona Jalal

2
通常情况下,数字对象占用的内存比磁盘空间多。向量或矩阵中的每个“double”元素占用8个字节。将对象强制转换为data.frame时,可能需要在RAM中进行复制。应避免尝试使用bigmemory/big***套件不支持的函数和数据结构。虽然“biglm”可用,但我怀疑gbm()或randomForest()是否能识别并使用“big”系列中的设施。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接