5

有没有办法在大型(大约 10gb)xdf(revolution 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

4

3 回答 3

3

不,如果不更改作为randomForest包基础的 R 代码,即使这样也可能是不可能的,因为作为 RF 方法基础的 FORTRAN 例程可能需要将所有数据保存在内存中。一般来说,最好为您的机器获得更多的 RAM 堆栈或找到一些更大的工作站/机器集群来运行此问题。

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

于 2012-09-17T09:32:09.320 回答
2

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

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

我知道这可能没有帮助,因为您无法更改给定的代码,但也许您会找到这些算法的在线版本的实现(试试Amir Safar 的小组

于 2012-11-15T15:01:19.110 回答
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)
于 2015-11-25T09:07:46.540 回答