Previsione di serie temporali R con rete neurale, auto.arima ed ets


10

Ho sentito parlare dell'uso delle reti neurali per prevedere le serie temporali.

Come posso confrontare, quale metodo per prevedere le mie serie temporali (dati al dettaglio giornalieri) è migliore: auto.arima (x), ets (x) o nnetar (x).

Posso confrontare auto.arima con ets di AIC o BIC. Ma come posso confrontarli con le reti neurali?

Per esempio:

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

Utilizzando auto.arima:

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

inserisci qui la descrizione dell'immagine

> 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

Usando ets:

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

inserisci qui la descrizione dell'immagine

 > 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

In questo caso auto.arima si adatta meglio di ets.

Proviamo a cantare la rete neurale:

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

inserisci qui la descrizione dell'immagine

Dal grafico, posso vedere, che il modello di rete neurale si adatta abbastanza bene, ma come posso confrontarlo con auto.arima / ets? Come posso calcolare AIC?

Un'altra domanda è: come aggiungere l'intervallo di confidenza per la rete neurale, se possibile, come se fosse aggiunto automaticamente per auto.arima / ets.?

Risposte:


14

Gli adattamenti nel campione non sono una guida affidabile per l'accuratezza delle previsioni al di fuori del campione. Il gold standard nella misurazione dell'accuratezza delle previsioni è l'uso di un campione di controllo. Rimuovi gli ultimi 30 giorni dal campione di addestramento, adatta i tuoi modelli al resto dei dati, usa i modelli montati per prevedere il campione di controllo e confronta semplicemente le accuratezze del controllo, utilizzando le deviazioni assolute medie (MAD) o gli errori percentuali assolute medie ponderate (wMAPEs).

Ecco un esempio usando R. Sto usando la 2000a serie della competizione M3, che è già divisa in serie di allenamento M3[[2000]]$xe dati di test M3[[2000]]$xx. Questi sono dati mensili. Le ultime due righe producono il wMAPE delle previsioni dei due modelli e vediamo qui che il modello ARIMA (wMAPE 18,6%) supera il modello ETS montato automaticamente (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)

Inoltre, sembra che ci siano vendite insolitamente alte vicino agli indici 280-300. Potrebbero essere le vendite di Natale? Se sei a conoscenza di eventi del calendario come questi, sarebbe meglio alimentare quelli al tuo modello di previsione come variabili esplicative, che ti daranno una previsione migliore la prossima volta che il Natale rotolerà. Puoi farlo facilmente in ARIMA (X) e NN, non così facilmente in ETS.

Infine, consiglio questo libro di testo sulle previsioni: http://otexts.com/fpp/


Grazie per la risposta. I tuoi suggerimenti sono molto validi, ma sfortunatamente non sono adatti a me. Ho molte serie storiche, con periodi diversi e ho bisogno di fare previsioni per loro, quindi sto cercando un modello semplice e migliore. Ho pensato che se potessi confrontare i metodi con AIC, sceglierei il migliore.
Jurgita,

Non posso cercare manualmente ogni serie di volte, dovrei scrivere un programma, che troverebbe il modello migliore e lo applichi
Jurgita

è possibile aggiungere variabili esplicative (giorni di Natale) al modello di previsione di auto.arima? O è possibile solo quando si lavora con arima?
Jurgita,

1
Puoi scrivere un ciclo sopra le tue serie e vedere quale metodo fornisce il miglior wMAPE per ogni serie. Se un metodo supera chiaramente gli altri, utilizzalo per tutte le serie. Altrimenti, pensa a usare metodi diversi per serie. AIC non ti aiuterà con più serie! O, ancora meglio, cercare un software dedicato per la previsione di un gran numero di serie temporali al dettaglio giornaliere che tenga conto anche di variazioni dei prezzi, ecc. Questo è ciò che faccio per vivere, ti metterò felicemente in contatto con i nostri venditori ;-) Ma sarò anche felice di aiutarti qui!
Stephan Kolassa,

Per auto.arima(), utilizzare il xregparametro Vedere ?auto.arima.
Stephan Kolassa,

4

Il suggerimento di Stephan sopra è buono. Vorrei aggiungere che l'uso di AIC è sicuramente un modo valido per scegliere all'interno dei modelli, ma non tra questi. Cioè, puoi (e dovresti!) Utilizzare i criteri di informazione per scegliere quali modelli ARIMA, quali modelli di livellamento esponenziale, ecc., E quindi confrontare i tuoi migliori candidati usando una previsione fuori campione (MASE, MAPE, ecc. ).

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


1

Guarda questo video del Prof Rob https://www.youtube.com/watch?v=1Lh1HlBUf8k

Nel video, il Prof Rob ha insegnato riguardo alla funzione di precisione e alle differenze tra accuratezza del campione e accuratezza del campione.

vale a dire: supponiamo che l'80-90% dei tuoi dati, si adatti a un modello, previsioni. Quindi controlla l'accuratezza utilizzando i dati previsti con il 10% (poiché abbiamo il valore effettivo dei tuoi dati del 10%, possiamo verificare l'accuratezza del campione fuori modello)

Così come fare riferimento al libro di testo online in otext

Come altri citati, quando si confrontano modelli vs modelli, si usa la precisione () per confrontare con il set di test. Quindi puoi avere varie misure di errore come MAE, MSE, RMSE ... ecc. Che vengono utilizzate per confrontare i modelli rispetto ai modelli


0

Invece di dare il nome adatto al modello NN usa fit_nn. Allo stesso modo, fit_arima e fit_ets. in modo da poter confrontare tutti i modelli.

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)

ora, puoi confrontare entrambi i modelli usando ME, MAE o quello che vuoi.


Ho dovuto leggerlo un paio di volte per ottenere il tuo punto. Mentre la denominazione delle variabili è una buona pratica di codifica, non è fondamentale per la risposta. La parte principale della tua risposta è nella riga finale (usando MAE, ecc.). Se potessi evidenziarlo (o anche meglio, espandere), ciò migliorerebbe.
mkt - Ripristina Monica il

quando si utilizza la precisione della funzione (modello), vengono fornite alcune statistiche come ME, MAE, RMSE, MPE e così via. È possibile utilizzare uno di essi o tutti per confrontare due o più modelli. Ad esempio, il modello con almeno RMSE (Root Mean Square Error) è considerato il modello migliore tra tutti.
Komal Batool,

È utile sapere. Ma il mio punto è che questo non è un sito sulla codifica, anche se il codice può certamente illuminare domande e risposte. E quindi la tua risposta sarebbe migliore se hai evidenziato il problema sostanziale .
mkt - Ripristina Monica il

La domanda era: come si può confrontare ANN con modelli statistici come ARIMA (poiché questi modelli vengono confrontati usando i loro valori AIC) e la risposta sta usando altri valori statistici come MAE o RMSE che possono essere ottenuti con la funzione accuratezza (). Non c'è alcun punto di confusione in esso.
Komal Batool,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.