如何提取caret中glmnet最优调参对应的模型系数?
解决caret glmnet最优调参系数提取问题
我来帮你理清这个问题,咱们一步步解决:
为什么as.matrix(coef(model.test$finalModel))返回100组系数?
glmnet包本身会针对单个alpha值,拟合一整系列lambda对应的模型(这是它的默认行为)。而caret在做弹性网调参时,会遍历你tuneGrid里的每个alpha,对每个alpha都拟合完整的lambda序列。当调参完成后,model.test$finalModel其实是对应最优alpha值的那个glmnet模型对象——它里面包含了该alpha下所有lambda对应的系数,所以直接调用coef()会返回所有lambda的结果,也就是你看到的多组系数。
验证model.test$finalModel是否对应最优alpha
你可以通过以下代码直接验证:
# 对比finalModel使用的alpha和最优alpha model.test$finalModel$alpha == model.test$bestTune$alpha
如果返回TRUE,就说明finalModel确实是用最优alpha拟合的模型,这和你找到的博客说法一致。在你的示例中,最优alpha是0.7,运行这段代码应该会得到TRUE的结果。
正确提取最优调参对应的系数
既然finalModel已经是最优alpha的模型,你只需要指定最优lambda值来提取对应的系数即可。注意glmnet的coef()函数中,指定lambda的参数是s(而不是直接写lambda),正确的代码如下:
# 提取最优alpha+lambda对应的系数 best_coefficients <- as.matrix(coef(model.test$finalModel, s = model.test$bestTune$lambda)) print(best_coefficients)
这样就能得到你想要的、仅对应最优调参组合的系数矩阵了。
关于你之前得到空系数的可能原因
如果之前调用coef(model.test$finalModel, model.test$bestTune$lambda)返回空,大概率是因为你没指定参数名s——glmnet的coef()函数第一个参数是object,第二个是...,直接传lambda值会被识别为其他参数,而不是指定lambda的s参数。加上s=就可以解决这个问题。
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

