【发布时间】:2017-01-13 01:38:15
【问题描述】:
这是我第一次使用并行处理。问题主要是我的语法不好。
我希望在捕获大量 cv.glmnet 迭代的输出方面得到一些帮助,因为我相信我构建的 cv_loop_run 效率非常低。这与 10k 的 lambda 数量一起导致了一个巨大的矩阵,它占用了我所有的内存并导致崩溃。本质上,我需要的是每次运行的 minimum 和 1se lambda(其中 1000 个,而不是全部 10,000 个)。因此,我不会为 cv_loop_run 捕获一个 1kx10k 的列表,而是得到一个 1k 长的列表。
registerDoParallel(cl=8,cores=4)
cv_loop_run<- rbind( foreach(r = 1:1000,
.packages="glmnet",
.combine=rbind,
.inorder =F) %dopar% {
cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld,
nlambda = 10000,
alpha = 1, #FOR LASSO
grouped = FALSE,
parallel= TRUE
)
}
)
l_min<- as.matrix(unlist(as.matrix(cv_loop_run[,9 ,drop=FALSE] ))) # matrix #9 is lamda.min
l_1se<- as.matrix(unlist(as.matrix(cv_loop_run[,10 ,drop=FALSE] ))) # matrix #10 is lamda.1se
【问题讨论】:
-
如果你看
cv.glmnet的代码,当parallel = TRUE时,已经有一个foreach%dopar%循环。因此,(我可能是错的,但是)我不相信将 cv.glmnet 函数包装在另一个foreach%dopar循环中会提高性能。这就像有两个嵌套的并行foreach循环,您的内部循环已经使用了所有内核。 -
@jav 内部循环,我已经为其设置了 parallel = TRUE 循环通过 1,000 个 lambda。外部 %dopar% 循环正在循环 10,000 次 cv.glmnet 运行。
标签: r cross-validation glmnet parallel-foreach doparallel