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

Что такое регрессоры

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

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

Условия задачи и загрузка данных

Рассмотрим работу регрессоров на примере. Задача: спрогнозировать продажи товаров в магазине. Есть данные о ежедневных продажах продуктов за три года (product.csv) и расписание тысячи повторяющихся акций магазина (promo.csv). Значение 1 — в этот день акция проводится, 0 — не проводится. Построим прогноз на 28 дней вперед, оценим качество прогноза метрикой SMAPE.

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

Графики продаж товаров
Графики продаж товаров
Расписание акций. 0 — акция в этот день не проводилась, 1 — проводилась
Расписание акций. 0 — акция в этот день не проводилась, 1 — проводилась

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

В качестве модели возьмем CatBoostModelPerSegment. PerSegment говорит нам о том, что для каждого временного ряда продаж продуктов обучается своя модель, а CatBoost — что в качестве модели будет градиентный бустинг CatBoost.

Для этой модели необходимо сгенерировать фичи. Зададим список трансформаций, генерирующих фичи дня, таких как номер дня в неделе, в месяце, номер недели в месяце и в году, номер месяца в году, и 11 лагов — с 29-го по 49-й включительно.

Запустим backtest для подсчета метрик. Подробнее про лаги, Pipeline, backtest, а также почему не можем выбрать лаги меньше, рассказал в предыдущей статье Андрей.

Визуализируем получившиеся результаты:

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

Прогноз с регрессорами

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

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

При создании TSDataset указываем дополнительные данные в df_exog, в known_future передаем список дополнительных рядов, известных на будущее — регрессоров. В нашем случае все дополнительные данные — регрессоры, поэтому можно указать all.

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

Для прогноза с регрессорами не нужно дополнительных действий — все сделано на этапе создания TSDataset. Повторяем те же этапы, которые делали без регрессоров.

Отрисуем прогнозы: 

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

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

Сравним метрики:

Важность признаков можно увидеть с помощью функции plot_feature_relevance. На вход подается метод подсчета важности. В нашем случае метод подсчета ModelRelevanceTable означает, что подсчет важности осуществляется моделью. В качестве модели возьмем CatBoostRegressor. Важность каждого признака, полученная из модели CatBoostRegressor, нормирована так, что сумма важностей всех признаков будет 100.

Из важности признаков можно получить некоторые инсайты. На товар 0 сильно влияют 438-я и 255-я акции, а на товар 7 — признаки номера месяца и номера недели в году. Вероятно, продажи этого товара имеют сильную годовую сезонность
Из важности признаков можно получить некоторые инсайты. На товар 0 сильно влияют 438-я и 255-я акции, а на товар 7 — признаки номера месяца и номера недели в году. Вероятно, продажи этого товара имеют сильную годовую сезонность

Краткое резюме

В этом туториале мы:

  • разобрали, что такое регрессоры;

  • посмотрели, как с ними работать в библиотеке ETNA;

  • сравнили прогнозы с регрессорами и без.

В следующих статьях наша команда расскажет про другие полезные возможности библиотеки ETNA. Если вы хотите предложить новую фичу, задать вопрос или предложить тему для статьи, ждем в нашем GitHub — там все контакты.

Оффтоп для тех, кому нужен код загрузки данных

Данные о продажах и акциях мы взяли в корпоративном каталоге данных — data.world. Они искусственные и в них нет дат, поэтому мы сами выставили даты для рядов. В конце статьи — код для получения файлов promo.csv и products.csv.

Комментарии (1)


  1. dzis_science
    13.05.2022 23:27

    Добрый день, интересная статья. Последний раз когда я видел данную библиотеку на конференции PyCon, она была, по сути оберткой над всеми остальными библиотеками прогнозирования временных рядов (kats, prophet, statsmodels,...). Вижу была добавлена дополнительная модель на основе градиентного бустинга и методы визуализации. Хотелось бы узнать поподробнее о дальнейших шагах развития библиотеки, так как библиотека сейчас подает большие надежды стать "черным ящиком" решения задач временных рядов.