如何在使用tidyverts生态的fable.prophet时实现超参数优化?
fable.prophet层级时间序列批量超参数调参方案
适配多分组、定期重复调参的需求,完全兼容fable生态的层级/嵌套时间序列预测与调和逻辑,无需切换其他框架。
实现步骤
1. 依赖准备
需要用到的核心包:tidyverse、tsibble、fable、fable.prophet、purrr、yardstick,并行优化可额外安装furrr。
2. 生成参数搜索网格
首先定义所有待测试的参数组合:
param_grid <- tidyr::expand_grid( season_type = c('additive', 'multiplicative'), changepoint_prior_scale = c(0.005, 0.05, 0.5, 5), changepoint_range = c(0.8, 0.9), growth = c('linear', 'logistic') )
3. 构建嵌套分组时间序列
将你的tsibble格式数据集按分组维度(国家、平台、产品等)嵌套:
# 替换cafe_tsibble为你的数据集,c(country, platform, product)替换为你的实际分组字段 nested_data <- cafe_tsibble %>% nest(.by = c(country, platform, product))
4. 封装单分组调参函数
函数内置时间序列的训练/验证拆分,避免随机拆分导致的时序泄露,可自定义验证集长度、评估指标:
tune_prophet <- function(ts_data, params, validation_window = 3) { # 按时序拆分训练集、验证集,validation_window为验证集的时间步长 train_len <- nrow(ts_data) - validation_window train_data <- ts_data[1:train_len, ] val_data <- ts_data[(train_len+1):nrow(ts_data), ] # 注入参数拟合模型 fit <- train_data %>% model( prophet = prophet( Turnover ~ season("year", 4, type = !!params$season_type) + growth(!!params$growth), changepoint.prior.scale = !!params$changepoint_prior_scale, changepoint.range = !!params$changepoint_range ) ) # 预测验证集并计算误差 fc <- fit %>% forecast(h = validation_window) acc <- fc %>% accuracy(val_data) # 返回当前参数组合对应的误差 return(params %>% mutate(mae = acc$.mae)) }
注:示例用MAE作为评估指标,可根据业务需求替换为RMSE、MAPE、MASE等。
5. 批量遍历所有分组和参数组合
用purrr实现全量调参,自动筛选每个分组的最优参数:
tune_results <- nested_data %>% mutate( # 单个分组跑所有参数组合的验证 param_scores = purrr::map(data, ~ purrr::pmap_dfr(param_grid, function(...) { current_params <- list(...) tune_prophet(.x, current_params) })), # 筛选单个分组下误差最小的最优参数 best_params = purrr::map(param_scores, ~ .x %>% arrange(mae) %>% slice(1)) )
6. 用最优参数批量拟合最终模型
拟合后的模型可直接对接fable的层级预测调和流程:
final_models <- tune_results %>% mutate( model = purrr::map2(data, best_params, function(ts_data, params) { ts_data %>% model( prophet = prophet( Turnover ~ season("year", 4, type = !!params$season_type) + growth(!!params$growth), changepoint.prior.scale = !!params$changepoint_prior_scale, changepoint.range = !!params$changepoint_range ) ) }) ) %>% unnest(model) %>% select(-data, -param_scores, -best_params)
效率优化提示
- 分组数量多、参数组合量大时,将
purrr替换为furrr的对应函数,开启多核并行可降低70%以上的运行时间 - 可将调参逻辑封装为脚本,定期运行时只需要输入新的数据集,无需修改核心逻辑
- 要求更高的调参稳定性时,可在调参函数中替换为滚动交叉验证,取多轮验证的平均误差作为评估标准
内容的提问来源于stack exchange,提问作者cube
相关产品推荐
相关产品推荐

