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