MLR3中rpart超参数调优与下采样结合的实现问询
解决mlr3分支管道中rpart超参数调优与不平衡校正结合的参数错误
我看到你在尝试把rpart的超参数调优和不平衡数据的分支校正(上/下采样+无处理)结合起来时遇到了参数不可用的错误,这个问题的核心是GraphLearner中的组件参数需要带上对应的前缀,不能直接写cp或者minsplit。
问题根源
当你把学习器放入管道(Graph)再转为GraphLearner后,所有组件的参数都会被加上组件的标识前缀。比如你用的classif.rpart,它的参数会变成classif.rpart.cp、classif.rpart.minsplit,而不是单独的cp。你可以通过运行graph2$param_set$ids()来查看所有可用的参数名称,就能清楚看到这一点。
修正后的完整实现代码
# 加载所需包 library(paradox) library(mlr3) library(mlr3pipelines) library(mlr3tuning) # 设置rpart学习器 learner <- lrn("classif.rpart", predict_type = "prob") # 可先设置默认值,也可留空让调优器处理 learner$param_set$values <- list( cp = 0, maxdepth = 21, minbucket = 12, minsplit = 24 ) # 构建带分支的管道:缺失值处理 → 分支选择校正方法 → 合并分支 → rpart学习器 graph2 <- po("imputehist") %>>% po("branch", c("nop", "classbalancing_up", "classbalancing_down")) %>>% gunion(list( po("nop", id = "nop"), po("classbalancing", id = "classbalancing_up", adjust = "minor", reference = "minor", shuffle = FALSE), po("classbalancing", id = "classbalancing_down", adjust = "major", reference = "major", shuffle = FALSE) )) %>>% po("unbranch") %>>% learner # 转为GraphLearner并设置预测类型 graph2 <- GraphLearner$new(graph2) graph2$predict_type <- "prob" # 查看所有可用参数(可选,用来确认参数名称) # print(graph2$param_set$ids()) # 定义正确的参数搜索空间:注意rpart参数的前缀 ps <- ParamSet$new(list( # 分支选择:无处理/上采样/下采样 ParamFct$new("branch.selection", levels = c("nop", "classbalancing_up", "classbalancing_down")), # rpart的cp参数,前缀为classif.rpart. ParamDbl$new("classif.rpart.cp", lower = 0.001, upper = 0.1), # rpart的minsplit参数 ParamInt$new("classif.rpart.minsplit", lower = 1, upper = 10), # 可选:同时调优上/下采样的ratio参数,实现端到端优化 ParamDbl$new("classbalancing_up.ratio", lower = 1, upper = 5), ParamDbl$new("classbalancing_down.ratio", lower = 0.1, upper = 1) )) # 设置验证策略 hld <- rsmp("holdout") set.seed(123) hld$instantiate(tsk("sonar")) # 创建调优实例(使用单准则调优类) instance <- TuningInstanceSingleCrit$new( task = tsk("sonar"), learner = graph2, resampling = hld, measure = msr("classif.auc"), param_set = ps, terminator = term("evals", n_evals = 20) # 用有限迭代次数终止,避免无限运行 ) # 使用网格搜索调优(示例用resolution=2,实际可根据需求调大) tuner <- tnr("grid_search", resolution = 2) set.seed(321) tuner$tune(instance) # 查看最优结果 instance$result
关键要点说明
- 参数命名规则:GraphLearner中每个组件的参数都以
组件ID.参数名的形式存在。如果给学习器设置了自定义ID(比如learner$id <- "my_tree"),那参数就会变成my_tree.cp。 - 端到端优化:代码中额外加入了上/下采样的
ratio参数调优,这样可以同时优化不平衡校正的强度和rpart的模型参数,得到更适配任务的组合。 - 终止器选择:避免使用
term("none"),否则调优会无限运行,建议用term("evals")指定迭代次数,或者term("time")指定时间限制。
内容的提问来源于stack exchange,提问作者snowkeep
相关产品推荐
相关产品推荐

