在R中使用cv.glmnet和插入符号包获得LASSO的不同结果

时间:2019-09-12 01:41:54

标签: r cross-validation r-caret glmnet

我在这里看到有关我的问题的几篇文章。我经历了那些,但仍然无法弄清楚我做错了什么。

我们将不胜感激任何帮助。

我使用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的不同值。谁能帮我弄清楚我做错了什么?

谢谢

1 个答案:

答案 0 :(得分: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")

enter image description here