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

为何rpart调参的minsplit与minbucket参数为小数?

问题:classif.rpart调参时minbucket与minsplit出现小数的原因

使用classif.rpart学习器构建嵌套重采样训练的模型,调用mlr3tuning::extract_inner_tuning_results(bmr)查看内部调参结果时,发现代表观测样本数量的minbucket和minsplit参数出现了小数(如0.13、2.81等),但这两个参数理应是整数,特此询问原因。

复现代码

library(mlr3)
library(progressr)

# 选择任务
sonar <- tsk("sonar")

# 选择学习器
l_rpart <- lrn("classif.rpart")
l_ranger <- lrn("classif.ranger")

# 添加搜索空间到学习器
l_rpart$param_set$values <- lts("classif.rpart.default")$values
l_ranger$param_set$values <- lts("classif.ranger.default")$values

# 添加 fallback 学习器
l_rpart$fallback = lrn("classif.featureless")
l_ranger$fallback = lrn("classif.featureless")

# 构建鲁棒化管道
rpart_graph <- mlr3pipelines::pipeline_robustify(task = sonar, learner = l_rpart) %>% mlr3pipelines::po("learner", l_rpart)
rpart_learner <- mlr3::as_learner(rpart_graph)

ranger_graph <- mlr3pipelines::pipeline_robustify(task = sonar, learner = l_ranger) %>% mlr3pipelines::po("learner", l_ranger)
ranger_learner <- mlr3::as_learner(ranger_graph)

# 创建自动调参器
at_rpart <- mlr3tuning::auto_tuner(
  method = mlr3verse::tnr("random_search"),
  learner = rpart_learner,
  resampling = mlr3::rsmp("cv", folds = 4),
  measure = mlr3::msr("classif.acc", id = "acc"),
  term_time =  1 * 60,
  term_evals = 4)

at_ranger <- mlr3tuning::auto_tuner(
  method = mlr3verse::tnr("random_search"),
  learner = ranger_learner,
  resampling = mlr3::rsmp("cv", folds = 4),
  measure = mlr3::msr("classif.acc", id = "acc"),
  term_time =  1 * 60,
  term_evals = 4)

# 创建基准测试设计
design = benchmark_grid(tasks = sonar,
                        learners = list(at_rpart, at_ranger),
                        resamplings = mlr3::rsmp("cv", folds = 3))

# 运行基准测试实验
bmr = with_progress(benchmark(design, 
                              store_models = TRUE))

# 查看内部调参结果
mlr3tuning::extract_inner_tuning_results(bmr)

输出结果示例

mlr3tuning::extract_inner_tuning_results(bmr)
   experiment iteration classif.rpart.minsplit classif.rpart.minbucket classif.rpart.cp classif.ranger.mtry.ratio classif.ranger.replace
1:          1         1               2.834898               2.9295168        -9.089721                        NA                     NA
2:          1         2               4.515618               0.5116199        -3.805193                        NA                     NA
3:          1         3               3.484092               2.6164599        -3.131506                        NA                     NA
4:          2         1                     NA                      NA               NA                 0.2700584                  FALSE
5:          2         2                     NA                      NA               NA                 0.1032228                   TRUE
6:          2         3                     NA                      NA               NA                 0.3427129                  FALSE

原因解析
  • 参数搜索空间类型定义:lts("classif.rpart.default")加载的默认调参空间中,minbucket和minsplit被标记为**数值型(numeric)**参数,而非整数型(integer)。因此使用random_search进行调参时,会生成小数取值。
  • mlr3参数约束逻辑:mlr3的调参器完全按照参数空间的定义进行采样,只要参数没有设置integer约束,就会按连续数值处理,进而产生小数。
  • 实际训练的自动修正:虽然调参结果显示小数,但rpart包在实际训练时会自动将这些小数向下取整为整数,不会影响模型的正常运行。

解决办法

若希望调参时仅生成整数取值,可手动修改参数搜索空间,将minbucket和minsplit设置为整数型:

# 手动定义整数型参数搜索空间
l_rpart$param_set$values = list(
  minsplit = p_int(lower = 1, upper = 20),  # 可根据需求调整上下限
  minbucket = p_int(lower = 1, upper = 10),
  cp = p_dbl(lower = 1e-04, upper = 1)
)

修改后,随机搜索将只会生成符合要求的整数值,匹配参数代表样本数量的属性。


内容的提问来源于stack exchange,提问作者Theresa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:40:59