Какая модель работает лучше?

Это продолжение моей предыдущей статьи: Анализ временных рядов с помощью Prophet: данные авиапассажиров

В этом примере модель ARIMA (авторегрессионная интегрированная скользящая средняя) построена с использованием R для прогнозирования количества авиапассажиров с использованием отчета международного аэропорта Сан-Франциско о ежемесячной статистике пассажиропотока по авиакомпаниям.

В частности, скорректированное количество пассажиров для авиакомпании KLM (запланировано) фильтруется как временной ряд для анализа с периода с мая 2005 г. по март 2016 г..

Результаты будут сравниваться с результатами, полученными Prophet, чтобы увидеть, как ARIMA работает по сравнению с этой моделью.

Модель обучается на 90% временных рядов (обучающий набор), причем последние 10% ряда используются для сравнения с прогнозами (набор тестов).

Предыстория ARIMA

Модель ARIMA состоит из координат (p, d, q):

  • p обозначает количество условий авторегрессии, то есть количество наблюдений из прошлых временных значений, используемых для прогнозирования будущих значений. например если значение p равно 2, то это означает, что два предыдущих временных наблюдения в серии используются для прогнозирования будущей тенденции.
  • d обозначает количество разностей, необходимых для того, чтобы временной ряд стал стационарным (т. е. с постоянным средним значением, дисперсией и автокорреляцией). Например, если d = 1, то это означает, что необходимо получить первую разность ряда, чтобы преобразовать его в стационарный.
  • q представляет собой скользящее среднее предыдущих ошибок прогноза в нашей модели или запаздывающих значений члена ошибки. Например, если q имеет значение 1, это означает, что у нас есть одно запаздывающее значение члена ошибки в модели.

Стационарность

Когда дело доходит до прогнозирования, ключевым предположением для данных временных рядов является стационарность. Здесь среднее значение, дисперсия и автокорреляция ряда постоянны.

Причина этого предположения заключается в том, что если среднее значение, дисперсия и автокорреляция ряда не являются постоянными во времени, это значительно усложняет использование моделей прогнозирования для составления прогнозов.

Однако, как мы отметили выше, параметр d в модели ARIMA обозначает количество различий, необходимых для того, чтобы сделать ряд стационарным. При использовании функции auto.arima в R значения p, d, и q выбираются автоматически.

Стационарность обычно можно определить визуально путем визуального осмотра данных.

Давайте еще раз посмотрим на временной ряд.

Мы можем видеть, что в целом временные ряды демонстрируют зигзагообразный паттерн с незначительными изменениями общей тенденции с течением времени или без них.

Однако формально это можно проверить с помощью теста Дики-Фуллера. Нулевая гипотеза состоит в том, что в ряду присутствует единичный корень (нестационарность), а альтернативной гипотезой является стационарность или стационарность тренда.

Тест на единичный корень выглядит следующим образом:

При запуске теста на серии получается p-значение 0,01, что означает, что нулевая гипотеза отклоняется на 5% уровне значимости, что указывает на наличие стационарности в серии.

> adf.test(passengernumbers)
Augmented Dickey-Fuller Test
data:  passengernumbers
Dickey-Fuller = -8.061, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary

Автокорреляция

Параметр p в ARIMA учитывает количество авторегрессионных членов в модели, что позволяет модели обрабатывать автокорреляцию. Автокорреляция - это ситуация, когда существует корреляция между ошибочными членами в разных наблюдениях во временном ряду, и это также может исказить прогнозы.

Вот график ACF (автокорреляционная функция) для временного ряда (установлены максимальные лагы 20):

Мы видим, что автокорреляции сохраняются в течение двух месяцев после лага 0, а положительные и отрицательные корреляции сохраняются в 6-месячный и 12-месячный периоды. В этом случае задержки являются ежемесячными, поэтому 6-месячный период обозначается как 0,5, а 12-месячный период обозначается как 1,0.

Функция частичной автокорреляции направлена ​​на устранение косвенных корреляций, возникающих в результате присущих линейных функций, существующих между каждым наблюдением.

Вот частичный график автокорреляции для ряда:

Мы видим, что функция частичной автокорреляции все еще показывает корреляции (хотя и отрицательные), сохраняющиеся через два месяца после лага 0. Следовательно, модель ARIMA должна быть настроена таким образом, чтобы учитывать правильное количество авторегрессионных членов.

Вот общий обзор компонентов тренда временного ряда:

> components <- decompose(passengernumbers)
> components

При просмотре ряда заметные сезонные закономерности наблюдаются примерно каждые шесть-восемь месяцев. Имея это в виду, модель ARIMA должна будет учитывать такую ​​сезонность в своих прогнозах.

Моделирование с помощью auto.arima

Учитывая визуальную индикацию автокорреляции, а также сезонность, auto.arima используется для автоматического создания многих моделей ARIMA с разными координатами p, d и q - затем выбирается лучшая модель на основе модели с самый низкий BIC (байесовский информационный критерий).

