Харлан Сеймур, старший специалист по машинному обучению и инженер по обработке данных @ Afresh

В Afresh мы разрабатываем технологию, которая помогает бакалейщикам сокращать пищевые отходы и повышать их прибыльность за счет более точного прогнозирования, заказов и операций со свежими продуктами на уровне магазина. Ежегодно во всем мире треть производимых продуктов питания выбрасывается в отходы. В Соединенных Штатах 40 процентов всех пищевых отходов приходится на розничную торговлю, чаще всего в отделах свежих продуктов. Наша цель - применить технологии для оптимизации цепочки поставок и сделать свежие продукты более доступными.

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

  • item_id: какой товар?
  • store_id: какой магазин?
  • store_item_id: какой товар? Перекрестный продукт store_id x item_id.

Шаблоны продаж различаются в зависимости от товара, от магазина и, действительно, от каждого товара в магазине, так что это все ключевые особенности.

Важным свойством нашей модели прогнозирования спроса является то, что она распространяется на новые магазины (и новые товары), которые не были замечены во время обучения. Но что, если открывается новый магазин, в результате чего store_id и store_item_id становятся недоступными в обучающем наборе для построения модели? Чтобы решить эту проблему, мы можем представить магазин и отдел, используя новые функции, такие как размер отдела в sqft или географическую информацию, такую ​​как город, долгота и широта.

Одна из проблем с этими новыми функциями заключается в том, что они, как правило, остаются постоянными с течением времени, и модель машинного обучения может рассматривать их как полукатегорические функции, например 2,386 sqft должно быть store_id = 27, что имеет те же недостатки, что и использование идентификаторов. В результате прогнозирование для нового магазина, не найденного в обучающем наборе, с ранее невидимым значением sqft, может ухудшить качество прогноза для товаров в новом магазине.

Другой вариант - использовать скользящее (28 дней) среднее значение продаж отдела (dept_sales) в качестве прокси для store_id. Преимущество скользящего среднего состоит в том, что оно меняется (естественно, колеблется) день ото дня, при этом продажи отделов магазинов пересекаются друг с другом с течением времени, но в то же время несут много информации о характере продаж отдела.

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

Наша модель прогнозирования спроса состоит из ансамбля XGBoost градиентных деревьев (GBT) и моделей DNN (глубокая нейронная сеть). В деревьях XGBoost представлены 4 наиболее разветвленных (из многих!) Функций, которые служат эвристикой для определения важности функции:

  • dom (день месяца)
  • woy (неделя года)
  • store_id
  • store_item_id

Очевидно, что store_id и store_item_id - очень важные функции. Замена их на dept_sales (отдел продаж) в недавно обученной модели дает следующие 3 наиболее разветвленных функции:

  • dom (день месяца)
  • woy (неделя года)
  • dept_sales

Таким образом, dept_sales выглядит хорошей заменой идентификаторам магазинов в модели, по крайней мере, с точки зрения того, как они взвешиваются в модели. Но как насчет общей производительности модели? Мы можем измерить это по относительной ошибке L1. И мы хотим, чтобы отношение прогноза к продажам к фактическим продажам на основе тестовых данных было близко к 1,0 (идеальный прогноз). Мы не хотим, чтобы стандартное отклонение соотношения между магазином и предметом сильно варьировалось (все соотношения между магазином и предметами равны 1,0, что дает стандартное отклонение 0,0, является наилучшим!).

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

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

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