在tidymodels的workflow_set中为配方参数配置自定义调优范围的方法咨询
解决tidymodels workflow_set中保留配方和模型调参参数的问题
你遇到的问题核心是:当仅给option_add()传入配方的参数信息时,会覆盖掉模型本身的调参参数。要同时保留两者,需要将配方和模型的调参参数合并后再传入。
具体解决步骤
1. 定义带调参的配方和模型
先明确你的配方和模型规格:
# 带可调threshold参数的配方 rec_tuned <- recipe(price ~ feat_1) %>% step_novel(feat_1) %>% step_other(feat_1, threshold = tune()) %>% step_dummy(feat_1) # 带可调penalty和mixture参数的glmnet模型 spec_lin <- linear_reg(penalty = tune(), mixture = tune()) %>% set_engine('glmnet')
2. 分别提取并更新配方和模型的参数
单独提取配方和模型的参数对象,调整各自的搜索范围:
# 提取并更新配方的threshold参数范围 rec_params <- parameters(rec_tuned) %>% update(threshold = threshold(c(0.1, 0.2))) # 提取并更新模型的penalty和mixture参数范围 model_params <- parameters(spec_lin) %>% update( penalty = penalty(c(1e-4, 1e2)), # 可根据你的需求调整范围 mixture = mixture(c(0.01, 0.1)) )
3. 合并参数并传入workflow_set
将两个参数对象合并,再通过option_add()传入workflow_set,这样就能同时保留配方和模型的所有调参参数:
# 合并配方和模型的参数 combined_params <- c(rec_params, model_params) # 构建workflow_set并传入合并后的参数 recipes <- list(rec_tuned = rec_tuned) models <- list(spec_lin = spec_lin) wf_set <- workflow_set(recipes, models, cross = TRUE) %>% option_add(param_info = combined_params, id = "rec_tuned_spec_lin")
更简便的替代方法:从完整workflow提取参数
如果你只需要针对单个配方+模型组合调参,也可以先创建完整的workflow,再直接提取并更新整个workflow的参数,这样更不容易出错:
# 创建包含配方和模型的完整workflow wf <- workflow() %>% add_recipe(rec_tuned) %>% add_model(spec_lin) # 提取并更新整个workflow的所有调参参数 wf_params <- parameters(wf) %>% update( threshold = threshold(c(0.1, 0.2)), penalty = penalty(c(1e-4, 1e2)), mixture = mixture(c(0.01, 0.1)) ) # 如果需要构建workflow_set,可以基于这个wf来创建 wf_set <- workflow_set( preproc = list(rec_tuned = rec_tuned), models = list(spec_lin = spec_lin), cross = TRUE ) %>% option_add(param_info = wf_params, id = "rec_tuned_spec_lin")
验证参数是否完整
你可以用以下代码检查workflow_set中的参数是否都被保留:
extract_parameter_set_dials(wf_set, id = "rec_tuned_spec_lin")
输出应该同时包含threshold、penalty和mixture三个调参参数。
内容的提问来源于stack exchange,提问作者Ilproff_77
相关产品推荐
相关产品推荐

