要使用 拟合套索模型glmnet
,您只需执行以下操作,即可glmnet
自动计算lambda
适合数据集的合理值范围:
glmnet(x, y, alpha = 1)
我知道我也可以使用glmnet
. 但是,我想使用这个caret
包,这样我就可以以统一的方式训练和比较多个模型。问题是我不知道如何alpha
在调用glmnet
from时仅修复参数,caret
因为caret
想要同时调整alpha
和lambda
。
train(y ~ ., data = train, method = 'glmnet', trControl = ctrl, tuneGrid = data.frame(alpha = 1))
Error in train.default(x, y, weights = w, ...) :
The tuning parameter grid should have columns alpha, lambda
一般有什么方法可以只指定一个参数并允许底层算法根据算法的默认方法处理未指定的参数?
编辑:
我想让glmnet
选择的原因lambda
是适当的范围lambda
可以变化很大,并且glmnet
可以很好地选择一个好的范围:
library(ElemStatLearn)
library(glmnet)
dat <- prostate
train <- subset(dat, train, select = -train)
train.x <- as.matrix(subset(train, select = -lpsa))
train.y <- train$lpsa
print(glmnet(train.x, train.y, alpha = 0)$lambda)
print(glmnet(train.x, train.y, alpha = 1)$lambda)
您可以看到 的范围lambda
非常不同。要在 中使用自定义模型train
,我考虑过glmnet
先运行,然后将计算结果分配lambda
给网格:
glmnetGrid <- function(x, y, len = NULL) {
library(glmnet)
lam <- glmnet(x, y, alpha)$lambda
expand.grid(lambda = lam)
}
但后来我需要传递alpha
给网格函数,我认为框架不允许这样做。此外,glmnet
为了获得lambda
. 有没有办法简单地让glmnet
运行并将其分配lambda
给网格,以便在后续分析caret
中使用这些值?lambda