如何在tidymodels中将虚拟模型/启发式规则指定为模型?
在tidymodels/workflowsets中整合启发式规则基准模型
要在tidymodels生态里把启发式规则和ML模型统一对比,核心是把规则包装成符合parsnip接口的“模型”,这样就能无缝接入workflowset流程。以下是具体实现步骤:
1. 加载依赖包
library(tidymodels) library(workflowsets) library(tibble)
2. 准备示例数据
set.seed(123) # 模拟符合启发式规则的二分类数据 data <- tibble( x1 = rnorm(100, mean = 3), x2 = rnorm(100, mean = 1), y = factor(ifelse((x1 > 3)|(x2 < 1), "yes", "no"), levels = c("no", "yes")) )
3. 定义启发式规则模型
通过parsnip自定义一个无需训练的模型,核心是实现fit(空操作)和predict(应用规则)两个函数:
# 创建自定义模型规格 heuristic_spec <- parsnip::new_model_spec( "heuristic_rule", args = list(), eng_args = list(), mode = "classification" ) %>% # 绑定自定义引擎逻辑 parsnip::set_engine( "function", # 拟合阶段无需训练,直接返回规则标识 fit = function(x, y) { list(rule = "(x1 > 3) | (x2 < 1)") }, # 预测阶段应用规则生成结果 predict = function(object, new_data) { pred <- factor( ifelse((new_data$x1 > 3) | (new_data$x2 < 1), "yes", "no"), levels = c("no", "yes") # 必须与原数据因子水平一致 ) tibble(.pred_class = pred) } )
4. 定义对比用的ML模型
# 逻辑回归 log_reg_spec <- logistic_reg() %>% set_engine("glm") %>% set_mode("classification") # 随机森林 rf_spec <- rand_forest(mtry = 2, trees = 100) %>% set_engine("ranger") %>% set_mode("classification")
5. 构建workflowset并拟合
# 整合所有模型到工作流集合 wf_set <- workflow_set( preproc = list(basic = recipe(y ~ x1 + x2, data = data)), models = list( heuristic = heuristic_spec, logistic_reg = log_reg_spec, random_forest = rf_spec ), cross = TRUE ) # 批量拟合所有模型 wf_fit <- wf_set %>% workflow_map("fit", data = data)
6. 统一评估对比
用yardstick的指标统一计算所有模型的表现:
# 提取并整理评估指标 metrics_summary <- wf_fit %>% collect_metrics(summarize = FALSE) %>% filter(.metric %in% c("accuracy", "roc_auc")) %>% select(wflow_id, .metric, .estimate) %>% pivot_wider(names_from = .metric, values_from = .estimate) print(metrics_summary)
这样就能把启发式规则和ML模型放在同一框架下对比,所有流程完全遵循tidymodels的范式,无需额外的特殊处理。
内容的提问来源于stack exchange,提问作者Gordon McDonald
相关产品推荐
相关产品推荐

