Кажется, еще вчера я сидел за обшарпанным «спектрумом» в компьютерном клубе у дома, костерил сквозь зубы вечно виснущий 98-ой и под крики «Четвертая машина, еще пять минут!» и «Чур я за Китану!» писал свои первые кривенькие строчки кода. Кто бы мне тогда сказал, что я буду тестировать возможности машинного обучения для прогноза продаж в автономных витринах, я бы посоветовал ему сходить проветриться.
Искусственный интеллект, машинное обучение, роботы – фантастические понятия, которые вдруг стали нашим настоящим. То, о чем мы мечтали в детстве, уже здесь. И мы, кто еще недавно собирал радио на коленке и зачитывался фантастическими романами, уже сами разрабатываем и тестируем новые системы.
Машинное обучение давно не давало мне покоя. И нашей команде в 42Clouds – тоже. Мы верим, что оно кроет в себе гигантский потенциал и может в корне изменить подход к многим сферам бизнеса. К той же торговле, например, там машинное обучение для прогнозирования продаж и спроса – технология, которая позволит заполучить мощное конкурентное преимущество. Естественно, мы не смогли удержаться и решили пощупать его сами.
Куда мы влезли?
«Машинное обучение» – звучит абстрактно и размыто, но мы сталкиваемся с ним постоянно. Например, что нужно сделать поисковой системе, чтобы найти фотографии по запросу “собака”? Во-первых, обработать огромное количество фотографий собак из Интернета, столько же изображений с ярлыком “кошка” и миллионом других ярлыков. Во-вторых, нужно найти последовательности пикселей и сочетания цветов. Система около миллиарда раз пройдет через цикл анализ образца – проверка ответа – корректировка закономерностей – и в конце концов сформирует модель, которая сможет правильно распознавать на изображениях собак.
Система научилась. «Ну и что? Я тоже умею распознавать котиков» – пожмет плечами человек, далекий от техники. А как насчет задачи, которая не под силу одному человеку? Или под силу, но за сто лет? Или под силу только целому штату аналитиков? И я сейчас не про запуск ракет в космос, а, допустим, про обычный прогноз продаж.
Итак, на входе у нас есть микромаркеты izipoint, эдакие мини-магазины без продавцов. Витрины наши расставлены в самых разных точках самых разных городов.
И нам нужно следить за продажами и пополнением товаров, а еще хорошо бы предугадывать, что и как будет продаваться, чтобы продукты не портились и не заканчивались в самый неподходящий момент. Как это сделать? Какие факторы учитывать? Опрашивать покупателей? Нанимать исследовательскую группу? Обращаться к аналитикам данных? Мы решили пойти другим путем и потестить принципы машинного обучения для решения этой задачи. Итак, как составить прогноз продаж в 1С?
Как мы выбирали инструменты?
Наша задача сводится к классической задаче регрессии – прогноза на основе объектов с различными признаками. И лучше всего ее решать при помощи алгоритмов градиентного бустинга. Еще у нашей задачи была особенность – использование категориальных признаков, таких как “склад” и “номенклатура”. Одна из библиотек градиентного бустинга – catboost – дает возможность юзать категориальные признаки без дополнительного кодирования. Спойлер: позже мы поняли, что возможностей этой библиотеки нам было достаточно, поэтому использовали именно её.
Но на тот момент мы задумались. Реализовывать машинное обучение в 1С напрямую – такое себе: информационная база на платформе 1С выполняет роль только источника данных, а сами алгоритмы обучения модели и получения предсказаний реализованы на языке Python. Но не будем грешить на 1С, платформа предлагает большие возможности по интеграции со сторонними системами. Даже без написания дополнительного кода на стороне 1С, можно выбирать данные из информационной базы по протоколу OData.
Ок, а что тогда удобно использовать для создания моделей машинного обучения? Среду разработки интерактивных статей Jupyter Notebook. Она позволяет писать код на языке Python, выполнять его блоками, выводить результаты выполнения, строить графики на основе полученных данных и все остальное. Интерактивные блокноты можно запустить как у себя локально, так и на любом из доступных хостингов. Одни из самых популярных хостингов интерактивных статей – Google Colab и Azure Notebook.
Как мы окончательно определялись?
Чтобы выбрать между Google Colab и Azure Notebook, мы составили список самых критичных показателей для нашей задачи и сравнивали по ним. В нашем случае это размер доступной оперативной памяти, максимальное возможное время выполнения интерактивной статьи, размер дискового пространства и общая производительность хостингов.
В процессе обучения модели мы обрабатываем большие объемы данных, поэтому размер доступной оперативной памяти является важным показателем производительности хостинга. Сравниваем:
- В Google Colab количество доступной ОЗУ варьируется в районе от 12 до 20 Гб. Точное значение выделенной оперативной памяти определяется внутренними алгоритмами среды разработки.
- В Azure Notebook доступен меньший объём ОЗУ – всего 4 Гб.
Обучение модели – достаточно длительный процесс, поэтому мы также проанализировали максимальное возможное время выполнения интерактивной статьи:
- Для бесплатной версии Google Colab это 12 часов. Данное ограничение можно снять путём приобретения платной подписки Colab Pro (на момент написания статьи – 10$ в месяц).
- Для Azure мы не увидели фактического ограничения на время выполнения статьи, но в документации указано что гарантирована работа статьи на протяжении 8 часов.
Также нам требуется дисковое пространство для сохранения модели в файл и для хранения массива данных для обучения. Мы можем получать массив данных “на лету”, но это не всегда эффективно, т.к. получение данных зачастую занимает много времени и ресурсов, а при обучении модели приходится регулярно менять какие-либо её параметры и перезапускать процесс обучения.
- В Google Colab для работы с постоянной памятью приходится использовать либо Google Drive, либо BigQuery. Работа с ними не слишком сложна, но требует написания дополнительного кода. Бесплатная версия сервисов предоставляет 15Гб для хранения файлов в Google Drive и 10Гб для хранения данных в BigQuery.
- В Azure Notebook имеется удобное дисковое хранилище объемом 1Гб на проект.
Общая производительность хостингов может варьироваться в зависимости от выполняемого кода. На нашем примере обучение модели занимает:
- в Google Colab – 6-8 секунд
- в Azure Notebook – около 40 секунд.
Кроме этого, в Google Colab возможно использование GPU и TPU для увеличения производительности алгоритмов машинного обучения.
В итоге мы выбрали Google Colab и размещаем наши интерактивные статьи именно там. Данный хостинг превосходит аналоги практически по всем параметрам. А для увеличения времени выполнения статьи всегда можно купить Colab Pro или переключиться на локальную среду выполнения.
Загрузка из М.Видео для 1С: БП
Еще спойлер: уже после принятия окончательного решения в пользу Colab, появилась информация о том, что сайт Azure Notebooks перестанет функционировать с 9 октября 2020 года.
А что по выборке?
Для выборки данных из информационной базы 1С удобно использовать протокол OData. Но у данного протокола есть несколько жестких ограничений. Одно из самых неприятных – невозможность выполнения соединений на стороне сервера. Если в массиве данных предполагаются сложные взаимосвязи между таблицами, то это может привести к большому количеству запросов. Если код выполняется на удаленном сервере, то большой пинг может привести к большим задержкам при получении данных из информационной базы.
Как мы учили модель?
Для обучения модели мы получили массив данных со следующими признаками: склад, номенклатура, дата, признак выходного дня, цена, цена неделю назад, цена день назад, остаток на витрине, количество проданных единиц товара.
Для проверки корректности работы модели мы разделяем её на две части: данные для обучения (80% выборки) и тестовые данные (20% выборки). Существует также возможность кросс-валидации, когда разделение данных производится итеративно, но это увеличивает требуемые для обучения время и ресурсы в несколько раз.
Для оценки ошибки мы используем показатель среднеквадратичной ошибки модели (RMSE), но для итоговых показателей также оперируем показателями MAPE (средняя абсолютная ошибка в %) и MAE (средняя абсолютная ошибка).
Любопытно проанализировать полученную модель. Catboost поддерживает вывод деревьев решений модели:
Но данные графики малоинформативны. Гораздо удобнее использовать анализ модели с использованием библиотеки shap. Она позволяет вывести степень влияния различных факторов на результат прогноза в графическом виде:
На последнем графике особенно отчетливо видно влияние на результат признака выходного дня. В рабочие дни (группа красных точек) прогноз объема продаж выше, чем в выходные (группа синих точек). Это значит, что модель прогнозирует повышенный спрос на товары именно в рабочие дни.
Еще нас интересует точность прогнозов в разрезе склада/номенклатуры. После проверки модели на полном массиве данных мы получаем вот такую таблицу точности модели:
Для возврата результатов из интерактивной статьи в 1С мы также используем протокол OData. На основании полученных прогнозов мы формируем документ “План продаж”. Полученные результаты мы планируем учитывать при формировании заказов поставщикам и составлении графика пополнения товаров на витринах.
И что дальше?
Это – только первые результаты. Мы продолжаем работать над повышением качества модели предсказания продаж. Ведем поиск новых признаков, которые могут влиять на результаты, добавляем их в массив данных, проверяем изменение показателей ошибки. Но уже чувствуем, что мы на верном пути и с машинным обучением в 1С «натворим немало дел».
Мы открыты для сотрудничества с такими же неуемными экспериментаторами и новаторами, как мы, которые ищут нестандартные пути решения своих проблем, пробуют новое и смотрят шире, чем все привыкли. Если вы хотите “тренироваться на кошках” вместе с нами, мы готовы поделиться своими наработками – вы сможете разместить свою 1С у нас на Платформе, подключить свою базу и обучать модель на основе своих данных, чтобы получить свой собственный прогноз.
У нас уже есть положительный опыт такого взаимодействия на Платформе42 , где разработчики 1С могут продавать свои сервисы по подписке нашим клиентам. И мы чертовски радуемся каждый раз, когда наше сообщество пополняется новыми участниками с горящими глазами и холодными головами.