Какая модель работает лучше?
Это продолжение моей предыдущей статьи: Анализ временных рядов с помощью 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 при расчете точности прогнозов
Большое спасибо за чтение, вопросы и отзывы всегда приветствуются.
Заявление об ограничении ответственности: эта статья написана на условиях «как есть» без каких-либо гарантий. Он был написан с целью предоставить обзор концепций науки о данных и никоим образом не должен интерпретироваться как профессиональный совет.
использованная литература
- Analytics Vidhya: SARIMA - прогнозирование сезонных данных с помощью Python и R
- КРАН - Пакет AEDПрогнозирование
- Data.world: Данные о пассажирах воздушного движения (Первоисточник: Открытые данные Сан-Франциско)
- GitHub: facebook / пророк
- Мастерство машинного обучения: мягкое введение в автокорреляцию и частичную автокорреляцию