Predicción de series temporales R con red neuronal, auto.arima y ets

10

He escuchado un poco sobre el uso de redes neuronales para pronosticar series temporales.

¿Cómo puedo comparar qué método para pronosticar mi serie temporal (datos minoristas diarios) es mejor: auto.arima (x), ets (x) o nnetar (x).

Puedo comparar auto.arima con ets por AIC o BIC. ¿Pero cómo puedo compararlos con las redes neuronales?

Por ejemplo:

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

Usando auto.arima:

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

 > 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

En este caso, auto.arima se ajusta mejor que ets.

Intentemos cantar la red neuronal:

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

ingrese la descripción de la imagen aquí

Desde el gráfico, puedo ver, que el modelo de red neuronal se ajusta bastante bien, pero ¿cómo puedo compararlo con auto.arima / ets? ¿Cómo puedo calcular AIC?

Otra pregunta es, ¿cómo agregar el intervalo de confianza para la red neuronal, si es posible, como si se agrega automáticamente para auto.arima / ets?

Jurgita
fuente

Respuestas:

14

Los ajustes dentro de la muestra no son una guía confiable para la precisión del pronóstico fuera de la muestra. El estándar de oro en la medición de precisión de pronóstico es usar una muestra reservada. Elimine los últimos 30 días de la muestra de entrenamiento, ajuste sus modelos al resto de los datos, use los modelos ajustados para pronosticar la muestra reservada y simplemente compare las precisiones en la reserva, utilizando Desviaciones absolutas medias (MAD) o Errores de porcentaje absoluto ponderado (wMAPEs).

Aquí hay un ejemplo usando R. Estoy usando la serie 2000 de la competencia M3, que ya está dividida en la serie de entrenamiento M3[[2000]]$xy los datos de prueba M3[[2000]]$xx. Estos son datos mensuales. Las dos últimas líneas muestran el wMAPE de los pronósticos de los dos modelos, y vemos aquí que el modelo ARIMA (wMAPE 18.6%) supera al modelo ETS ajustado automáticamente (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)

Además, parece que hay ventas anormalmente altas cerca de los índices 280-300. ¿Podrían ser estas rebajas navideñas? Si conoce eventos de calendario como estos, sería mejor alimentarlos a su modelo de pronóstico como variables explicativas, lo que le dará un mejor pronóstico la próxima vez que llegue la Navidad. Puede hacerlo fácilmente en ARIMA (X) y NN, no tan fácilmente en ETS.

Finalmente, recomiendo este libro de texto sobre pronósticos: http://otexts.com/fpp/

Stephan Kolassa
fuente
Gracias por la respuesta. Sus sugerencias son muy buenas, pero desafortunadamente no me quedan bien. Tengo muchas series temporales, con diferentes períodos y necesito hacer pronósticos para ellas, por lo tanto, estoy buscando un modelo simple y mejor. Pensé que si podía comparar los métodos por AIC, elegiría el mejor.
Jurgita
No puedo buscar cada serie manualmente, debería escribir un programa, que encontraría el mejor modelo y lo aplicaría
Jurgita
¿Es posible agregar variables explicativas (días de Navidad) al modelo de pronóstico auto.arima? ¿O solo es posible cuando se trabaja con arima?
Jurgita
1
Puede escribir un bucle sobre su serie y ver qué método proporciona la mejor wMAPE para cada serie. Si un método supera claramente a los demás, use ese para todas las series. De lo contrario, piense en usar diferentes métodos por serie. ¡AIC no lo ayudará con varias series! O, mejor aún, busque un software dedicado para pronosticar grandes cantidades de series de tiempo de ventas diarias que también tengan en cuenta cosas como cambios de precios, etc. Esto es lo que hago para ganarme la vida, felizmente te pondré en contacto con nuestros vendedores ;-) ¡Pero también estaré encantado de ayudarte aquí!
Stephan Kolassa
Para auto.arima(), use el xregparámetro. Ver ?auto.arima.
Stephan Kolassa
4

La sugerencia de Stephan anterior es buena. Agregaría que usar AIC es definitivamente una forma válida de elegir dentro de los modelos, pero no entre ellos. Es decir, puede (¡y debería!) Usar criterios de información para elegir qué modelo (s) de ARIMA, qué modelo (s) de suavizado exponencial, etc., y luego comparar a sus principales candidatos utilizando predicciones fuera de la muestra (MASE, MAPE, etc.) )

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

Stephen C
fuente
1

Mire este video del profesor Rob https://www.youtube.com/watch?v=1Lh1HlBUf8k

En el video, el profesor Rob enseñó sobre la función de precisión y las diferencias entre la precisión de la muestra y la precisión de la muestra.

es decir: Tomando digamos 80-90% de sus datos, ajuste un modelo, pronostique. Luego verifique la precisión utilizando los datos pronosticados con el 10% (dado que tenemos el valor real de sus datos del 10%, podemos verificar la precisión de la muestra fuera del modelo)

Además de consultar el libro de texto en línea en otext

Como otros mencionados, cuando comparamos modelos versus modelos, usamos la precisión () para comparar con el conjunto de prueba. Entonces puede tener varias medidas de error como MAE, MSE, RMSE ... etc. que se utilizan para comparar modelos versus modelos

sopa de miso
fuente
0

En lugar de dar nombre al modelo NN, use fit_nn. Del mismo modo, fit_arima y fit_ets. para que puedas comparar todos los modelos.

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)

ahora, puede comparar ambos modelos usando ME, MAE o lo que quiera.

Komal Batool
fuente
Tuve que leer esto un par de veces para entender tu punto. Si bien el nombramiento de las variables es una buena práctica de codificación, no es fundamental para la respuesta. La parte principal de su respuesta está en la línea final (usando MAE, etc.). Si pudieras resaltar (o incluso mejor, expandir) eso, mejoraría esto.
mkt - Restablece a Mónica el
cuando utiliza la precisión de la función (modelo), proporciona ciertas estadísticas como ME, MAE, RMSE, MPE, etc. Puede usar cualquiera de ellos o todos para comparar dos o más modelos. Digamos, por ejemplo, que el modelo con menos RMSE (Root Mean Square Error) se considera el mejor modelo entre todos.
Komal Batool
Es útil saberlo. Pero mi punto es que este no es un sitio sobre codificación, aunque el código ciertamente puede iluminar preguntas y respuestas. Por lo tanto, su respuesta sería mejor si resaltara el problema sustantivo .
mkt - Restablece a Mónica el
La pregunta era cómo se puede comparar ANN con modelos estadísticos como ARIMA (ya que estos modelos se comparan usando sus valores AIC) y la respuesta es usar otros valores estadísticos como MAE o RMSE que se pueden obtener mediante la función de precisión (). No hay ningún punto de confusión en ello.
Komal Batool