【问题标题】:Set seed with cv.glmnet paralleled gives different results in R设置种子与 cv.glmnet 并行在 R 中给出不同的结果
【发布时间】:2016-04-13 03:56:30
【问题描述】:

我在超过 1000 个数据集上运行来自 glmnet 包的并行 cv.glmnet。在每次运行中,我都会设置种子以使结果可重现。我注意到的是我的结果不同。问题是当我在同一天运行代码时,结果是一样的。但第二天他们就不同了。

这是我的代码:

model <- function(path, file, wyniki, faktor = 0.75) {

  set.seed(2)

  dane <- read.csv(file)

  n <- nrow(dane)
  podzial <- 1:floor(faktor*n)


  ########## GLMNET ############
  nFolds <- 3

  train_sparse <- dane[podzial,]
  test_sparse  <- dane[-podzial,]

  # fit with cross-validation
  tryCatch({
    wart <- c(rep(0,6), "nie")
    model <- cv.glmnet(train_sparse[,-1], train_sparse[,1], nfolds=nFolds, standardize=FALSE)

    pred <- predict(model, test_sparse[,-1], type = "response",s=model$lambda.min)

    # fetch of AUC value
    aucp1 <- roc(test_sparse[,1],pred)$auc

  }, error = function(e) print("error"))

  results <- data.frame(auc = aucp1, n = nrow(dane))
  write.table(results, wyniki, sep=',', append=TRUE,row.names =FALSE,col.names=FALSE)


}

path <- path_to_files
files <- list.files(sciezka, full.names = TRUE, recursive = TRUE)
wyniki <- "wyniki_adex__samplingfalse_decl_201512.csv"

library('doSNOW')
library('parallel')

#liczba watkow
threads <- 5

#rejestrujemy liczbe watkow
cl <- makeCluster(threads, outfile="")
registerDoSNOW(cl)

message("Loading packages on threads...")
clusterEvalQ(cl,library(pROC))
clusterEvalQ(cl,library(ROCR))
clusterEvalQ(cl,library(glmnet))
clusterEvalQ(cl,library(stringi))

message("Modelling...")
foreach(i=1:length(pliki)) %dopar% {
  print(i)
  model(path, files[i], wyniki)
}

有人知道是什么原因吗? 我正在运行 CentOS Linux 版本 7.0.1406 (Core) / Red Hat 4.8.2-16

【问题讨论】:

    标签: r parallel-processing random-seed glmnet


    【解决方案1】:

    根据Writing R Extensions,需要一个 C 包装器才能从 FORTRAN 调用 R 的正常随机数。我在glmnet 源代码中看不到任何C 代码。恐怕它看起来没有实现:

    6.6 Calling C from FORTRAN and vice versa

    【讨论】:

      【解决方案2】:

      cv.glmnet函数的文档中找到了答案:

      还要注意 cv.glmnet 的结果是随机的,因为折叠 是随机选择的。

      解决办法是手动设置折叠,这样就不随机选择了:

      nFolds <- 3
      foldid <- sample(rep(seq(nFolds), length.out = nrow(train_sparse))
      model <- cv.glmnet(x = as.matrix(x = train_sparse[,-1], 
                         y = train_sparse[,1], 
                         nfolds = nFolds,
                         foldid = foldid,
                         standardize = FALSE)
      

      【讨论】:

      • 不知道为什么你被否决了。您的代码正是 cv.glmnet 内部完成的,所以这似乎是正确的解决方案。
      猜你喜欢
      • 2014-03-09
      • 2021-03-31
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2021-08-11
      • 2013-04-01
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多