我正在使用 glmnet
在插入符号中运行弹性网络正则化 .
我将alpha和lambda的值序列传递给 trainControl
,然后执行 repeatedcv
以获得alpha和lambda的最佳调整 .
下面是一个示例,其中alpha和lambda的最佳调整分别为0.7和0.5:
age <- c(4, 8, 7, 12, 6, 9, 10, 14, 7, 6, 8, 11, 11, 6, 2, 10, 14, 7, 12, 6, 9, 10, 14, 7)
gender <- make.names(as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1)))
bmi_p <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88, 0.83, 0.48, 0.99, 0.80, 0.85,
0.50, 0.91, 0.29, 0.88, 0.99, 0.84, 0.80, 0.85, 0.88, 0.99)
m_edu <- make.names(as.factor(c(0, 1, 1, 2, 2, 3, 2, 0, 1, 1, 0, 1, 2, 2, 1, 2, 0, 1, 1, 2, 2, 0 , 1, 0)))
p_edu <- make.names(as.factor(c(0, 2, 2, 2, 2, 3, 2, 0, 0, 0, 1, 2, 2, 1, 3, 2, 3, 0, 0, 2, 0, 1, 0, 1)))
f_color <- make.names(as.factor(c("blue", "blue", "yellow", "red", "red", "yellow",
"yellow", "red", "yellow","blue", "blue", "yellow", "red", "red", "yellow",
"yellow", "red", "yellow", "yellow", "red", "blue", "yellow", "yellow", "red")))
asthma <- make.names(as.factor(c(1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1)))
x <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)
tuneGrid <- expand.grid(alpha = seq(0, 1, 0.05), lambda = seq(0, 0.5, 0.05))
fitControl <- trainControl(method = 'repeatedcv', number = 3, repeats = 5, classProbs = TRUE, summaryFunction = twoClassSummary)
set.seed(1352)
model.test <- caret::train(asthma ~ age + gender + bmi_p + m_edu + p_edu + f_color, data = x, method = "glmnet",
family = "binomial", trControl = fitControl, tuneGrid = tuneGrid,
metric = "ROC")
model.test$bestTune
My question?
当我运行 as.matrix(coef(model.test$finalModel))
时,我会假设给出对应于最佳模型的系数,我得到100组不同的系数 .
那么如何获得与最佳调整相对应的系数?
我已经看到了这个建议来获得最好的模型 coef(model.test$finalModel, model.test$bestTune$lambda)
然而,这会返回NULL系数,并且在任何情况下,只会返回与lambda相关的最佳调整,而不是返回alpha .
编辑:
在互联网上到处搜索之后,我现在可以找到的所有指向正确答案的方向是this博文,其中 model.test$finalModel
返回对应于最佳alpha调整的模型, coef(model.test$finalModel, model.caret$bestTune$lambda)
返回对应于的系数集lambda的最佳值 . 如果这是真的那么这就是我的问题的答案 . 但是,由于这是一篇博文,我找不到其他任何支持这一说法,我仍然持怀疑态度 . 任何人都可以验证这个声明 model.test$finalModel
返回对应于最佳alpha的模型吗?如果是这样,那么这个问题就会解决 . 谢谢!
1 回答
在玩了一些你的代码后,我发现很奇怪glmnet火车根据种子选择不同的lambda范围 . 这是一个例子:
最佳lambda是:
这工作:
给出系数最佳alpha和lambda
当使用这个模型来预测一些y被预测为X1而一些被预测为X2
现在用你使用的种子
lambda值小10倍,这给出了空系数,因为lambdaOpt不在测试的lambda范围内:
现在,在预测此模型时,只预测X0(第一级):
非常奇怪的行为,可能值得报道