我正在尝试使用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的向量
仍然,我的Google云实例具有52GB的内存,因此我决定检查其中有多少是当前可用的。
as.numeric(system("awk '/MemFree/ {print $2}' /proc/meminfo", intern=TRUE))
[1] 5606656
哪个高于47GB。因此,假设在培训结束时无法分配2GB,则似乎随机培训森林使用了45GB以上。我知道我的训练数据集会被引导100次以生成随机森林,因此100份训练数据副本的权重约为13GB。同时,我的总RAM分为3个集群,这给了我39GB的内存。它应该给我留下大约6GB的内存,但显然没有。不过,这仍然是假设在构建分离的树之后没有释放任何内存,我怀疑情况是否如此。
因此,我的问题是:
答案 0 :(得分:0)
您无法正确估计随机森林模型的大小,因为这些决策树的大小随数据的特定重采样而变化 - 即树是使用取决于数据分布的停止标准动态构建的。< /p>