Всем привет! Меня зовут Саша, и я разрабатываю ETNA — пакет прогнозирования временных рядов. Эта статья будет посвящена методам EDA (Exploratory data analysis) в пакете ETNA. Я постараюсь показать, как найти что-то интересное в ваших данных с помощью этих методов, и объяснить, как использовать эти результаты для улучшения вашей прогностической модели.

О наборе данных

Сегодня мы попытаемся найти что-нибудь интересное в наборе данных временных рядов с конкурса Прогнозирование временных рядов веб-трафика на Kaggle. Целью конкурса является прогнозирование будущего веб-трафика примерно для 145 000 статей Википедии. Качество прогнозов оценивалось по SMAPE, поэтому мы также будем ориентироваться на эту метрику.

Если вам не терпится построить основу для этого конкурса — добро пожаловать в нашу предыдущую статью. Там мы объяснили, как прогнозировать временные ряды с помощью нашей библиотеки и как использовать дополнительные данные для этой цели. Если базовый план уже построен, метрики перестали улучшаться и радости в жизни нет, пора сделать шаг назад и перейти к EDA.

Выбросы, пропущенные значения и другие звери

Отсутствующие значения

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

Заполнение всех пробелов нулями выглядит не очень разумно:

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

Скользящая средняя за последние 3 дня выглядит идеальным кандидатом:

Выбросы

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

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

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

Кстати, должны ли мы на самом деле заботиться о выбросах? (Спойлер: конечно должны, о чем вы?) Давайте спрогнозируем наш временной ряд на 6 недель вперед, оставив выбросы на месте, а затем «исправив» их, как мы обсуждали выше.

SMAPE:

  • С выбросами: 33,85
  • Без выбросов: 28,88

Обработка выбросов улучшила качество примерно на 15%! Кажется, это важный шаг, не так ли?

Аномалии

Мы не можем предсказать появление выбросов во временном ряду из-за их случайного характера, однако в ряду есть и другие аномальные области. Некоторые из них на первый взгляд ничем не отличаются от выбросов (например, пики в праздничные дни), однако такое поведение ожидаемо и можно попытаться заставить модель обрабатывать такие случаи. Давайте разберемся, как обрабатывать специальные события на примере временного ряда, связанного с одним сериалом.

Аномальное поведение в начале года — не что иное, как выход нового сезона. Используя эффект выхода первого сезона сериала в 2016 году, мы хотим оценить посещаемость страницы во время выхода нового сезона в 2017 году. Знаменитый Пророк, например, может обрабатывать эффект таких событий вне коробки, однако нам снова нужно выбрать гиперпараметры.

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

А теперь сравним SMAPE:

  • Исходный уровень: 171,94
  • Годовая сезонность: 41,27
  • Годовая сезонность + событие: 20,65

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

Тренд и сезонность

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

  • Сезонность — периодические колебания значений временного ряда.

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

Теперь давайте взглянем на более экзотический график, так называемую периодограмму. На ней показаны амплитуды составляющих ряда Фурье с периодом один год. Мы видим пик в точке 52, характерный для недельной сезонности (52 раза в год), а также пики около 1 и 2, показывающие годовую и полугодовую сезонность.

В этот раз для разнообразия попробуем модель Catboost. Мы будем моделировать недельную сезонность с меткой дня недели и годовую/полугодовую сезонность с функциями Фурье.

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

  • Тренд — глобальная тенденция изменения характеристик временного ряда.

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

Визуализация говорит нам, что тренд ряда лучше всего моделируется кусочно-линейной функцией. Проверим, верно ли это предположение на практике. Мы попробуем три стратегии захвата тренда: без моделирования тренда, моделирование тренда с линейной функцией и моделирование тренда с кусочно-линейной функцией. Как и прежде, сравним стратегии со SMAPE:

  • Без моделирования тренда: 16,77
  • Линейный тренд: 19.10
  • Кусочно-линейный тренд: 10,73

Использование кусочно-линейной функции для моделирования тренда повышает качество прогноза на 37 % по сравнению с конвейером прогнозирования без моделирования тренда. В то же время моделирование тренда линейной функцией даже ухудшает качество.

Анализ качества модели

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

Представьте, что этап предобработки данных уже пройден, вы построили какой-то конвейер прогнозирования и хотите оценить, насколько он хорош. Давайте проведем бэктест и визуализируем результаты, как мы это делали раньше… Хотя я не совсем уверен, что мы действительно хотим смотреть на картинки со 100 сегментами. Давайте лучше посмотрим на распределение целевой метрики.

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

Мы также можем легко проверить важность функции:

Улучшение текущего пайплайна оставляется читателю в качестве упражнения ;)

В целом

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

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