大型xdf文件上的随机森林,无需读入数据帧

时间:2012-09-17 08:52:06

标签: r random-forest

有没有办法在大(约10gb)xdf(革命R格式)文件上运行随机林?显然,我可以尝试rxReadXdf并将其转换为数据帧...但我的机器只有8GB内存,我可能会在未来处理更大的数据集。例如,使用foreach循环,我想在我的四核机器上运行1000棵树:

#'train.xdf" is a 10gb training data set
rf<- foreach(ntree=rep(250, 4), .combine=combine, 
             .packages='randomForest') %do%
    randomForest(amount2~.,data="train", ntree=ntree, importance=TRUE,
                 na.action=na.omit, replace=FALSE)

但是randomForest无法接收“train”(xdf)文件。有没有办法直接在xdf上运行随机林而不读入数据帧?

干杯, agsub

3 个答案:

答案 0 :(得分:3)

不,不是没有更改 randomForest 包下面的R代码,即使这样也可能无法实现,因为覆盖RF方法的FORTRAN例程可能需要将所有数据保存在内存中。通常情况下,您可以获得最佳服务,为您的机器获取更多RAM,或者找到更大的工作站/机器群来运行此问题。

(为什么你想要1000个随机森林?)

答案 1 :(得分:2)

随机森林通常是深度优先训练,即在当前节点上训练,然后在子节点上递归训练。这需要将整个数据集保存在内存中。

为了克服这个限制,我编写了随机森林培训框架来逐步处理数据(有时称为“在线”),从不一次持有多个条目。这需要树的广度优先构造,并且需要使用在线算法计算纯度统计。树的每个级别只能看到一次数据,因此您的xdf文件不需要存储在内存中,但会被读取D次,其中D是树的最大深度。

我知道这可能没有帮助,因为你无法改变给定的代码,但也许你会发现这些在线算法的实现(试试Amir Safar's group

答案 2 :(得分:1)

要克服内存限制,请使用:

max_size_of_pagefiles <- 60000 # in MBs
memory.limit(size = max_size_of_pagefiles)

我使用SSD作为存储页面文件的驱动器,可用空间量可用作内存(以下示例适用于Windows):

freespace <- as.numeric(gsub("Total # of free bytes        : ", "", 
   system2('fsutil', 'volume diskfree c:', stdout = TRUE)[1]))/(1024*1024)
memory.limit(size = freespace*0.9)