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