Прогнозирование — одна из наиболее часто запрашиваемых функций машинного обучения в компаниях Walmart. Хотя разные команды работают изолированно, создавая модели машинного обучения, часто они используют один и тот же набор пакетов с открытым исходным кодом, бесконечно повторяя усилия. Недавно мы разработали повторно используемую библиотеку прогнозирования (RFL), чтобы обойти эту ситуацию с помощью дизайна, ориентированного на масштабируемость и расширяемость одновременно. Цель состоит в том, чтобы предоставить оболочку для широко используемых подходов к моделированию, таких как Prophet, Xgboost, Arima и т. д. Эта повторяющаяся работа теперь выполняется RFL. Таким образом, специалисты по данным могут тратить больше времени на оценку результатов и улучшение моделей.

Требования

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

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

Последнее требование — Масштабируемость. Среди проектов, в которых мы участвовали, есть несколько сотен моделей (маленькие), десятки тысяч моделей (средние) или миллионы моделей (большие). Все эти варианты использования должны поддерживаться и в идеале настраиваться путем переключения флага в файле JSON.

Дизайн

Наш подход заключается в том, чтобы сначала сформировать абстракцию вычислительного процесса прогнозирования. Затем мы фиксируем абстракцию, используя концепции объектно-ориентированного проектирования (OOD). Наша интуиция подсказывает, что после захвата добавление новых моделей/функций становится вопросом создания подклассов (из базовых классов).

Одной из абстракций является разделение данных и вычислений. На рис. 1а поля фрейма данных состоят из четырех типов:

  • Индекс времени — это временная метка точки данных.
  • Цель — это цель, которую необходимо прогнозировать.
  • Разделы — столбцы здесь фактически определяют сетку данных, каждое соединение которой связано с временным рядом из фрейма данных. На рис. 1а показаны некоторые примеры. Столбцы раздела также называются измерениями.
  • Особенности — рассматриваются как движущие силы целевой переменной и используются для помощи в прогнозировании. Опять же, на рис. 1а показаны некоторые примеры функций.

Рис. 1b — иллюстрация вычислений, происходящих в соединении. Он состоит из конвейера этапов, которые выполняются последовательно во многих испытаниях (подумайте о настройке гиперпараметров). Все конвейеры запускают одну и ту же программу, но с разными данными (разве это не звучит как «Одна программа — несколько данных»?).

Вторая абстракция смотрит дальше в вычислительный аспект (рис. 1b). Здесь мы наблюдаем разделение функциональности, которая выполняется в конвейере, и вычислительных ресурсов, которые выделяются для исполнения. Мы называем последний Backend. Подробнее будет представлено в следующем разделе.

Прежде чем перейти к подробному описанию, давайте кратко представим терминологию UML, которая будет использоваться для представления нашего проекта:

  • Is-a: A Is-a B означает, что A является подклассом базовый класс B
  • Имеет-a: A Имеет-a Bозначает, что B является членом А
  • Uses-a: A Use-a Bозначает, что Aимеет ссылку на объект B, обычно передаваемый в качестве параметра функции-члену A

Набор данныхотражает абстракцию данных, показанную ранее на рис. 1а. Он состоит из двух частей: DataSourceсоответствует тому, что считывается из источника данных; Extras – это дополнительные функции, разработанные AutoPipe. DataFrame изначально сохраняет данные, считанные из источника. Позже к ним добавляются элементы из Extras. Различные типы функций имеют разное поведение. Лучше всего захватить их с помощью объектно-ориентированного дизайна, как показано на рис. 2.

Экзогенные сигналы – это внешние переменные, такие как осадки, безработица, посещаемость магазинов и т. д., которые коррелируют с целью. Предусмотрены два метода: impute() и extend(). Первый заполняет любые значения N/A. Последний вычисляет будущие значения каждой функции.

Lags состоит из набора статистических функций, разработанных на основе Target, которые обычно используются в моделях на основе регрессии, таких как древовидные модели. Праздники и Сезоны легко понять.

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

