tidymodels模型调优时,如何收集运行时间作为评估指标?
在tidymodels中收集tune_grid的模型拟合时间
官方内置方案:使用callback_timer()
tidymodels的tune包提供了内置的计时回调函数callback_timer(),可以直接在tune_grid()中启用,无需手动循环。
启用计时回调
在调用tune_grid()时,通过control_grid()传入callback_timer(),它会自动记录每个模型在交叉验证折上的拟合起止时间和耗时。提取并合并数据
调优完成后,用collect_timing()提取计时数据,再和collect_metrics()得到的评估指标(比如AUC)合并,就能直接分析参数空间中的性能-时间权衡。
代码示例:
library(tidymodels) data(cells, package = "modeldata") # 构建随机森林工作流 rf_spec <- rand_forest(mtry = tune(), trees = tune()) %>% set_engine("ranger") %>% set_mode("classification") rf_wf <- workflow() %>% add_formula(class ~ .) %>% add_model(rf_spec) # 定义调优网格 rf_grid <- grid_regular(mtry(range = c(1, 10)), trees(range = c(50, 200)), levels = 3) # 带计时的网格调优 set.seed(123) rf_tune <- tune_grid( rf_wf, resamples = vfold_cv(cells, v = 3), grid = rf_grid, metrics = metric_set(roc_auc), control = control_grid(callbacks = callback_timer()) ) # 合并性能指标与计时数据 combined_results <- collect_metrics(rf_tune) %>% left_join(collect_timing(rf_tune), by = c("id", "mtry", "trees")) # 查看平均AUC与平均耗时 combined_results %>% group_by(mtry, trees) %>% summarize( mean_auc = mean(.estimate), mean_elapsed = mean(elapsed) )
自定义回调(灵活扩展)
如果需要更定制化的计时逻辑(比如记录CPU时间、拆分拟合/预测阶段耗时),可以手动编写回调函数:
# 自定义计时回调 custom_timer_callback <- function() { callback( name = "custom_timer", # 记录训练开始时间 start_train = function(context) { context$train_start <- Sys.time() context }, # 记录训练结束时间,计算耗时并存入结果 end_train = function(context) { context$train_end <- Sys.time() context$elapsed_secs <- as.numeric(difftime(context$train_end, context$train_start, units = "secs")) context$results$.elapsed <- context$elapsed_secs context } ) } # 使用自定义回调运行调优 rf_tune_custom <- tune_grid( rf_wf, resamples = vfold_cv(cells, v = 3), grid = rf_grid, metrics = metric_set(roc_auc), control = control_grid(callbacks = custom_timer_callback()) ) # 提取数据 custom_results <- collect_metrics(rf_tune_custom) %>% mutate(elapsed = map_dbl(.metrics, ~ .x$.elapsed))
核心优势
- 完全贴合tidymodels工作流,避免手动循环的冗余和出错风险
- 计时数据与交叉验证的折、参数组合一一对应,便于精准分析
- 可以直接基于合并后的数据集绘制AUC-耗时散点图,快速定位收益递减区间
内容的提问来源于stack exchange,提问作者bokov
相关产品推荐
相关产品推荐

