【问题标题】:Getting different results for LASSO using cv.glmnet and caret package in R在 R 中使用 cv.glmnet 和 caret 包获得 LASSO 的不同结果
【发布时间】:2020-01-13 20:37:55
【问题描述】:

我在这里看到了一些关于我的问题的帖子。我经历了这些,但我仍然无法弄清楚我做错了什么。

我们将不胜感激。

我使用 glmnet 包和 caret 包(它是 glmnet 包的包装器)拟合了 LASSO 逻辑回归模型,我得到了不同的结果。

这是我的代码:

使用 glment 包,

require(ISLR)
require(glmnet)
y <- Smarket$Direction
x <- model.matrix(Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Volume, Smarket)[, -1]

lasso.mod <- cv.glmnet(x, y, alpha=1,family="binomial",nfolds = 5, type.measure="class",
                       lambda = seq(0.001,0.1,by = 0.001))

> lasso.mod$lambda.min
[1] 0.1

使用插入符号包,

require(caret)
set.seed(123)
fitControl1 <- trainControl(method = "cv",number = 5,savePredictions = T,returnResamp="all")
modelFitlassocvintm1 <- train(Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Volume, data=Smarket, 
                              method = "glmnet", 
                              trControl = fitControl1,

                              tuneGrid=expand.grid(
                                .alpha=1,
                                .lambda=seq(0.001,0.1,by = 0.001)),

                              family="binomial")

modelFitlassocvintm1$bestTune

   alpha lambda
26     1  0.026

如您所见,基于 5 折交叉验证,我得到了调整参数 lambda 的不同值。谁能帮我弄清楚我做错了什么?

谢谢

【问题讨论】:

    标签: r cross-validation r-caret glmnet


    【解决方案1】:

    我相信这与这两个函数为 n 折交叉验证划分数据集的方式有关。即使是最细微的褶皱差异也会导致最佳参数发生变化。

    此图显示两个模型大致相同:

    ggplot()+
      geom_point(aes(x = lasso.mod$lambda,y = 1-lasso.mod$cvm))+
      geom_point(aes(x = modelFitlassocvintm1$results$lambda,y = modelFitlassocvintm1$results$Accuracy),color = "red")+
      labs(x = "lambda",
           y = "accuracy")
    

    【讨论】:

    • 感谢您的回答。无论如何,留一个交叉验证(LOOCV)应该给出相同的答案。不是吗?我尝试通过给出 nfolds=nrow(Smarket) 使用 cv.glmnet 进行 LOOCV。但它不起作用
    猜你喜欢
    • 2016-11-20
    • 2016-11-17
    • 2020-01-05
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多