使用auto_tuner函数进行多目标调优是否可行?遇报错求助
问题解答
mlr3的auto_tuner支持多指标调优,但你的代码写法有误,才触发了no applicable method for 'as_measure' applied to an object of class "list"错误。
错误原因
msrs(c("classif.tp", "classif.fn"))返回的是MeasureList类型(本质是列表),而默认的random_search是单目标调优器,无法直接处理多指标列表;同时auto_tuner的measure参数在单目标场景下要求传入单个Measure对象,而非列表。
解决方法
根据你的需求,分两种场景处理:
场景1:多目标调优(同时优化多个指标)
需要使用支持多目标的调优器,比如mlr3mbo包中的tnr("mbo"),注意先安装依赖包:
# 安装依赖包(如果未安装) install.packages("mlr3mbo") # 加载库 library(mlr3verse) library(mlr3mbo) # 构建学习器 lrn_classif <- as_learner(po("encode", method = "one-hot") %>>% lrn("classif.xgboost", nrounds = to_tune(100, 500), max_depth = to_tune(1, 10), gamma = to_tune(0, 10) ) ) # 多指标 measures <- msrs(c("classif.tp", "classif.fn")) # 使用支持多目标的调优器创建auto_tuner at <- auto_tuner( tuner = tnr("mbo", multi_objective = TRUE), learner = lrn_classif, resampling = rsmp("cv"), measure = measures, terminator = trm("evals", n_evals = 20) # 设置终止条件 )
场景2:将多指标组合为单个目标调优
如果不需要真正的多目标优化,可以将多个指标加权组合成一个复合指标:
library(mlr3verse) # 构建学习器 lrn_classif <- as_learner(po("encode", method = "one-hot") %>>% lrn("classif.xgboost", nrounds = to_tune(100, 500), max_depth = to_tune(1, 10), gamma = to_tune(0, 10) ) ) # 自定义复合指标:最大化tp,最小化fn,加权组合 combined_measure <- msr("classif.custom", fun = function(task, pred, ...) { tp <- pred$confusion[1,1] fn <- pred$confusion[2,1] # 自定义权重,目标最大化该值 return(0.7 * tp - 0.3 * fn) }, minimize = FALSE ) # 创建auto_tuner at <- auto_tuner( tuner = tnr("random_search"), learner = lrn_classif, resampling = rsmp("cv"), measure = combined_measure )
内容的提问来源于stack exchange,提问作者ChickenTartR
相关产品推荐
相关产品推荐

