Прогнозирование временных рядов R с помощью нейронной сети, auto.arima и т. Д.


10

Я немного слышал об использовании нейронных сетей для прогнозирования временных рядов.

Как я могу сравнить, какой метод для прогнозирования моих временных рядов (ежедневные данные о розничных продажах) лучше: auto.arima (x), ets (x) или nnetar (x).

Я могу сравнить auto.arima с ETS по AIC или BIC. Но как я могу сравнить их с нейронными сетями?

Например:

   > 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.?

Ответы:


14

Подходы в выборке не являются надежным руководством для точности прогнозирования вне выборки. Золотой стандарт в измерении точности прогнозирования - использование несогласованной выборки. Удалите последние 30 дней из обучающей выборки, приведите ваши модели в соответствие с остальными данными, используйте подогнанные модели для прогнозирования выборки несогласных и просто сравните погрешности в несоответствии, используя средние абсолютные отклонения (MAD) или взвешенные средние абсолютные процентные ошибки (wMAPEs).

Вот пример использования R. Я использую 2000-ю серию соревнований М3, которая уже поделена на серии тренировок 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

Можно ли добавить объясняющие переменные (рождественские дни) в модель прогнозирования auto.arima? Или это возможно только при работе с аримой?
Юргита

1
Вы можете написать цикл над вашей серией и посмотреть, какой метод дает лучший wMAPE для каждой серии. Если один метод явно превосходит другие, используйте этот метод для всех серий. В противном случае подумайте об использовании разных методов для каждой серии. AIC не поможет вам с несколькими сериями! Или, что еще лучше, ищите специальное программное обеспечение для прогнозирования большого количества ежедневных временных рядов розничной торговли, которое также учитывает такие вещи, как изменения цен и т. Д. Это то, чем я зарабатываю на жизнь, я с радостью свяжу вас с нашими продавцами ;-) Но я также буду рад помочь вам здесь!
Стефан Коласса

Для auto.arima(), используйте xregпараметр. См ?auto.arima.
Стефан Коласса

4

Предложение Стефана выше является хорошим. Я хотел бы добавить , что с помощью АИК, безусловно , действительный способ выбрать в модели - но среди них нет . То есть, вы можете (и должны!) Использовать информационные критерии для выбора моделей ARIMA, моделей экспоненциального сглаживания и т. Д., А затем сравнивать своих наиболее подходящих кандидатов, используя прогнозирование вне выборки (MASE, MAPE и т. Д.). ).

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


1

Посмотрите это видео профессора Роба https://www.youtube.com/watch?v=1Lh1HlBUf8k

В видео профессор Роб рассказывал о функции точности и разнице между точностью выборки и точностью выборки.

То есть: взять, скажем, 80-90% ваших данных, подобрать модель, прогноз. Затем проверьте точность, используя прогнозные данные с 10% (поскольку у нас есть фактическое значение ваших 10% данных, мы можем проверить точность выборки модели)

А также обратитесь к онлайн-учебнику в otext

Как и другие упомянутые, когда мы сравниваем модели с моделями, мы используем точность () для сравнения с тестовым набором. Тогда вы можете иметь различные меры ошибки, такие как MAE, MSE, RMSE ... и т. Д., Которые используются для сравнения моделей с моделями


0

Вместо того, чтобы давать название, соответствующее модели NN, используйте 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 и так далее. Вы можете использовать любой из них или все для сравнения двух или более моделей. Скажем, например, модель с наименьшим среднеквадратичным отклонением (среднеквадратическая ошибка) считается лучшей моделью среди всех.
Комал Батул

Это полезно знать. Но я хочу сказать, что это не сайт о кодировании, хотя код, безусловно, может освещать вопросы и ответы. И поэтому ваш ответ будет лучше, если вы выделите основной вопрос.
mkt - Восстановить Монику

Вопрос состоял в том, как можно сравнить ANN со статистическими моделями, такими как ARIMA (поскольку эти модели сравниваются с использованием их значений AIC), а ответом являются другие статистические значения, такие как MAE или RMSE, которые можно получить с помощью функции precision (). В этом нет смысла путать.
Комал Батул
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.