Меня зовут Артем, я разработчик библиотеки ETNA. Мои коллеги уже познакомили вас с ETNA и рассказали, как загружать данные и строить прогнозы. А я расскажу, что такое регрессоры, какие они бывают, чем могут помочь при прогнозировании временных рядов и как с ними работать в нашей библиотеке.
Что такое регрессоры
Часто мы владеем дополнительной информацией, помогающей в предсказаниях. Календарь праздников поможет предсказать рост продаж шампанского перед Новым годом и снижение количества звонков в колл-центр на майских праздниках. Знание о том, что в определенное время проходила акция на клубничный йогурт, поможет понять, почему изменился спрос, и правильно спрогнозировать его, когда акция закончится.
Данные, известные на некоторый промежуток времени в будущем, называются регрессорами. Это дополнительные временные ряды, значения которых известны не только в прошлом. Такие данные можно использовать для извлечения большей информации из процесса и улучшить прогноз.
Условия задачи и загрузка данных
Рассмотрим работу регрессоров на примере. Задача: спрогнозировать продажи товаров в магазине. Есть данные о ежедневных продажах продуктов за три года (product.csv) и расписание тысячи повторяющихся акций магазина (promo.csv). Значение 1 — в этот день акция проводится, 0 — не проводится. Построим прогноз на 28 дней вперед, оценим качество прогноза метрикой SMAPE.
Расписание акций — это регрессоры, которые помогут точнее спрогнозировать продажи. Для наглядности будем рассматривать только шесть товаров.
Сравним обычный прогноз и прогноз с регрессорами, чтобы убедиться в пользе дополнительных данных.
В качестве модели возьмем 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.
Краткое резюме
В этом туториале мы:
разобрали, что такое регрессоры;
посмотрели, как с ними работать в библиотеке ETNA;
сравнили прогнозы с регрессорами и без.
В следующих статьях наша команда расскажет про другие полезные возможности библиотеки ETNA. Если вы хотите предложить новую фичу, задать вопрос или предложить тему для статьи, ждем в нашем GitHub — там все контакты.
Оффтоп для тех, кому нужен код загрузки данных
Данные о продажах и акциях мы взяли в корпоративном каталоге данных — data.world. Они искусственные и в них нет дат, поэтому мы сами выставили даты для рядов. В конце статьи — код для получения файлов promo.csv и products.csv.