gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:42:50 28 4
gpt4 key购买 nike

此问题似乎之前已被问过 here但由于偏离主题而被正确关闭。我现在遇到了同样的问题,并认为堆栈溢出是解决此问题的更好地方。

我想使用 glmnet 的热启动来选择 lambda 来加速模型构建过程,但我想继续使用插入符号中的 tuneGrid 来提供一个大的 alpha 序列(glmnet 的默认 alpha 范围太窄)。以下尝试返回错误:错误:调整参数网格应包含 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")

在使用 glmnet 默认 lambda 选择过程的同时,如何通过插入符号为 alpha 提供一系列值?

最佳答案

如果您检查 glmnet model in caret 的默认网格搜索方法

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

alpha = seq(0.1, 1, length = len)

而 lambda 值将由 glmnet “热启动”在 alpha = 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)]

所以如果你这样做:

library(caret)
library(mlbench)
data(Sonar)

fitControl <- trainControl(method = 'cv',
number = 10,
classProbs = TRUE,
summaryFunction = twoClassSummary,
search = "grid")

model.caret <- caret::train(Class~ .,
data = Sonar,
method="glmnet",
family = "binomial",
trControl = fitControl,
tuneLength = 20,
metric = "ROC")

对于每个 alpha 20 lambda 值,您不会得到一个包含 20 个组合的网格,而是一个包含 400 个组合的网格:

nrow(model.caret$results)
#output
400

我知道这并不完全是您所追求的,但它非常接近,无需求助于自定义火车功能。

为了更接近所需的结果,您可以从 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))
}
)))

创建一个包含多个 lambda 的网格:

tuneGridb <- expand.grid(.alpha = seq(0, 1, 0.05),
.lambda = seq(min(lambda), max(lambda), length.out = 100))

caret 足够聪明,只需将 lambda 值传递给 glmnet,并不适合所有模型

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

在这种情况下,Ridge 是最佳选择。因为这个最佳 lambda 实际上是测试的最低 lambda

min(lambda)
#output
2.159367e-05

也许在网格中探索比 glmnet“热”启动建议更低的 lambda 值是明智的。

关于R - 如何让 glmnet 选择 lambda,同时在插入符号中提供 alpha 范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280074/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com