如何从tidymodels工作流中提取逻辑回归模型的变量权重?
提取tidymodels中弹性网模型的变量权重明细
1. 从工作流中取出目标模型
你已经通过control_grid提取了模型,接下来先从lr_workflow$.extracts里拿到具体的拟合模型对象:
- 如果要取最优参数对应的模型,可以先筛选最优参数再提取:
# 先获取你指定评估指标下的最优参数(比如roc_auc) best_params <- lr_workflow %>% extract_workflow_set_result() %>% select_best(metric = "roc_auc") # 替换成你实际用的评估指标 # 基于最优参数生成最终拟合模型 best_fit <- lr_workflow %>% finalize_workflow(best_params) %>% fit(data = your_train_data) %>% # 替换成你的训练数据集 extract_fit_parsnip()
- 如果直接从已有的
$.extracts里取特定模型(比如第1个参数组合的模型):
fit_obj <- lr_workflow$.extracts[[1]]$.fit
2. 提取变量权重(系数)
glmnet的模型系数存在fit_obj$fit里,用coef()函数指定对应的lambda值(也就是调参里的penalty)就能拿到明细:
# 用最优参数里的penalty值提取系数 coef_matrix <- coef(best_fit$fit, s = best_params$penalty) # 转成数据框,方便查看和筛选 coef_df <- as.data.frame(as.matrix(coef_matrix)) %>% tibble::rownames_to_column("variable") %>% dplyr::rename(weight = s1) %>% dplyr::filter(weight != 0) # 过滤掉被弹性网筛选掉的系数为0的变量
注意事项
- 如果你的模型做了预处理(比如标准化、哑变量编码),输出的变量名可能是预处理后的,要对应回原始变量的话,可以用
extract_preprocessor()查看预处理规则:
preprocessor <- lr_workflow %>% extract_preprocessor() preprocessor$terms # 查看变量映射关系
- 如果是多lambda值的情况,你也可以传入多个
s值,一次性提取不同penalty下的系数。
内容的提问来源于stack exchange,提问作者for_the_love_of_cod
相关产品推荐
相关产品推荐

