如何基于多指标从workflow_set(tidymodels)中筛选多个最优模型
你需要的workflowsets包中多模型排序筛选的核心函数是rank_results(),结合tidyverse的筛选函数即可实现你的需求,操作步骤如下:
1. 核心功能实现
按单指标筛选Top2模型
直接调用rank_results(),指定你要排序的核心指标,设置select_best = TRUE会自动取每个工作流的最优参数结果排序:
library(tidyverse) library(workflowsets) # 示例按召回率(recall)排序,可替换为你需要的sensitivity、specificity等指标 ranked_models <- rank_results( grid_results, rank_metric = "recall", # 指定排序依据的指标 select_best = TRUE # 每个工作流仅保留最优参数的结果 ) # 取排名前2的模型 top2_models <- slice_head(ranked_models, n = 2)
返回结果的wflow_id列对应你定义的不同不平衡处理方法:unba(无处理)、b_sm(SMOTE)、b_ro(ROSE)、b_up(上采样)、b_ad(ADASYN),rank列即为整体排名。
按不平衡处理维度筛选
如果要单独看某一种不平衡处理方法的最优参数,用extract_workflow_set_result()提取对应工作流的结果即可:
# 示例提取SMOTE处理的最优参数,metric替换为你需要的指标 smote_best_param <- grid_results %>% extract_workflow_set_result("b_sm") %>% # 传入对应不平衡处理的wflow_id select_best(metric = "recall")
按多指标综合筛选Top2
如果需要结合多个指标计算综合得分排序,先汇总所有指标结果自定义计算规则即可:
# 汇总所有工作流的最优参数指标 all_metrics <- collect_metrics(grid_results, summarize = TRUE) %>% group_by(wflow_id, .metric) %>% slice_max(mean, n = 1) %>% ungroup() %>% pivot_wider(names_from = .metric, values_from = mean) # 示例:自定义权重计算综合得分,召回率占60%,精确率占40%,可自行调整指标和权重 all_metrics <- all_metrics %>% mutate(composite_score = recall * 0.6 + precision * 0.4) %>% arrange(desc(composite_score)) # 取综合得分Top2的模型 top2_composite <- slice_head(all_metrics, n = 2)
2. 注意事项
你提供的代码中rec_obj_all_up的配方定义存在笔误:recipe(clas ~ .)应改为recipe(class ~ .),否则会报错找不到响应变量。
内容的提问来源于stack exchange,提问作者Joselina Davyt-Colo
相关产品推荐
相关产品推荐

