我正在使用重症监护室患者的一些数据创建逻辑回归模型。该模型旨在根据患者对某种治疗的反应来预测患者在未来 7 天内是否可能生存或死亡。
为此,我使用 R 中的
tidymodels
套件。我已经成功训练和调整了弹性网络逻辑回归模型,但我想查看已创建的特定模型(即该模型中有哪些变量,分解它赋予每个变量的权重等)。我已经非常接近了,但我只是无法完成最后一小步。
我的工作流程如下:
# initial split of data
proning_initial_split28 <-
raw_proning_mortality %>%
initial_split(prop = 0.9, strata = mortality_28)
proning_modelTrain_28 <-
proning_initial_split28 %>%
training()
创建具有 5 个折叠的 k 折叠对象 -
lr_v_fold <-
vfold_cv(data = proning_modelTrain_28,
v = 5,
repeats = 5,
strata = mortality_28)
创建数据处理配方-
lr_recipe <-
recipe(proning_modelTrain_28, formula = mortality_28 ~ .) %>%
step_rm(mortality_07) %>%
step_dummy(all_factor_predictors(), -mortality_28) %>%
step_impute_bag(all_predictors()) %>%
step_corr(all_predictors(), threshold = 0.9) %>%
step_zv(all_predictors()) %>%
prep()
模型的创建和模型的调整网格-
lr_model_01 <-
logistic_reg(mode = 'classification',
engine = 'glmnet',
penalty = tune(),
mixture = tune()) %>%
set_args(maxit=1e+06)
lr_tuning_grid <-
grid_max_entropy(penalty(),
mixture(),
iter = 2000)
创建最终工作流程以将所有内容整合在一起。我已经通过了
control_grid()
指令来保存所做的预测并保存每一步生成的模型 -
lr_workflow <-
workflow() %>%
add_model(lr_model_01) %>%
add_recipe(lr_recipe) %>%
tune_grid(resamples = lr_v_fold,
grid = lr_tuning_grid,
metrics = metric_set(sens, spec, ppv, npv, roc_auc),
control = control_grid(save_pred = T,
extract = extract_fit_parsnip))
我无法访问此最终工作流对象中的模型。
lr_workflow$.extracts
似乎包含模型(下面的示例)。
然而,深入是很困难的。
上图显示了项目[[25[]]。我可以用
lr_workflow$.extracts[[25]]$.extracts[1]
来参与其中的一部分,但我得到的输出如下 -
[[1]]
parsnip model object
Call: glmnet::glmnet(x = maybe_matrix(x), y = y, family = "binomial", alpha = ~0.0505244575906545, maxit = ~1e+06)
Df %Dev Lambda
1 0 0.00 4.4620
2 1 0.16 4.0660
3 1 0.33 3.7050
(continues for a total 100 rows)
如何更好地分解我训练过的逻辑回归模型?我的意思是类似于下图的细分(该图像是一个说明性示例,与我的具体数据无关)-
这是一个解决方案。诀窍在于您需要将预处理工作流程保存在一个对象中,以便随后可以使用它来获取模型。请注意,我更改了原始的
lr_workflow
,因此它包含预处理工作流程,并创建了一个名为 tune_wf
的新对象来获取调整结果。
# Create preprocessing workflow
lr_workflow <-
workflow() %>%
add_model(lr_model_01) %>%
add_recipe(lr_recipe)
# Tune parameters
tune_wf <- lr_workflow %>%
tune_grid(resamples = lr_v_fold,
grid = lr_tuning_grid,
metrics = metric_set(sens, spec, ppv, npv, roc_auc),
control = control_grid(save_pred = T,
extract = extract_fit_parsnip))
# Collect metrics
tune_wf %>%
collect_metrics()
# Get model with highest roc_auc or another meric
best_mod <- tune_wf %>%
select_best("roc_auc")
# Get the model
final_wf <- lr_workflow %>%
finalize_workflow(best_mod)
# last fit the model
final_wf %>%
last_fit(data_split)