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

jak*_*kes 7 ram r caret random-forest

我正在尝试使用拟合随机森林模型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)
Run Code Online (Sandbox Code Playgroud)

尽管有8个内核,但任何尝试使用3个以上内核的makeCluster结果都会导致以下错误:

unserialize(socklist [[n]])中的错误:从连接读取错误

因此,我认为也许内存分配存在问题,并且仅使用3个内核进行了尝试。经过数小时的培训,当我期望获得结果时,令我惊讶的是,唯一的错误是以下错误:

错误:无法分配大小为1.9 Gb的向量

尽管如此,我的Google云端实例仍具有52GB的内存,因此我决定检查其中有多少是当前可用的。

as.numeric(system("awk '/MemFree/ {print $2}' /proc/meminfo", intern=TRUE))
Run Code Online (Sandbox Code Playgroud)

[1] 5606656

大于47GB。因此,假设在培训结束时无法分配2GB,则似乎随机培训森林使用了45GB以上。我知道我的训练数据集被引导100次以生成一个随机森林,因此100份训练数据副本的重量约为13GB。同时,我的总RAM分为3个群集,这给了我39GB的内存。它应该给我留下约6GB的内存,但显然没有。不过,这仍然是假设在构建分离的树之后没有释放任何内存,我怀疑情况是否如此。

因此,我的问题是:

  1. 我的近似计算还可以吗?
  2. 什么可能导致我的错误?
  3. 我该如何估计我的训练数据需要多少RAM来训练模型?

any*_*ker 0

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