cv.glmnet并行和内存问题

时间:2016-09-05 16:42:04

标签: r cross-validation glmnet parallel-foreach doparallel

这是我第一次使用并行处理。问题主要是我的语法不好。

我想在捕获大量cv.glmnet迭代的输出方面有所帮助,因为我认为我已经构建了cv_loop_run,效率非常低。这个以及10k的lambdas数量导致了一个庞大的矩阵,它占据了我所有的记忆并导致崩溃。实质上我需要的是每次运行的最小 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

1 个答案:

答案 0 :(得分:0)

好的,我自己也找到了。我所要做的就是限制每个cv.glmnet运行的输出。这样,每次运行中只会获得最小值和1次lambda值。这意味着:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld,
                                       nlambda = 10000,
                                       alpha = 1, #FOR LASSO
                                       grouped = FALSE,
                                       parallel= TRUE
                                      )

成为这个:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld,
                                       nlambda = 10000,
                                       alpha = 1, #FOR LASSO
                                       grouped = FALSE,
                                       parallel= TRUE
                                      )[9:10]