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


10

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

如何比较哪种预测时间序列(每日零售数据)的方法更好: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自动添加一样。

Answers:


14

样本内拟合不是样本外预测准确性的可靠指南。预测准确性测量的金标准是使用保留样本。从训练样本中删除最后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的方法,那么我会选择最好的方法。
Jurgita 2014年

我不能每次手动查找意甲,我应该编写一个程序,该程序将找到最佳模型并应用它
Jurgita 2014年

是否可以在auto.arima预测模型中添加解释变量(圣诞节)?还是只有在与Arima合作时才有可能?
Jurgita 2014年

1
您可以在系列中编写一个循环,并查看哪种方法为每个系列提供最佳的wMAPE。如果一种方法明显胜过其他方法,请对所有系列均使用该方法。否则,请考虑每个系列使用不同的方法。AIC不会为您提供多个系列的帮助!或者,甚至更好的是,寻找专用的软件来预测大量的每日零售时间序列,同时还要考虑价格变化等因素。这就是我的生计,我很乐意让您与我们的销售人员联系;-)但是,我也很乐意在这里为您提供帮助!
Stephan Kolassa 2014年

对于auto.arima(),请使用xreg参数。请参阅?auto.arima
Stephan Kolassa 2014年

4

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

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


1

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

在视频中,Rob教授讲授了精度功能以及样本精度与样本外精度之间的差异。

即:假设您的数据占80-90%,则拟合模型并进行预测。然后使用10%的预测数据检查准确性(由于我们拥有10%数据的实际值,因此我们可以检查模型的样本外准确性)

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

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


0

与其给名称适合神经网络模型的名称,不如使用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或任何您想要的模型比较两种模型。


我不得不读过几次才能明白你的意思。尽管变量的命名是良好的编码习惯,但并不是答案的中心。答案的主要部分位于最后一行(使用MAE等)。如果您可以突出显示(或什至更好地扩展),那将对此有所改善。
mkt-恢复莫妮卡

使用功能精度(模型)时,它会提供某些统计信息,例如ME,MAE,RMSE,MPE等。您可以使用它们中的任何一个或全部来比较两个或多个模型。举例来说,在所有模型中,RMSE(均方根误差)最小的模型被认为是最佳模型。
Komal Batool19年

知道这很有帮助。但是我的观点是,尽管代码肯定可以阐明问题和答案,但是这不是一个有关编码的网站。因此,如果您强调实质性问题,您的答案会更好。
mkt-恢复莫妮卡

问题是如何将ANN与ARIMA之类的统计模型进行比较(因为这些模型是使用AIC值进行比较的),而答案是使用其他统计值(如MAE或RMSE),这些值可以通过precision()函数获得。没有混淆的地方。
Komal Batool19年
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.