如何估计随机森林算法的内存使用量?

9

我正在尝试使用caret拟合随机森林模型。我的训练数据大小为129MB,我正在使用8个内核和52GB的RAM在Google Cloud上进行计算。以下是我使用的代码:

library(caret)
library(doParallel)
cl <- makeCluster(3, outfile = '')
registerDoParallel(cl)
model <- train(x = as.matrix(X_train),
               y = y_train,
               method = 'rf', 
               verbose = TRUE,
               trControl = trainControl(method = 'oob',
                                        verboseIter = TRUE,
                                        allowParallel = TRUE),
               tuneGrid = expand.grid(mtry = c(2:10, 12, 14, 16, 20)),
               num.tree = 100,
               metric = 'Accuracy',
               performance = 1)
stopCluster(cl)

尽管有8个核心,但尝试在makeCluster中使用超过3个核心会导致以下错误:

Error in unserialize(socklist[[n]]) : error reading from connection

因此,我认为可能存在内存分配问题,只使用了3个核心进行尝试。经过几个小时的训练后,当我期望得到结果时,惊讶地发现只得到了以下错误:

Error: cannot allocate vector of size 1.9 Gb

我的Google云实例仍然拥有52GB的内存,所以我决定检查目前还剩多少可用内存。
as.numeric(system("awk '/MemFree/ {print $2}' /proc/meminfo", intern=TRUE))

[1] 5606656

以上超过了47GB。因此,假设训练结束时无法分配2GB,则训练随机森林使用的内存超过45GB。我知道我的训练数据集被引导100次以生成随机森林,因此大约有13GB的训练数据副本。同时,我的总RAM分为3个集群,为39GB。这应该还剩下大约6GB,但显然并不是这样。尽管如此,这是假设在构建单独的树之后没有释放任何内存,但我怀疑情况并非如此。

因此,我的问题是:

  1. 我的近似计算是否正确?
  2. 可能导致我的错误的原因是什么?
  3. 我如何估计使用我的训练数据训练模型所需的RAM量?

6
不是答案,但是我建议使用方法“ranger”而不是“rf”。这将调用“ranger”包而不是“randomForest”包。“ranger”可以自行并行运行,并且占用更少的内存。由于您有一个集群,您可能需要考虑使用h2o包。 - phiver
可能会对您有用:https://www.r-bloggers.com/benchmarking-random-forest-implementations/ - RLave
一个策略是从“较小”的模型开始,并通过bench包中的mark函数估计其内存使用情况。 - A.Fischer
1个回答

0

您无法正确估计随机森林模型的大小,因为决策树的大小会随着数据的特定重新采样而变化 - 即树是动态构建的,停止标准取决于数据分布。


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