如何估计随机森林算法的内存使用量?
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】:
您无法正确估计随机森林模型的大小,因为这些决策树的大小会随着数据的特定重新采样而变化 - 即,这些树是使用取决于数据分布的停止标准动态构建的。
【讨论】:
以上是关于如何估计随机森林算法的内存使用量?的主要内容,如果未能解决你的问题,请参考以下文章