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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:27:41