Анализ, прогноз и обнаружение аномалий в нескольких строках кода

Недавно я услышал о пакете, разработанном исследовательской группой Facebook (исследование META !?) под названием KATS, выпущенном командой Facebook Infrastructure Data Science в конце прошлого года и определяемом как набор инструментов для анализа данных временных рядов, легкий, простой в -использование и обобщаемая структура для выполнения анализа временных рядов.

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

Поэтому я решил использовать три набора данных для экспериментов с этим пакетом, чтобы работать со следующими вариантами использования:

  • Создание базовых моделей для соревнований по прогнозированию временных рядов
  • Обнаружение аномалий во временных рядах, связанных с преступлениями в Монреале
  • Извлечение признаков временного ряда по потреблению энергии домохозяйствами

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

Примечания:

  • Этот пакет на момент написания находится в версии 0.1, так что некоторый код может устареть в будущем.
  • Функции полезности не учитываются при этой оценке

Предварительные требования: сборка набора данных временных рядов.

На каждом пайплайне, связанном с временными рядами с помощью KATS, вам нужно будет построить свои временные ряды в формате TimeSeriesData KATS. Суть заключается в преобразовании кадра данных pandas во временной ряд KATS.

Что важно иметь в виду, так это то, что:

  • Необходимо указать время столбца, нет необходимости в формате datetime/timestamp, достаточно трансформируемой строки
  • В этом случае я выбрал только один столбец, но можно указать несколько столбцов.
  • Временной ряд имеет некоторые функции, такие как кадр данных pandas для добавления и разделения строк или функция построения графика самостоятельно (см. следующий рисунок)

С этим новым типом данных, который выглядит как более причудливый/структурированный фрейм данных pandas, все готово для погружения в компоненты KATS.

Прогнозирование с помощью KATS

Для этого эксперимента я собираюсь использовать компоненты kats.models для создания базовых моделей в последней январской игровой площадке Kaggle.

В этом конкурсе цель состоит в том, чтобы построить систему прогнозирования для магазина на севере Европы в трех странах (Финляндия, Швеция и Норвегия), в которых есть два типа магазинов (KaggleRama и KaggleMart) для трех видов товаров (кружка, наклейка и шапка).

Данные для обучения модели — это количество продаж на каждой территории, тип магазина и тип товаров в период с 31.12.2014 по 30.12.2018, а также прогноз на 2019 год для того же вида продукта на том же рынке. . Поэтому я создал конкатенацию категорий столбцов между Country-type_shop-type_item для построения моделей.

Что касается доступных моделей, существует множество доступных моделей (см. kats.models) от Prophet собственной модели прогноза временных рядов до LSTM, ARIMA и других подходов — выбирайте сами :). Однако я хотел быстро начать исследование, используя несколько моделей со значениями по умолчанию в одной категории.

Поток не требует усилий и дает мне возможность выбрать следующие модели:

Есть результат вывода модели пророка для категории.

Эти модели были самыми базовыми без необходимости добавления параметров по умолчанию, из моего первого эксперимента с пакетом:

  • Очень похожий способ инициализации модели с помощью атрибутов params функции модели во время объявления
  • Функция прогноза дает возможность определить количество дней в будущем, чтобы сделать прогноз (способ обучения и прогнозирования очень похож на Пакет пророка Пророка).
  • Модель model.predict также предоставляет функцию построения графика данных поезда и прогноза.
  • Некоторые модели прогнозируют различные виды выходных данных (например, прогноз с нижней и верхней границей), поэтому проверьте выходные данные :)

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

Мне удается иметь SMAPE (показатель оценки конкурса) 7,7; в настоящее время лучшая модель в общедоступной таблице лидеров — 3.9, так что не так уж и плохо для первой модели (спасибо пророку, нижняя граница).

Чтобы завершить мой эксперимент с компонентами прогноза, я собираюсь рассмотреть два подхода к поиску подходящих параметров/моделей:

  • Используйте метаобучение (вдохновленное этим учебным пособием), чтобы найти правильные параметры для списка моделей.
  • Оптимизация гиперпараметров для многомерной модели (по мотивам этого учебника)

Метаобучение: процесс, используемый в этом пакете, подробно описан в его статье на Facebook, но идея метаобучения состоит в том, чтобы научить модель учиться на выводах моделей, которые пытаются чтобы делать свои прогнозы и находить правильные параметры для использования (вроде личного тренера). Если вы хотите узнать больше об этом способе обучения модели, посмотрите эту статью о машинном обучении.

И вывод скриптов с названием лучшей модели и ее параметрами связанными

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

Есть глобально мой сток для теста.

Идея состоит в том, чтобы:

  • Подготовьте набор данных (тире)
  • Построить пространство параметров; Я сосредотачиваюсь только на одном параметре, который представляет собой другой выбор значений; Я обнаружил, что определение пространства параметров очень похоже на то, что можно сделать с помощью гиперопта.
  • Определите функцию оценки для отслеживания прогноза в тесте.
  • Инициировать исследование и отображать результаты поиска

В данном случае я использую не весь пакет, а также использование пакета Facebook под названием AX; Я познакомился с одним из разработчиков этого пакета во время экспериментов на конференции, и было интересно увидеть, как он упоминается в KATS.

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

Давайте углубимся в другую функцию пакета, связанную с обнаружением аномалий.

Обнаружение аномалий

Эти функции находятся под функциями kats.detector, как и прогноз, возможно несколько способов обнаружения аномалий во временном ряду, а вызов элементарный. Чтобы протестировать эту функцию, я применю ее к временному ряду, который я использовал в своей статье о случайном анализе и пророке в R, чтобы обнаружить аномалии в преступлениях Монреаля (забавное время).

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

А глобально есть представление вывода встроенными функциями.

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

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

Есть результаты.

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

На детекторе также доступны две функции (пример здесь), но я особо не копал:

В заключение давайте посмотрим на компонент, связанный с извлечением признаков из временного ряда.

Временные ряды и проектирование функций

Я буду использовать данные, связанные с моим набором данных Kaggle о потреблении энергии домохозяйствами в Лондоне, и построю функцию временного ряда для домохозяйств. Существует простой смысл, иллюстрирующий поток.

И, наконец, вы можете получить доступ к большому количеству информации о временном ряду.

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

Я провел быстрое сравнение энтропии признаков и ее экстремальных значений.

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

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

  • Чтобы использовать пакет, вам нужно преобразовать временной ряд в формат kats (но это просто)
  • Построить модель прогнозирования очень просто, она очень похожа на то, что было возможно с пророком, но расширена на множество различных подходов к прогнозированию.
  • Обнаружить аномалии так просто
  • Если вы не знаете, какие функции можно извлечь из временного ряда (например, для кластеризации), отправной точкой будет tsfeature.

Первоначально опубликовано на https://www.the-odd-dataguy.com 28 января 2022 г.