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

