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

tidymodels贝叶斯优化XGBoost调参 定义参数范围报错求助

tidymodels XGBoost贝叶斯调参range报错排查

报错核心原因

触发报错是两处写法不符合tidymodels参数定义规则:

  • 参数名不匹配:模型规格里定义的待调参数是sample_size = tune(),但参数集里写的是sample_prop(),二者是parsnip包中不同的参数:sample_size代表采样的绝对样本数,sample_prop代表采样比例,参数类型不对应。
  • range传值格式错误:parameters()函数中每个参数的range入参只接受长度为2的数值向量,分别对应搜索范围的下界、上界,不需要传入带步长的完整序列。你传入的seq()生成长度大于2的向量,函数无法识别哪个是上界哪个是下界,就会触发对应报错。
  • 额外注意:贝叶斯优化是基于代理模型动态选取参数组合,不需要像网格搜索那样提前切分好所有待遍历的参数点,只需要给上下界即可。

修正后代码

set.seed(123)
splitting <- initial_split(datafix, strata = Y)
data.training <- training(splitting)
data.testing <- testing(splitting)


xgboost_recipe <- recipe(formula = Y ~ ., data = data.training) %>% 
  step_novel(all_nominal(), -all_outcomes()) %>%
  step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>% 
  step_zv(all_predictors()) 

xgboost_spec <- 
  boost_tree(trees = tune(), min_n = tune(), tree_depth = tune(), learn_rate = tune(), 
    loss_reduction = tune(), sample_size = tune(), mtry = tune()) %>% 
  set_mode("regression") %>% 
  set_engine("xgboost") 

# 修正参数集定义:range仅传上下界,匹配参数名
params_set <- parameters(
  trees(range = c(100, 2000)),
  min_n(range = c(10, 40)),
  tree_depth(range = c(6, 10)),
  learn_rate(range = c(0.1, 1)),
  loss_reduction(range = c(0.1, 1)),
  # 若要使用比例采样,请先把上方xgboost_spec里的sample_size = tune()替换为sample_prop = tune(),再改用下方注释的写法
  # sample_prop(range = c(0.1, 1)),
  sample_size(range = c(floor(nrow(data.training)*0.1), nrow(data.training))),
  finalize(mtry(range = c(1, unknown())), data.training)
)

补充说明

如果后续需要做网格搜索,不要把完整序列塞到range参数里,要调用grid_regular()、grid_random()这类网格生成函数,基于你定义的参数集生成对应步长的参数网格即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:39:19