> # ARIMA
> fitpassengers<-auto.arima(passengernumbers, trace=TRUE, test="kpss", ic="bic")
ARIMA(2,0,2)(1,1,1)[12] with drift         : 1693.37
 ARIMA(0,0,0)(0,1,0)[12] with drift         : 1779.685
 ARIMA(1,0,0)(1,1,0)[12] with drift         : 1682.899
 ARIMA(0,0,1)(0,1,1)[12] with drift         : 1724.722
 ARIMA(0,0,0)(0,1,0)[12]                    : 1775.932
 ARIMA(1,0,0)(0,1,0)[12] with drift         : 1702.397
 ARIMA(1,0,0)(2,1,0)[12] with drift         : 1685.158
 ARIMA(1,0,0)(1,1,1)[12] with drift         : 1684.594
 ARIMA(1,0,0)(0,1,1)[12] with drift         : 1680.905
 ARIMA(1,0,0)(0,1,2)[12] with drift         : 1684.211
 ARIMA(1,0,0)(1,1,2)[12] with drift         : Inf
 ARIMA(0,0,0)(0,1,1)[12] with drift         : 1772.299
 ARIMA(2,0,0)(0,1,1)[12] with drift         : 1684.965
 ARIMA(1,0,1)(0,1,1)[12] with drift         : 1685.149
 ARIMA(2,0,1)(0,1,1)[12] with drift         : 1688.428
 ARIMA(1,0,0)(0,1,1)[12]                    : 1676.443
 ARIMA(1,0,0)(0,1,0)[12]                    : 1697.822
 ARIMA(1,0,0)(1,1,1)[12]                    : 1680.163
 ARIMA(1,0,0)(0,1,2)[12]                    : 1679.795
 ARIMA(1,0,0)(1,1,0)[12]                    : 1678.467
 ARIMA(1,0,0)(1,1,2)[12]                    : Inf
 ARIMA(0,0,0)(0,1,1)[12]                    : 1768.607
 ARIMA(2,0,0)(0,1,1)[12]                    : 1680.489
 ARIMA(1,0,1)(0,1,1)[12]                    : 1680.677
 ARIMA(0,0,1)(0,1,1)[12]                    : 1720.732
 ARIMA(2,0,1)(0,1,1)[12]                    : 1683.954
Best model: ARIMA(1,0,0)(0,1,1)[12]

Наилучшая конфигурация модели обозначается как ARIMA (1,0,0) (0,1,1) [12].

Коэффициенты для этой модели следующие:

> fitpassengers
Series: passengernumbers 
ARIMA(1,0,0)(0,1,1)[12]
Coefficients:
         ar1     sma1
      0.7794  -0.5001
s.e.  0.0609   0.0840
sigma^2 estimated as 585834:  log likelihood=-831.27
AIC=1668.54   AICc=1668.78   BIC=1676.44

Точность

Модель ARIMA генерирует следующие прогнозы:

RMSE (среднеквадратичная ошибка) и MFE (средняя ошибка прогноза) следующие:

  • RMSE: 698
  • MFE: -115
> # Errors
> library(Metrics)
> rmse(df$`Actual Passenger Numbers`, df$`Forecasted Passenger Numbers`)
[1] 698.6527

> ## Forecast Error
> forecast_error=(df$`Actual Passenger Numbers`-df$`Forecasted Passenger Numbers`)
> forecast_error
 [1] -415.8149 -982.0972 -273.1147 -539.5008 -520.7138 -845.2062 -824.7485
 [8] -212.4401 -454.4602 1387.1299  962.7507  153.2876  257.2238  687.3703
> mean(forecast_error)
[1] -115.7381

Сравнение с Пророком

Одно из ключевых различий между ARIMA и Prophet заключается в том, что модель Prophet учитывает «точки изменения» или конкретные сдвиги в тренде во временных рядах. Хотя технически это возможно сделать с помощью ARIMA в R, для этого требуется использование отдельного пакета под названием AEDForecasting.

Prophet работает с использованием аддитивной модели, в которой нелинейные тренды в ряду соответствуют сезонности (ежедневно, еженедельно или ежегодно).

В этом конкретном наборе данных сдвиг в тенденции произошел после 2009 года, когда мы увидели обратный рост общей тенденции пассажирского спроса:

К набору данных была добавлена ​​стандартная модель Prophet без каких-либо ручных спецификаций для сезонности:

prophet_basic = Prophet()
prophet_basic.fit(train_dataset)

Методом проб и ошибок было показано, что 4 точки изменения минимизируют RMSE и MFE и, следовательно, были определены как соответствующее количество точек изменения в модели:

pro_change= Prophet(n_changepoints=4)
forecast = pro_change.fit(train_dataset).predict(future)
fig= pro_change.plot(forecast);
a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)

RMSE и MAE рассчитываются следующим образом:

>>> from sklearn.metrics import mean_squared_error
>>> from math import sqrt
>>> mse = mean_squared_error(passenger_test, yhat14)
>>> rmse = sqrt(mse)
>>> print('RMSE: %f' % rmse)
RMSE: 524.263928
>>> forecast_error = (passenger_test-yhat14)
>>> forecast_error
>>> mean_forecast_error = np.mean(forecast_error)
>>> mean_forecast_error
71.58326743881493

При RMSE и MFE 524 и 71, полученных с помощью Prophet соответственно, ошибки значительно ниже, чем ошибки 698 и - 115, полученный с помощью ARIMA.

С этой точки зрения, хотя ARIMA учла такие закономерности, как сезонность и автокорреляция во временных рядах - Prophet преуспел в правильном определении соответствующей точки изменения в ряду - и, похоже, это повысило точность прогноза для модели.

Возможно, ARIMA преуспеет при прогнозировании данных с более четко определенным трендом или трендом, который не проявляет особой сезонности - мы увидели очень четкие признаки этого для рассматриваемого набора данных. Однако другие случаи, когда нет сезонности, могут не подходить для использования с Prophet.

Вывод

В этом примере мы видели:

  • Как настроить модель ARIMA
  • Актуальность точек изменения во временном ряду
  • Сравнение ARIMA и Prophet при расчете точности прогнозов

Большое спасибо за чтение, вопросы и отзывы всегда приветствуются.

Заявление об ограничении ответственности: эта статья написана на условиях «как есть» без каких-либо гарантий. Он был написан с целью предоставить обзор концепций науки о данных и никоим образом не должен интерпретироваться как профессиональный совет.

использованная литература