Prognozowanie szeregów czasowych R za pomocą sieci neuronowej, auto.arima i ets

10

Słyszałem trochę o używaniu sieci neuronowych do prognozowania szeregów czasowych.

Jak mogę porównać, która metoda prognozowania moich szeregów czasowych (dziennych danych detalicznych) jest lepsza: auto.arima (x), ets (x) lub nnetar (x).

Mogę porównać auto.arima z ets przez AIC lub BIC. Ale jak mogę je porównać z sieciami neuronowymi?

Na przykład:

   > 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)

Korzystanie z auto.arima:

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

wprowadź opis zdjęcia tutaj

> 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

Za pomocą ets:

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

wprowadź opis zdjęcia tutaj

 > 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

W tym przypadku auto.arima pasuje lepiej niż ets.

Spróbujmy zaśpiewać sieć neuronową:

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

wprowadź opis zdjęcia tutaj

Widzę z wykresu, że model sieci neuronowej pasuje całkiem dobrze, ale jak mogę go porównać z auto.arima / ets? Jak mogę obliczyć AIC?

Innym pytaniem jest, jak dodać przedział ufności dla sieci neuronowej, jeśli jest to możliwe, tak jak jest dodawany automatycznie dla auto.arima / ets.?

Jurgita
źródło

Odpowiedzi:

14

Dopasowania w próbie nie są wiarygodnym przewodnikiem po dokładności prognozowania poza próbą. Złotym standardem w pomiarze dokładności prognozowania jest użycie próbki wstrzymania. Usuń ostatnie 30 dni z próbki treningowej, dopasuj swoje modele do reszty danych, użyj dopasowanych modeli do prognozowania próby wstrzymania i po prostu porównaj dokładności dla wstrzymania, używając średnich odchyleń bezwzględnych (MAD) lub ważonych średnich błędów bezwzględnych procentowych (wMAPEs).

Oto przykład z użyciem R. Korzystam z 2000. serii zawodów M3, która jest już podzielona na serię treningową M3[[2000]]$xi dane testowe M3[[2000]]$xx. To są dane miesięczne. Ostatnie dwa wiersze generują wMAPE prognoz z dwóch modeli i widzimy tutaj, że model ARIMA (wMAPE 18,6%) przewyższa automatycznie dopasowany model 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)

Ponadto wygląda na to, że sprzedaż jest rażąco wysoka w pobliżu indeksów 280–300. Czy to może być świąteczna wyprzedaż? Jeśli wiesz o takich wydarzeniach w kalendarzu, najlepiej byłoby podać je do modelu prognostycznego jako zmienne objaśniające, które zapewnią lepszą prognozę podczas następnych świąt Bożego Narodzenia. Możesz to zrobić łatwo w ARIMA (X) i NN, a nie tak łatwo w ETS.

Na koniec polecam ten podręcznik dotyczący prognozowania: http://otexts.com/fpp/

Stephan Kolassa
źródło
Dziękuję za Twoją odpowiedź. Twoje sugestie są bardzo dobre, ale niestety nie pasują do mnie. Mam wiele szeregów czasowych z różnymi okresami i muszę dla nich prognozować, dlatego szukam prostego i najlepszego modelu. Pomyślałem, że jeśli mogę porównać metody AIC, wybiorę najlepszą.
Jurgita
Nie mogę szukać każdej serii ręcznie, powinienem napisać program, który znalazłby najlepszy model i zastosowałby go
Jurgita,
czy można dodać zmienne objaśniające (dni świąteczne) do modelu prognozowania auto.arima? Czy jest to możliwe tylko podczas pracy z arima?
Jurgita
1
Możesz napisać pętlę nad serią i sprawdzić, która metoda daje najlepszy wMAPE dla każdej serii. Jeśli jedna metoda wyraźnie przewyższa inne, użyj jej dla wszystkich serii. W przeciwnym razie pomyśl o użyciu różnych metod dla serii. AIC nie pomoże ci z wieloma seriami! Lub, jeszcze lepiej, poszukaj dedykowanego oprogramowania do prognozowania dużej liczby dziennych szeregów czasowych sprzedaży detalicznej, które również uwzględniają zmiany cen itp. Tak zarabiam na życie, chętnie skontaktuję cię z naszymi sprzedawcami ;-) Ale chętnie Ci tu pomogę!
Stephan Kolassa
Dla auto.arima()użyj xregparametru. Zobaczyć ?auto.arima.
Stephan Kolassa
4

