You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mlr基准实验中提取独立调优模型并单独预测的方法问询

嘿,这个问题我熟!在mlr里跑带调优包装器的基准实验后,要提取每个独立的调优模型(每个对应一组超参数),其实只要理清基准结果的结构,再配合调优包装器的内置方法就能搞定,我给你一套可复现的流程,一步一步来:

核心前提

首先要记住:调优包装器默认不会保存所有候选模型,所以必须在创建调优控制对象时设置save.models = TRUE,不然只能拿到超参数和性能数据,拿不到模型本身。

可复现代码示例

1. 加载必要包

library(mlr)
library(data.table) # 处理结果数据结构更顺手

2. 准备实验组件

我们用经典的iris数据集做分类任务,同时用随机森林和SVM两个带调优的学习器做基准对比:

# 创建分类任务
task <- makeClassifTask(data = iris, target = "Species")

# --- 定义带调优的随机森林学习器 ---
lrn_rf <- makeLearner("classif.randomForest", predict.type = "prob")
# 设置超参数搜索空间
ps_rf <- makeParamSet(
  makeIntegerParam("ntree", lower = 50, upper = 200),
  makeIntegerParam("nodesize", lower = 1, upper = 10)
)
# 创建调优包装器,关键要加save.models=TRUE
tuner_rf <- makeTuneWrapper(
  learner = lrn_rf,
  resampling = makeResampleDesc("CV", iters = 3),
  par.set = ps_rf,
  control = makeTuneControlRandom(maxit = 5, save.models = TRUE), # 保存所有候选模型
  measure = acc
)

# --- 定义带调优的SVM学习器 ---
lrn_svm <- makeLearner("classif.svm", predict.type = "prob")
ps_svm <- makeParamSet(
  makeNumericParam("cost", lower = 0.1, upper = 10),
  makeNumericParam("gamma", lower = 0.01, upper = 1)
)
tuner_svm <- makeTuneWrapper(
  learner = lrn_svm,
  resampling = makeResampleDesc("CV", iters = 3),
  par.set = ps_svm,
  control = makeTuneControlRandom(maxit = 5, save.models = TRUE),
  measure = acc
)

3. 运行基准实验

bmr <- benchmark(
  learners = list(tuner_rf, tuner_svm),
  tasks = task,
  resampling = makeResampleDesc("Holdout"),
  measures = acc,
  show.info = FALSE
)
提取每个独立调优模型

基准实验的结果bmr是一个嵌套结构,我们需要逐层拆解,拿到每个调优过程中生成的候选模型:

# 提取任务对应的实验结果(这里只有iris一个任务)
task_results <- bmr$results[[1]]

# 遍历每个带调优包装器的学习器
for (learner_id in names(task_results)) {
  cat("=== 处理学习器:", learner_id, "===\n")
  
  # 从调优包装器中获取调优结果对象
  tune_res <- getTuneResult(task_results[[learner_id]]$learner.model)
  
  # tune_res$models 就是所有候选模型的列表,每个元素对应一组超参数
  candidate_models <- tune_res$models
  # tune_res$opt.path 包含了每个模型的超参数、性能等元数据,和models一一对应
  model_metadata <- tune_res$opt.path
  
  # 遍历每个候选模型,单独访问、使用或保存
  for (idx in seq_along(candidate_models)) {
    current_model <- candidate_models[[idx]]
    current_params <- model_metadata[idx, ]$par.vals
    
    cat("\n模型", idx, "的超参数组合:", toString(current_params), "\n")
    
    # 示例:用这个模型做预测
    sample_pred <- predict(current_model, task = task, subset = 1:5)
    cat("前5个样本的预测结果:\n")
    print(sample_pred$data)
    
    # 如果你要持久化保存模型,可以用saveRDS
    # saveRDS(current_model, paste0("tuned_model_", learner_id, "_", idx, ".rds"))
  }
  cat("\n")
}
关键注意事项
  • save.models = TRUE是核心:如果没加这个参数,tune_res$models会是空的,只能拿到超参数和性能数据,拿不到模型本身。
  • 模型与元数据的对应性:tune_res$models的顺序和tune_res$opt.path的行顺序完全一致,你可以用元数据筛选出性能最好的模型,或者按超参数分组。
  • 单独使用模型:提取出来的每个current_model都是独立的学习器模型,直接调用predict()就能用,没有冗余的其他模型数据。

内容的提问来源于stack exchange,提问作者opening-the-black-box

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:17:36