tidymodels调优glmnet时出现multi_predict方法缺失错误求助
问题原因及解决方案
错误根因
- 你在使用
linear_reg()模型声明时手动指定glmnet引擎的family = binomial(link = "logit"),但parsnip包仅为logistic_reg()的glmnet引擎注册了适配二项分布族的multi_predict()方法,未给linear_reg()对象的该类自定义参数场景注册对应方法 - 超参数调优过程中
tune包需要调用multi_predict()批量计算不同penalty参数取值下的预测结果,找不到对应方法就触发报错 - 之前分类场景下使用
logistic_reg()没有问题,正是因为该模型声明的glmnet引擎适配了完整的预测方法链
解决方案
最优方案为替换模型声明为logistic_reg(),无需手动指定family参数:glmnet原生支持0-1区间的连续比例值作为响应变量,和二分类场景共用同一套方法实现,完全适配百分比结果的预测需求。
示例代码对比如下:
# 错误写法 bad_spec <- linear_reg(penalty = tune(), mixture = tune()) %>% set_engine("glmnet", family = binomial(link = "logit")) %>% set_mode("regression")
# 正确写法 good_spec <- logistic_reg(penalty = tune(), mixture = tune()) %>% set_engine("glmnet") %>% set_mode("regression")
补充说明
- 该写法下超参数调优流程和你之前分类场景的操作完全一致,不需要修改其他调优、交叉验证逻辑
- 如果你的响应变量是带权重的计数类比例(比如事件数/总数),可以在
set_engine()中补充传入weights参数绑定对应权重列,拟合效果会更优
内容的提问来源于stack exchange,提问作者Mark Rieke
相关产品推荐
相关产品推荐

