Автор: Фатос Исмали

Прогнозирование бизнеса становится все более важным в современном динамичном и непредсказуемом мире. Прогнозирование находит применение в различных отраслях и бизнес-сценариях — от прогнозирования спроса на продукцию в маркетинговом контексте до прогнозирования энергопотребления. В свете недавней пандемии Covid-19 многие модели прогнозирования испытали то, что я называю «дрейфовым шоком», что означает, что многие из этих моделей необходимо переобучить, чтобы учитывать изменения в распределении точек данных во времени и особенно в 2020. Поэтому многие компании возвращаются к «чертежной доске» для переобучения моделей. Прогнозирование традиционно унаследовало проблему прогнозирования по нескольким SKU и / или регионам, где каждая комбинация имеет свое собственное четкое распределение наблюдений, частоту и сезонность. Целесообразно обучать отдельные модели для каждой SKU и/или региона, чтобы зафиксировать эту четкую сезонность/частоту для этой конкретной SKU/региона. Следовательно, это может увеличить количество моделей, которые необходимо обучить, до тысяч. Это создает проблему для многих организаций, поскольку обучение тысяч моделей требует очень много времени и подвержено ошибкам.

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

  • Автоматизированное машинное обучение, которое предоставляет нам богатый набор моделей для прогнозирования, включая Prophet, AutoArima и многие другие.
  • ParallelRunStep — обеспечивает уровень абстракции, который позволяет нам распараллелить обучение многих моделей и прогнозирование по многим SKU.

Предпосылки

  • Служба машинного обучения Azure

Вы должны скачать файл config.json из службы машинного обучения Azure:

Мы будем использовать ускоритель решений для многих моделей, предоставленный Microsoft и доступный по следующей ссылке https://github.com/microsoft/solution-accelerator-many-models.

Ускоритель предоставляет основу для параллельного обучения сотен или тысяч моделей в дополнение к прогнозированию в масштабе и параллельно. В ускорителе решений есть примеры использования автоматизированного машинного обучения или пользовательских сценариев Python, в которых используется ваша любимая платформа машинного обучения или глубокого обучения (например, Keras, PyTorch, TensorFlow, sklearn и т. д.). Я немного изменил ускоритель решений выше, чтобы использовать простой набор данных, связанный с определенными SKU, чтобы продемонстрировать возможности параллельного обучения и прогнозирования нескольких моделей и SKU. Для простоты я разместил этот пример в своем репозитории GitHub, который содержит блокноты для обучения и прогнозирования, а также вспомогательные сценарии для подготовки данных. https://github.com/thinkgradient/many-models-solution-forecasting. Вы должны git клонировать этот репозиторий на свой локальный компьютер и обязательно переместить файл config.json, который вы скачали ранее, в корневую папку вашего репозитория, клонированного git.

Актуальный код акселератора решений Many Models см. в репозитории github выше (выделено жирным шрифтом). Набор данных, который мы собираемся использовать, очень прост, он содержит столбец «Неделя», который указывает еженедельную частоту записей о продажах, а все остальные столбцы представляют собой показатели продаж для каждого отдельного SKU. У вас может быть как можно больше артикулов (например, 2000 артикулов, что соответствует 2000 столбцов). Для простоты в этом примере мы предоставили записи о продажах для 5 SKU. Ниже приводится обзор шагов, которые мы будем выполнять:

  1. Подготовьте данные, разделив записи о продажах для каждой SKU в отдельный файл
  2. Выполните параллельное обучение Automated ML с помощью ParallelRunStep
  3. Запуск параллельного прогнозирования с помощью ParallelRunStep

Подготовка данных

Чтобы подготовить данные для параллельного обучения, мы должны сначала разделить SKU на отдельные файлы, чтобы во время обучения мы могли создавать отдельные эксперименты для каждого файла (т. е. SKU). Для этого используется блокнот 01_SKU_Data_Preparation.ipynb.

После запуска блокнота подготовки данных выше произойдет следующее преобразование данных:

ParallelRunStep будет обрабатывать каждый файл sku‹›.csv параллельно, что значительно сократит время обучения. После подготовки набора данных и разделения всех файлов на наборы для обучения и тестирования можно приступить к этапу обучения с использованием ParallelRunStep.

