Prévision de séries chronologiques R avec réseau de neurones, auto.arima et ets

10

J'ai un peu entendu parler de l'utilisation des réseaux de neurones pour prévoir les séries chronologiques.

Comment puis-je comparer la meilleure méthode de prévision de mes séries chronologiques (données quotidiennes sur la vente au détail): auto.arima (x), ets (x) ou nnetar (x).

Je peux comparer auto.arima avec ets par AIC ou BIC. Mais comment les comparer aux réseaux de neurones?

Par exemple:

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

Utilisation de auto.arima:

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

entrez la description de l'image ici

> 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

Utilisation de ets:

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

entrez la description de l'image ici

 > 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

Dans ce cas, auto.arima s'adapte mieux que ets.

Essayons de chanter le réseau neuronal:

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

entrez la description de l'image ici

D'après le graphique, je peux voir que ce modèle de réseau de neurones correspond assez bien, mais comment le comparer avec auto.arima / ets? Comment puis-je calculer l'AIC?

Une autre question est de savoir comment ajouter un intervalle de confiance pour le réseau de neurones, si cela est possible, comme il est ajouté automatiquement pour auto.arima / ets.?

Jurgita
la source

Réponses:

14

Les ajustements dans l'échantillon ne sont pas un guide fiable pour la précision des prévisions hors échantillon. L'étalon-or dans la mesure de la précision des prévisions est d'utiliser un échantillon de résistance. Supprimez les 30 derniers jours de l'échantillon d'apprentissage, ajustez vos modèles au reste des données, utilisez les modèles ajustés pour prévoir l'échantillon d'exclusion et comparez simplement les précisions sur l'exactitude, en utilisant les écarts absolus moyens (MAD) ou les erreurs de pourcentage absolu moyen pondéré (wMAPEs).

Voici un exemple utilisant R. J'utilise la 2000e série de la compétition M3, qui est déjà divisée en séries d'entraînement M3[[2000]]$xet données de test M3[[2000]]$xx. Ce sont des données mensuelles. Les deux dernières lignes produisent le wMAPE des prévisions des deux modèles, et nous voyons ici que le modèle ARIMA (wMAPE 18,6%) surpasse le modèle ETS ajusté automatiquement (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)

De plus, il semble qu'il y ait des ventes anormalement élevées près des indices 280-300. Serait-ce des ventes de Noël? Si vous connaissez des événements de calendrier comme ceux-ci, il serait préférable de les alimenter dans votre modèle de prévision en tant que variables explicatives, ce qui vous donnera de meilleures prévisions la prochaine fois que Noël se déroulera. Vous pouvez le faire facilement dans ARIMA (X) et NN, pas si facilement dans ETS.

Enfin, je recommande ce manuel sur les prévisions: http://otexts.com/fpp/

Stephan Kolassa
la source
Merci pour la réponse. Vos suggestions sont très bonnes, mais malheureusement elles ne me conviennent pas. J'ai beaucoup de séries chronologiques, avec des périodes différentes et j'ai besoin de faire des prévisions pour elles, donc je cherche un modèle simple et meilleur. Je pensais que si je pouvais comparer les méthodes par AIC, je choisirais la meilleure.
Jurgita
Je ne peux pas chercher chaque série manuellement chaque fois, je devrais écrire un programme qui trouverait le meilleur modèle et l'appliquer
Jurgita
est-il possible d'ajouter des variables explicatives (jours de Noël) au modèle de prévision auto.arima? Ou cela n'est possible qu'en travaillant avec arima?
Jurgita
1
Vous pouvez écrire une boucle sur votre série et regarder quelle méthode donne le meilleur wMAPE pour chaque série. Si une méthode surpasse clairement les autres, utilisez-la pour toutes les séries. Sinon, pensez à utiliser différentes méthodes par série. AIC ne vous aidera pas avec plusieurs séries! Ou, mieux encore, recherchez un logiciel dédié pour prévoir un grand nombre de séries chronologiques quotidiennes de vente au détail qui prend également en compte des changements de prix, etc. C'est ce que je fais dans la vie, je me ferai un plaisir de vous mettre en contact avec nos vendeurs ;-) Mais je serai également heureux de vous aider ici!
Stephan Kolassa
Pour auto.arima(), utilisez le xregparamètre. Tu vois ?auto.arima.
Stephan Kolassa
4

La suggestion de Stephan ci-dessus est bonne. J'ajouterais que l'utilisation de l'AIC est certainement un moyen valable de choisir parmi les modèles - mais pas parmi eux. C'est-à-dire que vous pouvez (et devriez!) Utiliser des critères d'information pour choisir quel (s) modèle (s) ARIMA, quel (s) modèle (s) de lissage exponentiel, etc., puis comparer vos meilleurs candidats en utilisant la prédiction hors échantillon (MASE, MAPE, etc. ).

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

Stephen C
la source
1

Regardez cette vidéo du Prof Rob https://www.youtube.com/watch?v=1Lh1HlBUf8k

Dans la vidéo, le professeur Rob a enseigné la fonction de précision et les différences entre la précision de l'échantillon et la précision hors échantillon.

c'est-à-dire: en prenant par exemple 80 à 90% de vos données, ajustez un modèle, prévoyez. Ensuite, vérifiez l'exactitude en utilisant les données prévues avec les 10% (puisque nous avons la valeur réelle de vos données de 10%, nous pouvons vérifier l'exactitude de l'échantillon du modèle)

En plus de se référer au manuel en ligne dans otext

Comme d'autres mentionnés, lorsque nous comparons des modèles contre des modèles, nous utilisons la précision () pour comparer avec l'ensemble de test. Ensuite, vous pouvez avoir diverses mesures d'erreur comme MAE, MSE, RMSE ... etc. qui sont utilisées pour comparer les modèles par rapport aux modèles

soupe miso
la source
0

Au lieu de donner un nom adapté au modèle NN, utilisez fit_nn. De même, fit_arima et fit_ets. afin que vous puissiez comparer tous les modèles.

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)

maintenant, vous pouvez comparer les deux modèles en utilisant ME, MAE ou tout ce que vous voulez.

Komal Batool
la source
J'ai dû lire ceci plusieurs fois pour comprendre votre point de vue. Bien que la dénomination des variables soit une bonne pratique de codage, elle n'est pas au cœur de la réponse. La partie principale de votre réponse se trouve dans la dernière ligne (en utilisant MAE, etc.). Si vous pouviez mettre en évidence (ou encore mieux, développer) cela, cela améliorerait cela.
mkt
lorsque vous utilisez la précision de fonction (modèle), il donne certaines statistiques comme ME, MAE, RMSE, MPE et ainsi de suite. Vous pouvez utiliser n'importe lequel d'entre eux ou tous pour comparer deux ou plusieurs modèles. Disons par exemple que le modèle avec le moins de RMSE (Root Mean Square Error) est considéré comme le meilleur modèle parmi tous.
Komal Batool
C'est utile de savoir. Mais mon point est que ce n'est pas un site sur le codage, même si le code peut certainement éclairer les questions et les réponses. Et donc votre réponse serait meilleure si vous mettiez en évidence la question de fond .
mkt
La question était de savoir comment ANN peut être comparé à des modèles statistiques comme ARIMA (puisque ces modèles sont comparés en utilisant leurs valeurs AIC) et la réponse utilise d'autres valeurs statistiques comme MAE ou RMSE qui peuvent être obtenues par la fonction precision (). Il n'y a aucun point de confusion là-dedans.
Komal Batool