如何从Tidymodels的Recipes中提取预处理变量
提取recipes预处理步骤中的转换变量并对比两组差异
提取单个预处理流程的步骤变量
prep后的recipe对象包含了所有预处理步骤的执行信息,有两种便捷方法提取各步骤处理的变量:
- 使用
tidy()函数(tidymodels生态配套工具,无需额外安装),它会统一返回各步骤的变量信息:
# 假设prep后的recipe对象名为prepped_rec step_details <- tidy(prepped_rec)
返回的数据框中:
terms列:该步骤处理的变量名称type列:预处理步骤的类型(如center、scale、dummy等)id列:步骤的唯一标识ID
如果只想查看某一步的信息,指定number参数即可:
# 查看第3个预处理步骤的变量 step3_vars <- tidy(prepped_rec, number = 3)
- 直接访问recipe对象的
steps元素:
每个预处理步骤都是prepped_rec$steps列表中的一个元素,可直接提取其中的变量字段(不同步骤的字段名称可能为terms或columns):
# 提取第一个步骤处理的变量 first_step_vars <- prepped_rec$steps[[1]]$terms # 部分步骤(如step_select)使用columns字段 select_step_vars <- prepped_rec$steps[[2]]$columns
对比两组预处理的变量差异
先分别提取两组prepped recipe的步骤信息,再通过数据合并和分组筛选找到差异:
- 整理两组的步骤数据:
# 假设两组prepped后的对象为prepped_rec1(组1)、prepped_rec2(组2) rec1_steps <- tidy(prepped_rec1) %>% mutate(group = "组1") rec2_steps <- tidy(prepped_rec2) %>% mutate(group = "组2") combined_steps <- dplyr::bind_rows(rec1_steps, rec2_steps)
- 筛选仅在一组中被处理的变量:
# 找出两组处理范围不同的变量 diff_terms <- combined_steps %>% dplyr::group_by(type, terms) %>% dplyr::filter(dplyr::n_distinct(group) == 1) %>% dplyr::ungroup()
- 按步骤对比两组的处理差异:
如果想查看同一类型步骤下,两组处理的变量差异,可以按步骤ID和类型分组汇总:
step_level_diff <- combined_steps %>% dplyr::group_by(id, type) %>% dplyr::summarise( group1_terms = ifelse("组1" %in% group, paste(terms, collapse = ", "), NA), group2_terms = ifelse("组2" %in% group, paste(terms, collapse = ", "), NA) ) %>% dplyr::filter(group1_terms != group2_terms | is.na(group1_terms) | is.na(group2_terms))
补充:查看生成的新变量
对于会生成新变量的步骤(如step_dummy()、step_pca()),可以通过以下方式查看最终变量列表,辅助对比:
# 查看组1预处理后的所有变量 names(juice(prepped_rec1)) # 查看变量的详细信息(包括来源步骤) prepped_rec1$var_info
内容的提问来源于stack exchange,提问作者Francisco Cardozo
相关产品推荐
相关产品推荐

