如何更新tidymodels工作流集以移除RMSE相同的参数配置
移除tidymodels中拟合结果重复的超参数组合
问题解答
1. 是否可以更新workflow set/tibble以删除部分配置?
可以。Workflow set本质是tibble结构,你可以提取其中的调优结果,筛选出需要保留的配置后,替换原workflow set中的result列,或者重新构造符合格式的对象。
2. 是否存在函数可提取仅对应独特拟合结果的参数?stacks::add_candidates()似乎具备此功能,但我不确定其输出能否转换回workflow set/tibble?
stacks::add_candidates()确实会自动移除预测结果重复的候选模型,但它的输出是data_stack专用对象,无法直接转回workflow set。不过可以借助它的筛选结果,或者手动基于拟合指标/预测结果去重,再将筛选后的参数整合回workflow set。
具体实现方法
方法一:手动基于拟合指标去重
从调优结果中提取性能指标,按指标均值分组,每组保留一个超参数配置(示例中保留每组任意一个),再更新workflow set:
library(tidymodels) library(dplyr) # 从tune_results中提取具体调优结果 tune_res <- tune_results$result[[1]] # 提取性能指标并去重:按rmse和rsq的均值分组,保留每组唯一配置 unique_metrics <- tune_res %>% collect_metrics() %>% filter(.metric %in% c("rmse", "rsq")) %>% pivot_wider(names_from = .metric, values_from = mean) %>% distinct(rmse, rsq, .keep_all = TRUE) %>% select(penalty) # 筛选调优结果中符合条件的配置 filtered_tune_res <- tune_res %>% filter(penalty %in% unique_metrics$penalty) # 更新原workflow set的result列 tune_results_clean <- tune_results %>% mutate(result = list(filtered_tune_res)) # 查看清理后的结果 tune_results_clean$result[[1]] %>% collect_metrics()
方法二:借助stacks的筛选结果
利用stacks自动去重后的候选参数,反向筛选原调优结果:
library(stacks) # 创建stack并获取去重后的候选模型信息 data_stack <- stacks() %>% add_candidates(tune_results) # 提取保留的penalty参数值 kept_penalties <- data_stack$candidates %>% filter(model == "lasso_lasso") %>% select(penalty) %>% distinct() # 筛选原调优结果 filtered_tune_res <- tune_results$result[[1]] %>% filter(penalty %in% kept_penalties$penalty) # 更新workflow set tune_results_clean <- tune_results %>% mutate(result = list(filtered_tune_res))
补充说明
- 手动去重时,若需要更严格的判定(比如所有交叉验证折叠的预测结果完全一致),可以基于预测值的哈希值或者直接对比预测结果来分组去重。
- 借助
stacks的方法更便捷,适合后续需要进行模型堆叠的场景,它的去重逻辑是基于预测结果的一致性,比单纯的指标均值去重更精准。
内容的提问来源于stack exchange,提问作者Matifou
相关产品推荐
相关产品推荐

