使用神经网络、auto.arima 和 ets 进行 R 时间序列预测

机器算法验证 r 神经网络 预测 有马 指数平滑
2022-03-11 08:16:26

我听说过一些关于使用神经网络来预测时间序列的信息。

我如何比较哪种方法更好地预测我的时间序列(每日零售数据):auto.arima(x)、ets(x) 或 nnetar(x)。

我可以通过 AIC 或 BIC 将 auto.arima 与 ets 进行比较。但是我如何将它们与神经网络进行比较?

例如:

   > dput(x)
 c(1774, 1706, 1288, 1276, 2350, 1821, 1712, 1654, 1680, 1451, 
 1275, 2140, 1747, 1749, 1770, 1797, 1485, 1299, 2330, 1822, 1627, 
 1847, 1797, 1452, 1328, 2363, 1998, 1864, 2088, 2084, 594, 884, 
 1968, 1858, 1640, 1823, 1938, 1490, 1312, 2312, 1937, 1617, 1643, 
 1468, 1381, 1276, 2228, 1756, 1465, 1716, 1601, 1340, 1192, 2231, 
 1768, 1623, 1444, 1575, 1375, 1267, 2475, 1630, 1505, 1810, 1601, 
 1123, 1324, 2245, 1844, 1613, 1710, 1546, 1290, 1366, 2427, 1783, 
 1588, 1505, 1398, 1226, 1321, 2299, 1047, 1735, 1633, 1508, 1323, 
 1317, 2323, 1826, 1615, 1750, 1572, 1273, 1365, 2373, 2074, 1809, 
 1889, 1521, 1314, 1512, 2462, 1836, 1750, 1808, 1585, 1387, 1428, 
 2176, 1732, 1752, 1665, 1425, 1028, 1194, 2159, 1840, 1684, 1711, 
 1653, 1360, 1422, 2328, 1798, 1723, 1827, 1499, 1289, 1476, 2219, 
 1824, 1606, 1627, 1459, 1324, 1354, 2150, 1728, 1743, 1697, 1511, 
 1285, 1426, 2076, 1792, 1519, 1478, 1191, 1122, 1241, 2105, 1818, 
 1599, 1663, 1319, 1219, 1452, 2091, 1771, 1710, 2000, 1518, 1479, 
 1586, 1848, 2113, 1648, 1542, 1220, 1299, 1452, 2290, 1944, 1701, 
 1709, 1462, 1312, 1365, 2326, 1971, 1709, 1700, 1687, 1493, 1523, 
 2382, 1938, 1658, 1713, 1525, 1413, 1363, 2349, 1923, 1726, 1862, 
 1686, 1534, 1280, 2233, 1733, 1520, 1537, 1569, 1367, 1129, 2024, 
 1645, 1510, 1469, 1533, 1281, 1212, 2099, 1769, 1684, 1842, 1654, 
 1369, 1353, 2415, 1948, 1841, 1928, 1790, 1547, 1465, 2260, 1895, 
 1700, 1838, 1614, 1528, 1268, 2192, 1705, 1494, 1697, 1588, 1324, 
 1193, 2049, 1672, 1801, 1487, 1319, 1289, 1302, 2316, 1945, 1771, 
 2027, 2053, 1639, 1372, 2198, 1692, 1546, 1809, 1787, 1360, 1182, 
 2157, 1690, 1494, 1731, 1633, 1299, 1291, 2164, 1667, 1535, 1822, 
 1813, 1510, 1396, 2308, 2110, 2128, 2316, 2249, 1789, 1886, 2463, 
 2257, 2212, 2608, 2284, 2034, 1996, 2686, 2459, 2340, 2383, 2507, 
 2304, 2740, 1869, 654, 1068, 1720, 1904, 1666, 1877, 2100, 504, 
 1482, 1686, 1707, 1306, 1417, 2135, 1787, 1675, 1934, 1931, 1456)

使用 auto.arima:

y=auto.arima(x)
plot(forecast(y,h=30))
points(1:length(x),fitted(y),type="l",col="green")

在此处输入图像描述

> summary(y)
Series: x 
ARIMA(5,1,5)                    

Coefficients:
         ar1      ar2     ar3      ar4      ar5      ma1     ma2      ma3     ma4      ma5
      0.2560  -1.0056  0.0716  -0.5516  -0.4822  -0.9584  1.2627  -1.0745  0.8545  -0.2819
s.e.  0.1014   0.0778  0.1296   0.0859   0.0844   0.1184  0.1322   0.1289  0.1388   0.0903

sigma^2 estimated as 58026:  log likelihood=-2191.97
AIC=4405.95   AICc=4406.81   BIC=4447.3

