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