Функция — это место, где достигается расширяемость. На рис. 3 класс Function является поставщиком функциональных возможностей. Он выполняет три вещи: i). включение новых моделей прогнозирования, которых в настоящее время нет в библиотеке; ii). добавление новых оценщиков, таких как классификаторы; III). адаптация к некоторым популярным API машинного обучения. В настоящее время в RFL реализовано 6 подходов к моделированию: Sarimax, Prophet, Greykite, Xgboost, LightGBM, Random Forest.

Класс SklearnEstimator предоставляет пример адаптации API, которым в данном случае является Scikit-learn — популярный пакет машинного обучения с открытым исходным кодом. Цель этого адаптера — позволить функциям RFL интегрироваться в конвейеры Scikit-learn в качестве этапов с другими функциями, которые следуют соглашению о кодировании Scikit-learn. Конвейер — это эффективный способ выполнения, который широко поддерживается в сообществе машинного обучения. Это устраняет переходные операции ввода-вывода данных между этапами. Будущие расширения новых API могут быть реализованы аналогичным образом.

Вычисления – это класс, который объединяет все вместе. На рис. 4 показан такой процесс: функция запускается для нескольких данных в наборе данных на масштабируемой серверной части. На данный момент поддерживаются три бэкенда: Loop, Joblib и PySpark. Серверная часть Loop, согласно своему названию, предназначена для запуска на локальном компьютере в итерациях данных. Серверная часть Joblib использует библиотеку Joblib с открытым исходным кодом для многопоточности. Наконец, крупномасштабные задачи могут выполняться в кластере Spark с использованием серверной части PySpark. Задача run() состоит в том, чтобы упаковать соответствующую функцию (fit_transform() или predict()) из указанной Function объект (в данном случае модель Prophet) и отправляет его на серверную часть, которая была предварительно настроена. И модель, и серверная часть указываются в файле конфигурации.

Выполнение

Среда выполнения предоставляет специалистам по данным функции верхнего уровня. Для большинства их ежедневных обязанностей достаточно взаимодействия с этим классом. Реализовано четыре режима. Каждая из которых представляет собой комбинацию функций: tune(), train(), test(), прогноз() именно в таком порядке (рис. 5). Хотя специалисты по обработке и анализу данных могут вызывать эти функции через API программирования, стандартный способ использования — это файлы конфигурации, в которые через класс Config Handler загружается информация о конфигурации. Внутри четыре режима вызывают Compute.run() для завершения своего назначения. Включение новых режимов в будущем безболезненно благодаря модульной конструкции. Что касается конфигурации, Основная конфигурация предназначена для общих настроек, а Конфигурация модели — для конкретных настроек модели.

В дополнение к четырем режимам, описанным выше, RFL имеет некоторые дополнительные функции, о которых стоит упомянуть:

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

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

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

Краткое содержание

RFL был принят в нескольких проектах Walmart в качестве инструмента моделирования. Таким образом, преимущества, о которых сообщают ученые, работающие с данными, имеют два аспекта:

  • Экономия усилий в результате настройки эксперимента с низким кодом. Это составляет экономию 3-4 дней и сокращение времени выполнения на 90% благодаря распараллеливанию в сборке. С помощью RFL специалисты по данным могут больше сосредоточиться на разработке экспериментов, а не тратить усилия на их настройку каждый раз.
  • Повышение качества благодаря более широкому исследованию пространств гиперпараметров и признаков. Хотя улучшение качества моделирования не является целью самой библиотеки, из-за упрощения экспериментов специалисты по данным часто впоследствии находят более оптимальные модели.

RFL – это многоразовая библиотека прогнозирования, разработанная с учетом возможностей расширения и масштабирования. Это также зависит от конфигурации — выбор дизайна сделан для поддержки нашего долгосрочного видения прогнозирования как услуги, чтобы предприятия как владельцы данных могли попробовать сценарии «что, если» без кода. В будущем мы хотели бы повысить его осведомленность в компании, чтобы увеличить дальнейшее использование.

Подтверждение

Несколько команд Walmart участвовали в разработке RFL. Их вклад признается здесь все сразу.