首页 > 解决方案 > 如何估计随机森林算法的内存使用量?

问题描述

我正在尝试将随机森林模型与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 个核心,但任何尝试使用超过 3 个核心的尝试都会makeCluster导致以下错误:

反序列化错误(socklist[[n]]):从连接读取错误

所以我想也许内存分配有问题,只尝试了 3 个内核。经过几个小时的训练,当我期待有结果时,令我惊讶的是,我得到的唯一结果是以下错误:

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

不过,我的谷歌云实例有 52GB 内存,所以我决定检查一下目前有多少是免费的。

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

[1] 5606656

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

因此,我的问题是:

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

标签: rrandom-forestramr-caret

解决方案


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


推荐阅读