【问题标题】:R: GLMNET odd behavior when model is reranR:重新运行模型时 GLMNET 的奇怪行为
【发布时间】:2013-08-30 07:16:30
【问题描述】:

我正在尝试使用 LASSO 进行变量选择,并尝试使用 glmnet 包在 R 中实现。这是我目前写的代码:

 set.seed(1)
 library(glmnet)
 return =  matrix(ret.ff.zoo[which(index(ret.ff.zoo) == beta.df$date[1]),])
 data = matrix(unlist(beta.df[which(beta.df$date == beta.df$date[1]),][,-1]), ncol = num.factors)
 dimnames(data)[[2]] <- names(beta.df)[-1]
 model <- cv.glmnet(data, return, standardize = TRUE)
 coef(model)

这是我第一次运行时得到的:

 > coef(model)
 15 x 1 sparse Matrix of class "dgCMatrix"
                       1
 (Intercept) 0.009159452
 VAL         .          
 EQ          .          
 EFF         .          
 SIZE        0.018479078
 MOM         .          
 FSCR        .          
 MSCR        .          
 SY          .          
 URP         .          
 UMP         .          
 UNIF        .          
 OIL         .          
 DEI         .          
 PROD        .             

但是,这是我再次运行相同代码时得到的结果:

 > coef(model)
 15 x 1 sparse Matrix of class "dgCMatrix"
                       1
 (Intercept) 0.008031915
 VAL         .          
 EQ          .          
 EFF         .          
 SIZE        0.021250778
 MOM         .          
 FSCR        .          
 MSCR        .          
 SY          .          
 URP         .          
 UMP         .          
 UNIF        .          
 OIL         .          
 DEI         .          
 PROD        .          

我不确定模型为什么会这样。如果系数在每次运行时都发生变化,我将如何选择最终模型?它是否在每次运行时使用不同的调整参数 $\lambda$?我以为cv.glmnet默认使用model$lambda.1se?!

我刚刚开始了解这个包,如果我能得到任何帮助,我将不胜感激!

谢谢!

【问题讨论】:

  • 模型不是确定性的。在模型拟合之前尝试运行set.seed(1),看看是否得到相同的答案。
  • 感谢您的尝试!我以为这会解决它,但它没有..
  • @nograpes 它的工作原理是选择相同的预测变量集。但问题是系数在每次运行时仍然会发生变化......
  • 尝试运行cv.glmnet帮助页面中的示例脚本。您应该能够两次获得相同的系数。您确定要在两次运行之前重新运行 set.seed(1) 吗?
  • 知道了!谢谢!您能否发表您的评论作为答案,以便我接受?非常感谢您的帮助。

标签: r regression glmnet


【解决方案1】:

模型不是确定性的。在您的模型适合产生确定性结果之前运行set.seed(1)

【讨论】:

  • 再次感谢!你对这个包的使用非常熟悉吗?如果可以的话,我将不胜感激您对我面临的另一个问题的见解...
  • 我认为您可能需要仔细阅读 Tibshirani 的许多关于正则化的论文中的一篇。如果您有一般性问题,您可以在此站点上提问,但请确保它们下次可重现。如果您有特定的统计问题,CrossValidated 站点可能会有所帮助。但是,任何网站上的问题通常会在提问者付出巨大努力的情况下得到更好的接受。
  • 相信我,我已经在这个问题上工作了几个星期,但似乎没有任何进展。我非常需要帮助。
【解决方案2】:

您需要为这两个模型提供相同的 nfoldsfoldid。查看help(cv.glmnet) 了解更多详情。这将使交叉验证是相同的,如果您在相同的数据集上运行模型,您应该得到相同的模型。

【讨论】:

    【解决方案3】:

    只是对@nograpes 答案的补充。每次拟合模型之前,都应该设置相同的种子。简而言之,一颗种子仅适用于一种型号。例如,

    set.seed(1)
    model1 = cv.glmnet(x, y, alpha = 0, family = 'binomial')
    model2 = cv.glmnet(x, y, alpha = 0, family = 'binomial')
    

    对于上面的代码,model1和model2的系数可能不同。

    set.seed(1)
    model1 = cv.glmnet(x, y, alpha = 0, family = 'binomial')
    set.seed(1)
    model2 = cv.glmnet(x, y, alpha = 0, family = 'binomial')
    

    只有在拟合模型之前设置了相同的种子,结果是完全一样的。

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2011-02-24
      • 2013-03-04
      相关资源
      最近更新 更多