指数平滑的微调参数

问题描述

我是 tidymodelsmodeltime 包的新用户。我发现这些包对于拥有来自不同包的不同模型的相同界面非常有用。我尝试使用 forecast::ets 包中的指数平滑来微调时间序列。这是一个可重现的示例:

library(tidymodels)
library(modeltime)
library(tidyverse)
library(lubridate)

myTS <- c(600,500,225,50,1025,1000,950,6975,2400,1250,3500,3125,900,2900,600,2150,1800,750,1650,925,1075,4575,3725,1100,450,175,1275,1575,1500,4525,2000,1350,300,425,475,25,575,325,275,200,350,1175,250,400,650,425)

myDate <- seq(as_date("2016-06-01"),as_date("2021-05-01"),"months")
TabTS <- bind_cols(YearMonth=myDate,Sum_Qty_kg = myTS)
  
# Split Data 80/20
splits <- initial_time_split(TabTS,prop = 0.8)
data_train <- training(splits)
data_test <- testing(splits)

### Exponential Smoothing Holt-Winters ###

tune_ets <- exp_smoothing(
  error = "auto",trend = "auto",season = "auto",smooth_level = tune(),smooth_trend = tune(),smooth_seasonal = tune()
) %>%
  set_engine("ets")

grid_ets <- grid_regular(
  parameters(
    list(
      smooth_level = smooth_level(range = c(0.1,0.8)),smooth_trend = smooth_trend(range = c(0.1,smooth_seasonal = smooth_seasonal(range = c(0.1,0.8))
      #,error = error()
      #,trend = trend(values = c("additive","multiplicative"))
      #,season = season(values = c("additive","multiplicative"))
    )
  )
)

# Apply the functions to the inputs and models ----------------------------

ForecastModel_FineTune <- function(tune_model,grid_model,IsBoost = "N"){
  
  ### Step 2: Select parameters via Fine tuning ###
  
  # model_recipe <- recipe(Sum_Qty_kg ~ YearMonth,data = data_train) 
  if(IsBoost == "Y") model_recipe <- recipe(Sum_Qty_kg ~ YearMonth,data = data_train) %>% step_date(YearMonth,features = "month",ordinal = FALSE) %>% step_mutate(date_num = as.numeric(YearMonth)) else model_recipe <- recipe(Sum_Qty_kg ~ YearMonth,data = data_train)
  
  model_workflow <- workflow() %>%
    add_model(tune_model) %>%
    add_recipe(model_recipe)
  
  resampling_strategy <- data_train %>%
    time_series_cv(date_var = YearMonth,initial = floor(0.8*nrow(data_train)),assess = nrow(data_train) - floor(0.8*nrow(data_train))
                   #,skip = "3 months"
                   #,slice_limit  = 4
    )
  
  model_tune_results <- model_workflow %>%
    tune_grid(resamples = resampling_strategy,grid = grid_model,metrics = metric_set(rmse,mae)
    )
  
  best_model <- model_tune_results %>%
    select_best("rmse")
  
  ### Step 3: Finalizing the model ###
  
  model_final <- model_workflow %>%
    finalize_workflow(best_model) %>%
    fit(data_train) %>%
    modeltime_table()
  
  ### Step 4: Calibrate the model to a testing set
  
  calibration_model <- model_final %>%
    modeltime_calibrate(new_data = data_test)    
  
  ### Step 5: Testing Set Forecast & Accuracy Evaluation ###
  
  forecast_model <- calibration_model %>%
    modeltime_forecast(
      new_data    = data_test,actual_data = TabTS
    )
  return(list(model_tune_results = model_tune_results,forecast_model = forecast_model))
  
}

forecast_ets <- ForecastModel_FineTune(tune_ets,grid_ets)

运行此示例时,出现以下错误:

frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
x Slice1: preprocessor 1/1,model 4/27: Error in forecast::ets(outcome,model = model_ets,damped = damping_ets,: No model able to be fitted
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
x Slice1: preprocessor 1/1,model 7/27: Error in forecast::ets(outcome,: No model able to be fitted
frequency = 9.5 observations per 1 year
x Slice1: preprocessor 1/1,model 8/27: Error in forecast::ets(outcome,: No model able to be fitted
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
x Slice1: preprocessor 1/1,model 12/27: Error in forecast::ets(outcome,model 13/27: Error in forecast::ets(outcome,: No model able to be fitted
frequency = 9.5 observations per 1 year
frequency = 9.5 observations per 1 year
x Slice1: preprocessor 1/1,model 15/27: Error in forecast::ets(outcome,model 16/27: Error in forecast::ets(outcome,model 17/27: Error in forecast::ets(outcome,model 18/27: Error in forecast::ets(outcome,model 20/27: Error in forecast::ets(outcome,model 21/27: Error in forecast::ets(outcome,model 22/27: Error in forecast::ets(outcome,model 23/27: Error in forecast::ets(outcome,model 24/27: Error in forecast::ets(outcome,model 25/27: Error in forecast::ets(outcome,model 26/27: Error in forecast::ets(outcome,model 27/27: Error in forecast::ets(outcome,: No model able to be fitted
frequency = 12 observations per 1 year
Warning message:
In `[.tbl_df`(x,is.finite(x <- as.numeric(x))) :
  NAs introduced by coercion

似乎对于不同参数值的某些组合,没有模型能够拟合。这个问题是怎么来的?我尝试了另一个时间序列,但问题仍然存在。我怎样才能避免它?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...