Распараллелить обучение с помощью ParalleRunStep

Чтобы запустить обучающую часть, выполните ячейки в записной книжке 02_AutoML_Training_Pipeline.ipynb. Изучите отдельные ячейки блокнота, чтобы понять, что делает каждая ячейка. ParallelRunStep настраивается с помощью ParallelRunConfig, определенного в сценарии helper.py в папке scripts. Чтобы понять параметры ParallelRunConfig, обратитесь к этому репозиторию git https://github.com/Azure/MachineLearningNotebooks/blob/master/how-to-use-azureml/machine-learning-pipelines/parallel-run/README.md

Следующая ячейка в блокноте:

из azureml.pipeline.core import Pipeline
#from azureml.widgets import RunDetails

pipeline = Pipeline(workspace=ws, steps=parallel_run_step)
run = Experiment.submit(pipeline)

это то, что отправляет эксперимент для обучения в Azure ML. Вы можете просмотреть ход обучающего эксперимента в Azure ML, перейдя по ссылке https://ml.azure.com и перейдя в Эксперименты > щелкнув имя эксперимента:

Вы также можете проверить каждую из моделей, обученных с помощью AutoML, щелкнув значок «Модели» слева:

а затем щелкните любую из пяти созданных моделей:

В приведенном выше примере видно, что лучшей моделью для InputData: sku02.csv был VotingEnsemble. Вы можете проанализировать каждую из других моделей AutoML и посмотреть, какая модель была выбрана как наиболее эффективная.

Параллельное прогнозирование с использованием ParallelRunStep

После того, как вы параллельно обучили свои модели прогнозирования для каждого из SKU вашего продукта, теперь вы можете использовать блокнот прогнозирования для прогнозирования продаж в будущем временном окне для каждого из SKU продуктов в тестовом наборе. Для прогнозирования выполните ячейки в записной книжке 03_AutoML_Forecasting_Pipeline.ipynb. Обратите внимание, что даже для прогнозирования мы используем ParallelRunStep, чтобы распараллелить оценку отдельных файлов SKU из тестового набора. Тестовый набор был сокращен на произвольную дату, то есть на 18 мая 2020 г., поэтому вы могли заметить, что последний фрагмент кода в блокноте прогнозирования отображает график matplotlib, который иллюстрирует разницу между фактическими и прогнозируемыми продажами для каждого из SKU в тестовом наборе с этой предельной даты. Дата отсечки произвольна и была выбрана при подготовке данных. Обратите внимание: не заостряйте слишком много внимания на несоответствии между реальными данными и прогнозами. Цель этого упражнения — не построить точную модель, а показать, как распараллелить обучение и прогнозирование тысяч моделей с помощью Azure ML.

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

из azureml.core import Experiment, Run

exp = Experiment(ws, ‘manymodels-procasting-pipeline’)

run_id = «‹идентификатор запуска конвейера›»
run = Run(experiment=exp,run_id=run_id)

Чтобы получить идентификатор запуска конвейера, перейдите на https://ml.azure.com и щелкните имя эксперимента по прогнозированию. В моем случае это называется многие модели-прогнозирование-конвейер.

Затем щелкните завершенный запуск конвейера.

И скопируйте идентификатор запуска с правой стороны в разделе «Обзор запуска конвейера».

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

Больше связанных полезных свойств:

Еще раз репозиторий GitHub для этого упражнения, который поддерживается мной, выглядит следующим образом: https://github.com/thinkgradient/many-models-solution-forecasting.

Ускоритель решений для многих моделей, который поддерживается и обновляется Microsoft, выглядит следующим образом: https://github.com/microsoft/solution-accelerator-many-models.

Еще один пример использования ParalleRunStep для распараллеливания вывода модели Fast.ai можно найти в этом сообщении в блоге: https://medium.com/thinkgradient/parallel-inferencing-using-a-fast-ai-model-and-azure- мл-параллельныйrunstep-d832155f688c

Чтобы понять, как настроить ParallelRunStep, обратитесь к https://github.com/Azure/MachineLearningNotebooks/tree/master/how-to-use-azureml/machine-learning-pipelines/parallel-run