Powyższa sugestia Stephana jest dobra. Dodałbym, że użycie AIC jest zdecydowanie prawidłowym sposobem wyboru w modelach - ale nie wśród nich. Tj. Możesz (i powinieneś!) Użyć kryteriów informacyjnych, aby wybrać modele ARIMA, które modele wygładzania wykładniczego itp., A następnie porównać swoich najlepszych kandydatów, korzystając z prognozowania próbek (MASE, MAPE itp.) ).

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

Stephen C.
źródło
1

Obejrzyj ten film autorstwa Prof Roba https://www.youtube.com/watch?v=1Lh1HlBUf8k

Na filmie prof. Rob uczył o funkcji dokładności i różnicach między dokładnością próbki a dokładnością poza próbą.

tj .: biorąc powiedzmy 80-90% twoich danych, dopasuj model, prognozuj. Następnie sprawdź dokładność przy użyciu prognozowanych danych z 10% (ponieważ mamy rzeczywistą wartość twoich 10% danych, możemy sprawdzić dokładność modelu poza próbą)

Jak również zapoznaj się z podręcznikiem online w otext

Podobnie jak inne wspomniane, porównując modele z modelami, używamy dokładności () do porównania z zestawem testowym. Następnie możesz mieć różne miary błędów, takie jak MAE, MSE, RMSE ... itp., Które są używane do porównywania modeli z modelami

Zupa miso
źródło
0

Zamiast nadawać nazwę dopasowaniu do modelu NN, użyj fit_nn. Podobnie fit_arima i fit_ets. dzięki czemu można porównać wszystkie modele.

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)

teraz możesz porównać oba modele za pomocą ME, MAE lub cokolwiek chcesz.

Komal Batool
źródło
Musiałem to przeczytać kilka razy, aby zdobyć punkt. Chociaż nazywanie zmiennych jest dobrą praktyką kodowania, nie jest kluczowe dla odpowiedzi. Główna część twojej odpowiedzi znajduje się w ostatnim wierszu (używając MAE itp.). Jeśli możesz to podkreślić (lub jeszcze lepiej, rozwinąć), poprawiłoby to.
mkt - Przywróć Monikę
kiedy używasz dokładności funkcji (modelu), daje pewne statystyki, takie jak ME, MAE, RMSE, MPE i tak dalej. Możesz użyć dowolnego z nich lub wszystkich, aby porównać dwa lub więcej modeli. Powiedzmy na przykład, że model z najmniejszym RMSE (Root Mean Square Error) jest uważany za najlepszy model spośród wszystkich.
Komal Batool
Warto wiedzieć. Chodzi mi jednak o to, że nie jest to strona poświęcona kodowaniu, mimo że kod z pewnością może wyjaśnić pytania i odpowiedzi. Tak więc Twoja odpowiedź byłaby lepsza, gdybyś podkreślił istotną kwestię.
mkt - Przywróć Monikę
Pytanie dotyczyło sposobu, w jaki ANN można porównać z modelami statystycznymi, takimi jak ARIMA (ponieważ modele te są porównywane przy użyciu ich wartości AIC), a odpowiedzią są inne wartości statystyczne, takie jak MAE lub RMSE, które można uzyskać za pomocą funkcji dokładności (). Nie ma w tym żadnego zamieszania.
Komal Batool,