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

Posted

技术标签:

【中文标题】如何估计随机森林算法的内存使用量?【英文标题】:How to estimate the memory usage for Random Forest algorithm? 【发布时间】:2019-08-24 02:30:26 【问题描述】:

我正在尝试用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 个内核的任何尝试都会导致以下错误:

反序列化错误(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 的空间,但显然没有。尽管如此,这是假设在构建分离树后没有释放内存,我怀疑这是一种情况。

因此,我的问题是:

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

【问题讨论】:

不是答案,而是使用方法rf,而不是使用方法ranger。这将调用 ranger 包而不是 randomForest 包。 ranger 自身并行运行,对内存更友好。由于您有一个集群,您可能会查看h2o 包。 r-bloggers.com/benchmarking-random-forest-implementations 这可能有用。 一种策略可能是从“较小”​​模型开始,并通过 bench 包中的 mark 函数估计其内存使用情况。 【参考方案1】:

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

【讨论】:

以上是关于如何估计随机森林算法的内存使用量?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习集成学习算法

机器学习集成学习算法

mahout 随机森林RF算法

史诗级干货长文集成学习算法

何时使用随机森林

分类算法 - 随机森林