用机器学习预测几个时期

机器算法验证 机器学习 时间序列 预测 有马
2022-03-12 05:51:10

我最近回顾了我的时间序列知识,并意识到机器学习大多只提供领先一步的预测。

对于提前一步的预测,我的意思是预测,例如,如果我们有每小时数据,则使用上午 10 点的数据预测上午 11 点和上午 11 点的 12 点等。

在此处输入图像描述

机器学习方法能否产生提前 h 步的预测?使用 h-step-ahead 预测,我的意思是,例如,假设每小时数据,我们使用上午 10 点的数据进行 7-step-ahead 预测,以获得 11、12、13、14、15、16、17 的估计值时钟。

示例图片:在此处输入图像描述

与我的主要问题有关,我想知道:

  • 我没有看到有人使用机器学习进行超前预测的原因是什么?
  • 如果有使用机器学习的方法,它比 ARIMA 更精确还是更不精确?
3个回答

(部分摘自我之前的一篇文章 首先你需要区分执行多步时间序列预测的两种不同方式:递归预测和直接预测:

  • 在递归预测(也称为迭代预测)中,您只训练模型进行一步预测。训练完成后,您递归地应用最终模型来预测提前 1 步、提前 2 步等......直到达到所需n步骤预测范围。为此,您将每个连续步骤的预测反馈到模型中以生成下一步。这种方法被 ARIMA 和指数平滑算法等传统预测算法使用,也可用于基于机器学习的预测(参见这篇文章的例子,这篇文章的一些讨论)。
  • 直接预测是当你为每个步骤训练一个单独的模型时(所以你试图“直接”预测nth领先而不是达到n递归步骤。Ben Taied等人。讨论直接预测和更复杂的组合方法。

现在回答你的主要问题:

机器学习方法能否产生提前 h 步的预测?

是的,ML 方法可以,并且它们可以使用递归和直接多步预测产生提前 h 步预测。不仅如此,对于直接多步预测,它们实际上比 ARIMA 或指数平滑等传统模型更适合该任务。但是请注意,对于直接多步预测,您需要事先指定要预测的 h 步并相应地训练您的模型,而对于递归预测,您可以将模型用于您想要的任意数量的未来步骤.

此外, Chevillon & Hendry认为,在某些情况下,直接多步预测比递归预测更准确——这意味着 ML 将比传统方法更准确。

对于您的其他问题:

  • 我没有看到有人使用机器学习进行超前预测的原因是什么?

许多人使用 ML 进行多步预测,尤其是使用神经网络:R Forecast 包中提供的 Hyndman 的 nnetar 方法、Kourentzes 的 nnfor R 包、亚马逊的 DeepAR 模型等等。

XGBoost 也已成功用于一些 Kaggle 时间序列比赛。

参见Bontempi等人。进行一般性讨论。

  • 如果有使用机器学习的方法,它比 ARIMA 更精确还是更不精确?

这是一个悬而未决的问题,显然取决于预测的数据和应用程序。

在过去的几个月里,我一直在使用时间序列进行异常检测,我可以与您分享我的经验。

我一直在使用的时间序列的特点是两个季节性(每天和每周),在白天没有趋势和许多高峰。

我做了几个实验,然后我选择了一个基于 LSTM 神经网络的模型,因为在我的情况下它的性能优于 arima,但当然作为统计学中的一切,没有通用的解决方案。

使用神经网络预测未来多个时间步长非常简单,您需要输出 N 个值而不是一个,并且将 N 个输出与真实的 N 个观察值进行比较。

根据我的经验,我可以告诉你,通过使用低 N(比如 1),该模型将严格使用过去的几个时间步来预测新的时间步,而不会真正“学习”季节性。另一方面,通过增加 N too mutch,可以学习季节性,但整体准确性会降低。

出于分析的目的,我发现 N = 4(未来 2 小时)是一个很好的折衷方案。

为了更笼统地回答您的问题,可以使用机器学习并预测 h-steps-ahead 预测棘手的部分是您必须将数据重塑为您拥有的矩阵,对于每个观察,观察的实际值和定义范围内时间序列的过去值。实际上,您将需要手动定义与预测时间序列相关的数据范围,就像您将参数化 ARIMA 模型一样。矩阵的宽度/水平对于正确预测矩阵采用的下一个值至关重要。如果您的视野受到限制,您可能会错过季节性影响。

完成此操作后,要预测 h-steps-ahead,您将需要根据上次观察预测第一个下一个值。然后,您必须将预测存储为“实际值”,这将用于通过时移预测第二个下一个值,就像 ARIMA 模型一样。您将不得不迭代该过程 h 次以提前完成 h 步。每次迭代都将依赖于先前的预测。

以下是使用 R 代码的示例。

library(forecast)
library(randomForest)

# create a daily pattern with random variations
myts <- ts(rep(c(5,6,7,8,11,13,14,15,16,15,14,17,13,12,15,13,12,12,11,10,9,8,7,6), 10)*runif(120,0.8,1.2), freq = 24)
myts_forecast <- forecast(myts, h = 24) # predict the time-series using ets + stl techniques
pred1 <- c(myts, myts_forecast1$mean) # store the prediction

# transform these observations into a matrix with the last 24 past values
idx <- c(1:24)
designmat <- data.frame(lapply(idx, function(x) myts[x:(215+x)])) # create a design matrix
colnames(designmat) <- c(paste0("x_",as.character(c(1:23))),"y")

# create a random forest model and predict iteratively each value
rfModel <- randomForest(y ~., designmat)
for (i in 1:24){
  designvec <- data.frame(c(designmat[nrow(designmat), 2:24], 0))
  colnames(designvec) <- colnames(designmat)
  designvec$y <- predict(rfModel, designvec)
  designmat <- rbind(designmat, designvec)
}
pred2 <- designmat$y

#plot to compare predictions
plot(pred1, type = "l")
lines(y = pred2[216:240], x = c(240:264), col = 2)

现在显然,没有通用规则来确定时间序列模型或机器学习模型是否更有效。机器学习模型的计算时间可能会更长,但另一方面,您可以包含任何类型的附加特征来使用它们来预测您的时间序列(例如,不仅仅是数字或逻辑特征)。一般建议是测试两者,并选择最有效的模型。