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

如何在使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:00:02