R-如何让glmnet选择lambda,同时在插入符号中提供alpha范围?

R-如何让glmnet选择lambda,同时在插入符号中提供alpha范围?,r,machine-learning,r-caret,glmnet,R,Machine Learning,R Caret,Glmnet,这个问题似乎以前被问过,但被正确地关闭为离题。我现在也遇到了同样的问题,并认为堆栈溢出是解决此问题的更好方法 我想使用glmnet的热启动来选择lambda以加快模型构建过程,但我想继续使用插入符号中的tuneGrid,以提供大量的alpha序列(glmnet的默认alpha范围太窄)。以下尝试返回错误:error:调整参数网格应包含列alpha、lambda fitControl <- trainControl(method = 'cv', number = 10, classProbs

这个问题似乎以前被问过,但被正确地关闭为离题。我现在也遇到了同样的问题,并认为堆栈溢出是解决此问题的更好方法

我想使用
glmnet
的热启动来选择lambda以加快模型构建过程,但我想继续使用插入符号中的
tuneGrid
,以提供大量的alpha序列(glmnet的默认alpha范围太窄)。以下尝试返回错误:
error:调整参数网格应包含列alpha、lambda

fitControl <- trainControl(method = 'cv', number = 10, classProbs = TRUE, summaryFunction = twoClassSummary) 
tuneGridb <- expand.grid(.alpha = seq(0, 1, 0.05))
model.caretb <- caret::train(y ~ x1 + x2 + x3, data=train, method="glmnet", 
                           family = "binomial", trControl = fitControl, 
                           tuneGrid = tuneGridb, metric = "ROC")

fitControl如果选中默认网格搜索方法

您会注意到,如果指定了网格搜索,但没有实际的网格,插入符号将提供以下alpha值:

alpha = seq(0.1, 1, length = len)
而λ值将由glmnet“热启动”在α=0.5时提供:

init <- glmnet::glmnet(Matrix::as.matrix(x), y,
                                     family = fam,
                                     nlambda = len+2,
                                     alpha = .5)

lambda <- unique(init$lambda)
                      lambda <- lambda[-c(1, length(lambda))]
                      lambda <- lambda[1:min(length(lambda), len)]
我知道这并不完全是你想要的,但它是非常接近没有求助于自定义列车功能

为了更接近所需结果,您可以手动从glmnet获取每个所需alpha的lambda值范围:

lambda <- unique(unlist(lapply(seq(0, 1, 0.05), function(x){
  init <- glmnet::glmnet(Matrix::as.matrix(Sonar[,1:60]), Sonar$Class,
                          family = "binomial",
                          nlambda = 100,
                          alpha = x)
  lambda <- c(min(init$lambda), max(init$lambda))
  }
  )))
也许在网格中探索比glmnet“温暖”启动建议更低的lambda值是明智的

nrow(model.caret$results)
#output 
400
lambda <- unique(unlist(lapply(seq(0, 1, 0.05), function(x){
  init <- glmnet::glmnet(Matrix::as.matrix(Sonar[,1:60]), Sonar$Class,
                          family = "binomial",
                          nlambda = 100,
                          alpha = x)
  lambda <- c(min(init$lambda), max(init$lambda))
  }
  )))
tuneGridb <- expand.grid(.alpha = seq(0, 1, 0.05),
                         .lambda = seq(min(lambda), max(lambda), length.out = 100))
model.caret <- caret::train(Class~ .,
                            data = Sonar,
                            method="glmnet", 
                            family = "binomial",
                            trControl = fitControl, 
                            tuneGrid = tuneGridb,
                            metric = "ROC")

model.caret$bestTune
#output
  alpha       lambda
1     0 2.159367e-05
min(lambda)
#output
2.159367e-05