使用多个时间序列作为训练数据的时间序列预测

数据挖掘 机器学习 深度学习 时间序列 预报 预测
2021-10-09 07:14:20

我试图预测一个节日开始两天后的总出席人数(即入场人数,也是购买的门票数量)也就是说,知道前两天有多少人参加了活动,如何预测参观节日的总人数?

我确实知道乍一看似乎很难,而且理论上我只能做出非常糟糕的预测,但事实是这样的:我过去组织了三十多个节日,并收集了每个节日的数据。具体来说,在这些节日中的每一个,我都有一个我知道的每日时间序列:

  • 每天购买的门票数量
  • 当天是工作日还是周末
  • 这一天是否是公共假期和学校假期
  • 每日天气

我观察到所有这些时间序列都遵循多种趋势例如,周六的出席人数总是最好的,而周二的情况则更糟……同样,在活动的最后几天来的人似乎总是比开始的时候多。几乎所有节日的这些趋势都是相同的。在分解时间序列时,我观察到接近的趋势和接近的季节性值。

另一件事,我想这不是好消息,是事件有不同的时间跨度:一些持续 4 天,其他 5、6、7 甚至 8 天。有的在星期一开始,有的在星期六开始。

所以我的问题是:我如何使用这些时间序列作为训练数据来尝试在知道第一天的出席人数的情况下预测活动的总出席人数也就是说,在知道我拥有所有这些数据的情况下,我可以使用哪种模型来预测活动的总出席人数?我当然在考虑机器学习(或深度学习),因为我有很多训练数据,但我不确定它是否可以在 R 或 Python 中轻松实现......

为了做预测,我当然知道,对于正在进行的节日,它会持续多长时间,是否会在公共假期和学校假期举行,是否会跨越一周-结束,我有每天的天气预报。

1个回答

首先对最相似的事件进行聚类。然后使用可比较的(或多个 then )来预测您没有历史数据的新事件的销售额。使用您拥有的所有其他信息作为回归量。这是在 R 中进行预测的代码。您将能够将不同的预测模型与此代码相结合:

choose_model<-function(x,h,reg,new_reg,end_train,start_test){
      library(forecast)
      library(forecastHybrid)
      library(tidyverse)


  #train data

  x_train <- window(x, end = end_train )

  x_test <- window(x, start = start_test)

  #train and test for regressors

  reg_train <- window(reg, end = end_train )

  reg_test <- window(reg, start = start_test) 

  h1=length(x_test)

  #model1

  stlf(x_train , method="arima",s.window= nrow(x_train),xreg = reg_train, newxreg = reg_test, h=h1)-> fc_stlf_xreg

  #model2
  auto.arima(x_train, stepwise = FALSE, approximation = FALSE,xreg=reg_train)%>%forecast(h=h1,xreg=reg_test) -> fc_arima_xreg

  #model3
  set.seed(12345)#for nnetar model
  nnetar(x_train, MaxNWts=nrow(x), xreg=reg_train)%>%forecast(h=h1, xreg=reg_test) -> fc_nnetar_xreg

  #model4
  stlf(x_train , method= "ets",s.window= 12, h=h1)-> fc_stlf_ets

  #Combination

  mod1 <- lm(x_test ~ 0 + fc_stlf_xreg$mean + fc_arima_xreg$mean + fc_nnetar_xreg$mean + fc_stlf_ets$mean)
  mod2 <- lm(x_test/I(sum(coef(mod1))) ~ 0 + fc_stlf_xreg$mean + fc_arima_xreg$mean + fc_nnetar_xreg$mean + fc_stlf_ets$mean)



  #model1

  stlf(x, method="arima",s.window= 12,xreg=reg, newxreg=new_reg, h=h)-> fc_stlf

  #model2
  auto.arima(x, stepwise = FALSE, approximation = FALSE,xreg=reg)%>%forecast(h=h,xreg=new_reg) -> fc_arima

  #model3
  set.seed(12345)#for nnetar model
  nnetar(x, MaxNWts=nrow(x), xreg=reg)%>%forecast(h=h, xreg=new_reg) -> fc_nnetar

  #model4
  stlf(x , method= "ets",s.window= 12, h=h)-> fc_stlf_e

  #Combination

  Combi <- (mod2$coefficients[[1]]*fc_stlf$mean + mod2$coefficients[[2]]*fc_arima$mean +
              mod2$coefficients[[3]]*fc_nnetar$mean + mod2$coefficients[[4]]*fc_stlf_e$mean)

  return(Combi)
}