如何在tidymodels框架中用tune_grid调优多隐藏层MLP模型?
在tidymodels中使用brulee调优多隐藏层MLP的超参数
要同时调优MLP的隐藏层数、各层单元数以及正则化系数penalty,需要自定义超参数的搜索空间,具体步骤如下:
1. 定义超参数搜索范围
由于brulee的mlp()中hidden_units支持向量输入(对应多隐藏层),你可以通过两种方式定义搜索空间:
方式一:动态生成随机组合
通过parameters()函数指定规则,自动生成2层或3层、单元数在指定区间内的组合:
# 定义超参数空间 mlp_params <- parameters( hidden_units = tune(id = "hidden_units", # 随机生成2/3层,每层单元数在10-50之间 fn = function(x) sample(10:50, size = sample(2:3, 1), replace = TRUE)), penalty = penalty(range = c(-4, 0)) # 对应1e-4到1e0的正则化系数 )
方式二:手动指定候选组合
如果需要更可控的测试组合,直接列出所有要尝试的层数+单元数搭配:
# 手动生成2层和3层的候选组合 grid_candidates <- expand.grid( hidden_units = list(c(10,20), c(20,30), c(30,40), c(10,20,30), c(20,30,40), c(30,40,50)), penalty = 10^seq(-4, 0, length.out = 5) )
2. 调整模型定义
将hidden_units和penalty都设为待调参数:
mlp_mod <- mlp(hidden_units = tune(), penalty = tune()) %>% set_engine("brulee", importance = "permutation") %>% set_mode("regression")
3. 创建工作流
结合预处理配方与模型:
mlp_wf <- workflow() %>% add_recipe(Sac_recipe) %>% add_model(mlp_mod)
4. 执行网格调优
用交叉验证配合tune_grid()完成调优:
# 设置10折分层交叉验证 set.seed(456) folds <- vfold_cv(Sac_train, v = 10, strata = price) # 执行调优(二选一:用动态参数空间或手动网格) tune_results <- tune_grid( object = mlp_wf, resamples = folds, param_info = mlp_params, # 用动态空间时选这个 # grid = grid_candidates, # 用手动网格时替换上面的param_info metrics = metric_set(rmse, rsq) # 指定回归任务的评估指标 )
5. 提取最优结果
查看并使用最优超参数组合:
# 查看排名前5的参数组合 show_best(tune_results, metric = "rmse") # 获取最优参数 best_params <- select_best(tune_results, metric = "rmse") # 拟合最终模型 final_wf <- mlp_wf %>% finalize_workflow(best_params) %>% fit(data = Sac_train) # 在测试集评估效果 final_wf %>% predict(Sac_test) %>% bind_cols(Sac_test %>% select(price)) %>% metrics(truth = price, estimate = .pred)
关键说明
- 调优多隐藏层时,
hidden_units的候选值必须是向量形式,每个向量对应一组“层数+各层单元数”的组合。 - 手动生成网格的方式适合明确测试目标场景,动态生成则能覆盖更广泛的参数空间。
内容的提问来源于stack exchange,提问作者Yang Yang
相关产品推荐
相关产品推荐

