通过机器学习预测几个时期


9

我最近回顾了自己的时间序列知识,并意识到机器学习通常只会提前一步。

有了一步一步的预测,我的意思是进行预测,例如,如果我们有每小时的数据,请使用上午10点到上午11点的数据进行预测,而上午12点则使用12点的数据进行预测等等。

在此处输入图片说明

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

图片示例: 在此处输入图片说明

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

  • 我没有看到任何人使用机器学习进行h提前预测的原因是什么?
  • 如果有一种使用机器学习的方法,它是否比ARIMA更为精确?

Answers:


7

(部分内容来自我的上一篇文章 首先,您需要区分执行多步时间序列预测的两种不同方法:递归预测和直接预测:

  • 在递归预测(也称为迭代预测)中,您只对模型进行了提前一步的训练。训练完成后,您可以递归应用最终模型来预测提前1步,提前2步等,直到达到所需的步预测范围。为此,您需要将每个连续步骤的预测反馈回模型,以生成下一步。这种方法是通过传统的预测算法,如ARIMA和指数平滑算法中使用,也可以用于基于机器学习的预测(见这个职位的一个例子,这个帖子的一些讨论)。ñ
  • 直接预测是指您针对每个步骤训练一个单独的模型(因此,您试图“直接”预测第步骤,而不是递归到达步骤。有关直接预测的讨论,请参见Ben Taied 等人。更复杂的组合方法。ñŤHñ

现在回答您的主要问题:

机器学习方法能否产生超前预测?

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

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

对于您的其他问题:

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

许多人正在使用ML进行多步预测,尤其是使用神经网络工具:R Forecast程序包中可用的Hyndman的nnetar方法,Kourentzes的nnfor R程序包,Amazon的DeepAR模型等。

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

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

  • 如果有一种使用机器学习的方法,它是否比ARIMA更为精确?

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


1

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

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

我做了几次实验,然后选择了一个基于LSTM神经网络的模型,因为在我的情况下,它的性能优于有理,但当然,就统计数据而言,还没有通用的解决方案。

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

根据我的经验,我可以告诉您,通过使用低N(例如1),该模型将严格使用过去很少的时间步长来预测新值,而无需真正地“学习”季节性。另一方面,通过增加N太高,可以了解季节性,但总体准确性会下降。

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


1

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

完成此操作后,要预测h步长,您将需要根据上一次观察来预测第一个下一个值。然后,您必须将预测存储为“实际值”,该值将用于通过时移预测第二个下一个值,就像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)

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


尽管您可能想提一下,您所说的时移实际上是标准Arima所做的事情。这就是为什么Arima-Predictions趋向于非常线性的原因。
5

对,就是这样。我将编辑答案以阐明这一步骤。
AshOfFire

1
在时间序列模型中,您还可以包括其他功能。

正确,使用ARIMAX,但它们必须是数字,并且添加的系数不能像ARMA中使用的系数那样容易地解释。
AshOfFire
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.