Мои предпочтительные модели для анализа временных рядов

Что касается прогнозирования временных рядов, я убежден, что чем проще модель, тем лучше.

Однако не все временные ряды одинаковы. Некоторые временные ряды имеют четко выраженный тренд - мы часто видим это на экономических данных, например:

Другие показывают более стационарный узор - например, ежемесячное количество авиапассажиров:

Выбор модели временных рядов будет сильно зависеть от типа временных рядов, с которыми вы работаете. Вот некоторые из наиболее полезных моделей временных рядов, с которыми я встречался.

1. ARIMA

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

Возьмем пример.

Предположим, мы хотим смоделировать ежемесячное количество авиапассажиров за годы. Исходные данные получены из Открытых данных Сан-Франциско.

Такой временной ряд будет иметь сезонную составляющую (например, в праздничные сезоны, как правило, больше пассажиров), а также свидетельство тенденции, как показано при декомпозиции ряда, как показано ниже.

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

Для этого можно использовать функцию auto.arima в R, которая может выбрать наиболее подходящие координаты p, d, q для модели, а также соответствующие сезонные составная часть.

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

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

Вот наглядное изображение прогнозов.

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

  • RMSE: 698
  • MFE: -115

Учитывая среднее значение 8,799 пассажиров в месяц по набору проверки, зарегистрированные ошибки были довольно небольшими по сравнению со средним значением, что указывает на хорошие результаты модели при прогнозировании количества авиапассажиров.

2. Пророк

Давайте еще раз посмотрим на пример с авиапассажиром, но на этот раз с помощью Пророка Facebook. Prophet - это инструмент временных рядов, который позволяет прогнозировать bsaed на основе аддитивной модели и особенно хорошо работает с данными, имеющими сильные сезонные тенденции.

Набор данных авиапассажиров соответствует всем требованиям, поэтому давайте посмотрим, как модель будет работать по сравнению с ARIMA.

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

prophet_basic = Prophet()
prophet_basic.fit(train_dataset)

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

Одним из особенно полезных компонентов Prophet является включение точек изменения или значительных структурных разрывов во временном ряду.

Методом проб и ошибок было показано 4 точки изменения для минимизации MFE и RMSE:

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 для Prophet ниже, чем полученное с помощью ARIMA, что позволяет предположить, что модель лучше работает при прогнозировании ежемесячного числа авиапассажиров.

3. Вероятность TensorFlow

После COVID-19 многие прогнозы временных рядов оказались ошибочными, поскольку были сделаны с неправильным набором предположений.

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

Например, модель ARIMA, построенная с использованием данных о авиапассажирах, как указано выше, не могла спрогнозировать резкое падение количества пассажиров, которое произошло в результате COVID-19.

Однако, используя более свежие данные о пассажирах, давайте посмотрим, как будет работать модель, построенная с использованием TensorFlow Probability:

Хотя модель не могла бы спрогнозировать резкое падение, которое в конечном итоге произошло, мы видим, что модель прогнозирует снижение количества пассажиров до менее 150 000. Использование этой модели может позволить сделать больше прогнозов типа «что, если» - например, авиакомпания может прогнозировать ежемесячное количество пассажиров для конкретного аэропорта и отмечать, что количество пассажиров может быть значительно ниже, чем обычно, что может информировать компанию с точки зрения управления ресурсами, такими как, например, использование флота.

В частности, TensorFlow Probability делает прогнозы, используя предположение об апостериорном распределении, которое состоит из априорного распределения (априорных данных) и функции правдоподобия.

Для справки, в примере, показанном здесь, используется шаблон из Моделирование структурных временных рядов в учебнике TensorFlow Probability, который оригинальные авторы (Авторские права 2019 The TensorFlow) сделали доступным по лицензии Apache 2.0.

Заключение

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

Надеюсь, вы нашли указанную выше статью об использовании, и не стесняйтесь оставлять любые вопросы или отзывы в разделе комментариев.

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