Время прочтения: 6 мин.

Временные ряды и бизнес

Большое количество современных данных имеют временную структуру. Такой структурой, например, обладают экономические и финансовые переменные (ВВП, инфляция, цены акций), продажи и другие. Многим компаниям необходимо планирование, поэтому прогнозирование с помощью моделей временных рядов является неотъемлемой частью анализа данных в бизнесе. Интерес к этой теме заметен и по количеству инструментов, которое выпускается компаниями. Модель Orbit, про которую я расскажу была создана в компании Uber, её предшественником был Prophet. Обе модели были выпущены в виде Python-библиотек для открытого использования.

Модели экспоненциального сглаживания

Классическим для временных рядов является прогнозирование с помощью моделей вида ARIMA(p, d, q), которые учитывают p предыдущих периодов в качестве регрессоров для текущего. Альтернативная ветвь развития, которая получила достаточно большое внимание в последнее время – модель экспоненциального сглаживания. В этом методе в прогноз входит значение переменной за все предыдущие периоды, однако вес предыдущих периодов экспоненциально снижается по мере удаления от прогнозируемого периода. В простой форме экспоненциальное сглаживание может быть записано как:

Такая формулировка модели является максимально простой, поэтому плохо работает, когда в данных есть тренд или сезонность. В базовую модель обычно добавляют следующие компоненты: E (Error, ошибка), T (Trend, тренд), S (Seasonality, сезонность). Эти дополнения могут включаться в модель аддитивно (A), мультипликативно (M) и отсутствовать (N). Из-за таких сокращений модели экспоненциального сглаживания обычно записываются как ETS(X, X, X) – где вместо X стоят A, M или N в зависимости от того, как соответствующая компонента включается в модель. Наиболее распространенным видом модели является модель Холта-Винтерса ETS(A, A, A). Прогноз модели в ней задается как:

Расчет переменных происходит по следующим формулам:

Orbit

Авторы статьи Orbit приводят расширенную версию модели экспоненциального сглаживания. Они предлагают две вариации модели – LGT (Local and Global Trend) и DLT (Damped Local Trend).

LGT

Модель LGT формулируется следующим образом:

Все параметры зависят от предыдущих значений следующим образом:

В данном уравнении добавляются незнакомые нам переменные – b, которая отвечает за тренд и s, которая отвечает за сезонность и смотрит на соответствующее значение m периодов назад. В процессе обучения модели происходит подбор параметров ρ, ξ, λ, ν.

у₀ является параметром нормировки, который определяется по данным. Для подбора параметров используются Байесовские методы (например, один из вариантов подбора параметров – Метод Монте-Карло Марковских Цепей).

DLT

Процесс предсказания целевой переменной формулируется следующим образом:

Процесс обновления параметров по прошлым значениям записывается как:

Отличие данной модели заключается в том, что в нее включатся регрессоры rt. Веса регрессоров инициализируются стандартным нормальным распределением и потом подбираются во время оптимизации. Тренд D(t) является детерминистическим (не выражен случайной функцией) и может задаваться в линейном, лог-линейном и логистическом виде.

Применение в Python

Для работы в Python можно воспользоваться готовой реализацией алгоритма Orbit. Библиотека устанавливается с помощью команды

pip install orbit-ml

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

Данные содержат несколько переменных. Буду предсказывать переменную claims – количество заявок на пособие по безработице, зарегистрированных за неделю в США. Дополнительно, набор данных содержит вида trend. – это значение из сервиса Google Trends. Оно показывает, насколько популярны слова – unemploy, filling, job. Две последние переменные являются фондовыми индексами.

Разведочный анализ данных

Проведем разведочный анализ данных.

Библиотека позволяет построить графики всех переменных. В функцию необходимо передать переменную с датафреймом (data), колонку с датами (“week”) и массив с названиями переменных, которые мы хотим построить.

from orbit.eda.eda_plot import wrap_plot_ts
wrap_plot_ts(data, "week", list(data.columns))

Дополнительно, можно построить две переменные на одном графике. Построим claims и trend.filling. В функцию необходимо передать набор данных (df), колонку с датой (date_col), и переменные, которые мы хотим построить (var1, var2)

from orbit.eda.eda_plot import dual_axis_ts_plot
_ = dual_axis_ts_plot(df=data, var1="claims", var2="trend.filling", date_col="week")

Здесь можно увидеть, что пики trend.filling в большом количестве случаев обгоняют пики claims. Этот признак может быть информативен в качестве регрессора.

Построение модели

Перед построением моделей выделю последние 52 недели в тестовую выборку.

DLT

from orbit.models import DLT
dlt = DLT(
    response_col="claims",
    date_col="week",
    regressor_col=["trend.filling", "trend.job", "trend.unemploy"],
    seasonality=52
)
dlt.fit(df=train_data)

Сначала инициализирую модель. Передаю в класс название колонки с целевой переменной (response_col), название колонки с датами (date_col), массив с названиями колонок регрессоров (regressor_col) и сезонность. В данном случае, я выбрал сезонность равную 1 году – 52 недели. Далее, вызываю метод fit для обучения модели на обучающей выборке.

После обучения модели можно предсказать тестовые данные и визуализировать предсказание.

from orbit.diagnostics.plot import plot_predicted_data
predicted_data = dlt.predict(df=test_data)
plot_predicted_data(training_actual_df = train_data, 
                    predicted_df = predicted_data, 
                    date_col = dlt.date_col, 
                    actual_col = dlt.response_col,
                    test_actual_df = test_data)

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

Далее можно посмотреть на поведение отдельных компонентов модели.

from orbit.diagnostics.plot import plot_predicted_components
predicted_data = dlt.predict(data, decompose=True)
plot_predicted_components(predicted_data, "week")

LGT

Работа с LGT моделью производится с помощью тех же функций. Отличается только шаг с определением модели – LGT не имеет регрессоров.

Сравнение моделей

После того, как получены предсказания моделей на тестовых данных, можно сравнить их качество для предсказания. В качестве дополнительного бенчмарка также взята классическая модель ARIMA (реализация auto_arima из библиотеки pmdarima). Результаты моделей представлены в таблице:

МодельMSE
LGT0.0049
DLT0.0059
ARIMA0.032

Таким образом, модели экспоненциального сглаживания показали себя лучше, чем классическая модель ARIMA.

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