Training set error measures:
                   ME     RMSE      MAE       MPE     MAPE      MASE
Training set 1.457729 240.5059 173.9242 -2.312207 11.62531 0.6157512

使用 ets:

fit <- ets(x)
plot(forecast(fit,h=30))
points(1:length(x),fitted(fit),type="l",col="red")

在此处输入图像描述

 > summary(fit)
 ETS(M,N,N) 

 Call:
  ets(y = x) 

   Smoothing parameters:
     alpha = 0.0449 

   Initial states:
     l = 1689.128 

   sigma:  0.2094

      AIC     AICc      BIC 
 5570.373 5570.411 5577.897 

 Training set error measures:
                    ME     RMSE      MAE      MPE     MAPE      MASE
 Training set 7.842061 359.3611 276.4327 -4.81967 17.98136 0.9786665

在这种情况下,auto.arima 比 ets 更适合。

让我们尝试唱神经网络:

 library(caret)
 fit <- nnetar(x)
 plot(forecast(fit,h=60))
 points(1:length(x),fitted(fit),type="l",col="green")

在此处输入图像描述

从图中,我可以看到,神经网络模型非常适合,但我如何将它与 auto.arima/ets 进行比较?如何计算 AIC?

另一个问题是,如果可能的话,如何为神经网络添加置信区间,就像为 auto.arima/ets 自动添加一样?

4个回答

样本内拟合并不是样本外预测准确性的可靠指南。预测准确性测量的黄金标准是使用保持样本。从训练样本中删除最后 30 天,将模型拟合到其余数据,使用拟合模型预测保留样本,并使用平均绝对偏差 (MAD) 或加权平均绝对百分比误差简单地比较保留样本的准确性(wMAPE)。

这是一个使用 R 的例子。我使用的是 M3 比赛的第 2000 个系列,它已经分为训练系列M3[[2000]]$x和测试数据M3[[2000]]$xx这是月度数据。最后两行输出两个模型预测的 wMAPE,我们在这里看到 ARIMA 模型(wMAPE 18.6%)优于自动拟合的 ETS 模型(32.4%):

library(forecast)
library(Mcomp)

M3[[2000]]

ets.model <- ets(M3[[2000]]$x)
    arima.model <- auto.arima(M3[[2000]]$x)

ets.forecast <- forecast(ets.model,M3[[2000]]$h)$mean
arima.forecast <- forecast(arima.model,M3[[2000]]$h)$mean

sum(abs(ets.forecast-M3[[2000]]$xx))/sum(M3[[2000]]$xx)
sum(abs(arima.forecast-M3[[2000]]$xx))/sum(M3[[2000]]$xx)

此外,在指数 280-300 附近似乎有异常高的销售。这可能是圣诞节销售吗?如果您了解此类日历事件,最好将这些事件作为解释变量提供给您的预测模型,这将在圣诞节到来时为您提供更好的预测。您可以在 ARIMA(X) 和 NN 中轻松做到这一点,而在 ETS 中则不那么容易。

最后,我推荐这本关于预测的教科书:http: //otexts.com/fpp/

上面斯蒂芬的建议是一个很好的建议。我要补充一点,使用 AIC 绝对是模型中进行选择的一种有效方式——但不是其中的一种。即,您可以(并且应该!)使用信息标准来选择哪些 ARIMA 模型、哪些指数平滑模型等,然后使用样本外预测(MASE、MAPE 等)比较您的最佳候选者。 )。

http://robjhyndman.com/hyndsight/aic/

观看 Rob 教授的视频 https://www.youtube.com/watch?v=1Lh1HlBUf8k

在视频中,Rob 教授教授了准确度函数以及样本准确度和样本外准确度之间的差异。

即:假设 80-90% 的数据,拟合模型,预测。然后使用 10% 的预测数据检查准确度(因为我们有您 10% 数据的实际值,我们可以检查模型的样本外准确度)

以及参考otext中的在线教科书

与其他提到的一样,当我们比较模型与模型时,我们使用 accuracy() 与测试集进行比较。然后你可以有各种误差测量,如 MAE、MSE、RMSE ...等,用于比较模型与模型

而不是给 NN 模型命名 fit 使用 fit_nn。同样,fit_arima 和 fit_ets。这样您就可以比较所有模型。

library(caret)
#ets
fit_ets <- ets(x)
#ANN
fit_nn <- nnetar(x)
plot(forecast(fit,h=60))
points(1:length(x),fitted(fit_nn),type="l",col="green")
library(forecast)
accuracy(fit_nn)
accuracy(fit_ets)

现在,您可以使用 ME、MAE 或任何您想要的东西来比较这两个模型。