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
相关产品推荐
相关产品推荐

