tidymodels调优中手动测试不同模型公式的实现与合理性
关于tidymodels测试不同模型公式性能的问题解答
1. 能否用tidymodels实现该需求?
可以实现,核心是把公式/特征组合作为调优参数传入workflow,而非直接在recipe中使用tune("formula")。以下是两种场景的可行方案:
场景1:仅测试不同公式(无额外预处理)
直接利用workflow的公式接口,将公式设为调优项:
library(tidymodels) # 模拟示例数据 set.seed(123) data <- tibble( y = rnorm(100), x1 = rnorm(100), x1_codingB = ifelse(x1 > 0, 1, 0), x2 = rnorm(100) ) # 定义交叉验证折 data_cv <- vfold_cv(data, v = 5) # 初始化线性模型 lm_model <- linear_reg() %>% set_engine("lm") # 构建带可调优公式的workflow lm_workflow <- workflow() %>% add_model(lm_model) %>% add_formula(tune("formula")) # 定义包含目标公式的调优网格 tuning_grid <- grid_latin_hypercube( formula(c(y ~ x1, y ~ x1_codingB, y ~ x1 + x2)), size = 3 ) # 运行调优并收集结果 lm_tune <- tune_grid( lm_workflow, resamples = data_cv, grid = tuning_grid, metrics = metric_set(rmse) ) # 查看各公式的性能表现 collect_metrics(lm_tune)
场景2:结合预处理测试不同编码方式
如果需要在预处理阶段生成不同编码特征,再测试对应公式,可以用step_select配合调优参数选择目标特征组合:
# 构建包含编码逻辑的recipe rec <- recipe(y ~ ., data = data) %>% # 生成不同编码的特征 step_mutate( x1_codingB = ifelse(x1 > 0, 1, 0), x1_codingC = cut(x1, breaks = 3) ) %>% # 将特征选择设为调优项 step_select(tune("features")) # 绑定模型与recipe的workflow wf <- workflow() %>% add_recipe(rec) %>% add_model(lm_model) # 定义不同特征组合的调优网格 grid <- expand.grid( features = list( y ~ x1, y ~ x1_codingB, y ~ x1_codingC, y ~ x1 + x2 ) ) # 运行调优 tune_result <- tune_grid( wf, resamples = data_cv, grid = grid, metrics = metric_set(rmse) )
2. 这种实现思路是否合理?
这种思路完全合理,甚至在特定场景下更具优势:
- 目标明确:当你聚焦于验证特定特征、编码方式的性能差异时,手动指定候选组合能精准控制变量,避免自动特征选择带来的随机性或无关干扰。
- 可解释性强:测试结果直接对应你关心的变量方案,便于后续分析和结论推导。
- 效率更高:无需浪费算力在无关特征的筛选上,针对性测试能更快得到有效结论。
内容的提问来源于stack exchange,提问作者user2503795
相关产品推荐
相关产品推荐

