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



Подготовка


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

Российская школа


Впервые я столкнулся с машинным обучением во ВШЭ — получал вторую вышку по направлению Big Data Systems, когда устраивался в Додо. Пройдя эту огромную хайповую тему по касательной, я не понимал, зачем вообще потратил три года жизни. И уж тем более не думал о том, как это может пригодиться в компании. Я тогда не был готов к этому вызову судьбы.

Чешский вояж


Второй раз столкнулся с этой темой в Праге, на закрытом хакатоне Майкрософт по машинному обучению. Вместе с ребятами из других компаний мы работали над задачей прогнозирования спроса в Додо в праздники и пиковые дни. Обратно я вернулся с готовой моделью, прогнозирующей спрос. Именно после этого хакатона появились мысли, что я смогу применять полученные знания в компании. Не тут-то было.

Ну есть у тебя моделька в Jupyter, и что? Как её использовать? Все попытки объяснить это бизнесу сталкивались суровой реальностью: и так понятно, что в праздники и пиковые дни будет много заказов. Взрослые пиццерии умеют прогнозировать продажи на основе данных прошлого года, а у новых хватало проблем и без этого. Мы отложили попытки заняться развитием машинного обучения. Но идея, что мы можем делать больше с данными, слишком прочно засела в голове и не хотела оттуда вылезать. Теперь я был готов к вызову, а компания нет.

Американская мечта


Третья встреча стала судьбоносной. К нашей команде попала сложная, но интересная задача: разработать модуль кастомизированной пиццы для США. Это когда ты можешь заказать пиццу с любым набором ингредиентов, создать свой рецепт. В проекте надо было проработать всё: от изменений в архитектуре базы данных до клиентского кода на сайте. Мы вцепились в задачу и разработали продукт, который я считаю настоящей победой. Главная оценка прилетела в слак от Алёны, нашего CEO в США.



Модуль мы сделали, но я видел проблему в масштабировании. Что, если функциональность появится не в одной-двух пиццериях в штатах, а в большой сети? Как управлять таким продуктом, планировать запасы? Я решил, что этот кейс может доказать необходимость развития машинного обучения в Додо. Я чувствовал, что на этот раз и я, и компания готовы к запуску нового направления.

Один на один с машинами


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

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

Первый проект


Еще один спойлер: оказалось, что для запуска ML не нужно упарываться над чем-то сложным. Очевидно, не правда ли? Но это очень сложно понять в начале пути.

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

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

Цифры и пруфы


Я прикрутил логирование дополнительных продуктов и запустил новые предложения на выборке из 2 млн пользователей.

Выборка из пользователей — это лишь малая часть продаж. Надо было двигаться в сторону неавторизованных и новых клиентов. Я перелопатил достаточно статей и литературы про Collaborative Filtering и разные алгоритмы предложений для пользователей. Выиграла идея рекомендаций на основе продуктов в корзине. Item-Based-рекомендации и косинусная мера сходимости легли в основу новой, пусть и простой, но уже работающей модели.

В декабре мы запустили модуль Item-Based рекомендаций. Статистика показала, что покупатели действительно могут быть заинтересованы в совершенно разных продуктах, а не только в напитках. Возможно, именно после этого в Додо поверили, что данные и развитие машинного обучения позволят конкурировать на перегруженных предложениями рынках в будущем.

Немного статистики.


10 самых продаваемых продуктов на сайте


10 самых продаваемых продуктов мобильном приложении


Рост продаж по неделям

Технический трейлер


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

Исходная таблица внизу показывает количество заказов с приобретённым товаром каждого пользователя. Мы можем определить схожесть покупок одного пользователя с другим — для этого надо посчитать расстояние между векторами пользователей.


Таблица продаж продуктов по клиентам

Расстояние будет зависеть от выбранной метрики. Расчёт евклидова пространства включает в себя вес и величину вектора:

где a и b это два разных вектора клиента из таблицы. Давайте посмотрим, как будет выглядеть это расстояние на абстрактном примере.

Предположим, мы рассматриваем историю трех клиентов — a, b и c. Построим матрицу их покупок.


Рассчитав евклидовы расстояния между клиентами, мы получим следующие значения:

d(a,b) = 16,22;
d(b,c) = 13,38;
d(a,c) = 13,64.

Эти значения показывают, что наиболее близки друг к другу клиенты b и c. Но если посмотреть на исходные данные, картина складывается противоположная. Клиенты a и b предпочитают заказывать больше Пепперони и периодически другие продукты, а клиент c предпочитает пиццу Супреме. Можем сделать вывод, что величина вектора имеет негативный эффект для расчета расстояний между клиентами. Косинусная мера схожести как раз учитывает угол между векторами, отбрасывая значимость величины вектора:



Рассчитав по этой формуле расстояние, получим:
d(a,b) = 0,9183;
d(b,c) = 0,5848;
d(a,c) = 0,7947;

Мы видим, что клиенты a и b находятся ближе друг к другу. Они предпочитают один набор товаров без учета разницы количества сделанных заказов. Такая логика сходится с нашим экспертным мнением и позволяет предположить, что предпочтения клиентов a и b наиболее близки друг к другу.

Это трейлер, подробности через два месяца.

Поиск своего


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

Верьте в себя и свои силы, даже если результат не виден на горизонте. Хотелось бы завершить статью чужой мыслью — цитатой Макса Вебера с его доклада перед студентами Мюнхенского университета: «одной только тоской и ожиданием ничего не сделаешь, и нужно действовать по-иному — нужно обратиться к своей работе и соответствовать «требованию дня» — как человечески, так и профессионально. А данное требование будет простым и ясным, если каждый найдет своего демона и будет послушен этому демону, ткущему нить его жизни». Найдите своего.

Комментарии (21)


  1. Nikopol25
    06.03.2019 09:59

    Из статьи как то не сильно понятно причём здесь машинное обучение, если все зависимости выявляете вы, а не сама машина это нашла и применила в дальнейшем.


  1. fildub Автор
    06.03.2019 10:23

    В статье говорится больше в целом про запуск этого направления и приведен пример, объясняющий почему в основе модели Item-Based Collaborative Filtering лежит косинусная мера сходства.


    1. Nikopol25
      06.03.2019 12:18
      +7

      Так это не машинное обучение снова, это просто фильтрация.


  1. it2manager
    06.03.2019 12:43
    +1

    … Статистика показала, что покупатели действительно могут быть заинтересованы в совершенно разных продуктах, а не только в напитках… И ???? Результат есть? Такое предположение наши аналитики делают и без ML :)


    1. fildub Автор
      06.03.2019 14:08

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


  1. tuxi
    06.03.2019 12:54
    +2

    Спасибо за статью! Буду ждать продолжения.

    Есть вопрос:
    Не случится ли так, что акцентируя внимание потребителя на вычисленных по этой методике определенных множествах продуктов и дополнительных товаров, мы загоним его в некий «кокон», в котором он «не увидит» другие предложения, которые система сочтет менее актуальными и/или менее прибыльными?

    Ведь показатели ее эффективности начнут расти, так как каждая модель потребителя будет все больше и больше покупать именно то, что ей рекомендуется, а не то что будет спрятано в конце списка. Разве спустя некоторое время, наша система не начнет «хвалить саму себя»?


    1. fildub Автор
      06.03.2019 14:18

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


  1. Lehas
    06.03.2019 14:36
    +1

    Нормальный старый сайт когда вернёте?


    1. bevzuk
      06.03.2019 16:45
      +1

      Никогда, уже выпилили его из репозитория :)


  1. FRAGIL3
    06.03.2019 16:34

    Признаться честно, не очень понимаю какой толк в попытке выведения рекомендаций на основе выбора схожих пользователей в условиях достаточно ограниченного предложения номенклатуры. Если речь идёт именно о рекомендациях, не лучше ли попытаться проанализировать состав заказываемых пользователем пицц? Например, если пользователь постоянно берёт пиццу с курицей 1 и иногда пиццу с курицей 2, скорее всего ему будет интересна и третья, а может даже удастся скормить крылышки. Тем более вам всё равно придётся копать в эту сторону для прогнозирования закупок ингредиентов.


    1. fildub Автор
      06.03.2019 17:18

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


  1. Stepan555
    06.03.2019 16:44

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


    1. fildub Автор
      06.03.2019 17:21

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


      1. Stepan555
        06.03.2019 23:53

        А экономический эффект от внедрежа можете оценить?


  1. JakUi
    06.03.2019 17:26
    -1

    Мы с женой почти каждую пятницу заказываем пиццу в одном и том же месте, в одно и тоже время (±). В меню около 30 пицц, но у нас есть список любимых и мы заказываем одну из них. Однажды я поймал себя на мысли, что не хочу выбирать пиццу, звонить в пиццерию и делать заказ, а хочу подъехать к дому и увидеть, что курьер уже ждет меня с пиццей, которая мне сегодня понравится.Уверен, что я такой не один.
    Поэтому предлагаю вам реализовать такую схему: собираете данные о том, что клиент обычно заказывает, по каким дням, в какое время ждет курьера (мы всегда делаем заказ за час до желаемого времени прибытия курьера) и с какой периодичностью -> на основе этих данных делаем прогноз о том когда клиент захочет сделать следующий заказ и что он захочет купить (можно предложить пиццу не из тех, которые клиент брал раньше, но из тех, которые ему должны понравиться) — > в день Х оператор звонит клиенту и говорит «Здравствуйте, Имярек мы готовы доставить вам пиццу „ВамТочноПонравится“ в течение часа, привозим?» Если я даю добро — оператор спрашивает нужно ли еще что-нибудь добавить в заказ и подтверждает доставку, иначе — перезвонит через неделю. Я, например, был бы доволен и не стал думать идти мне за шашлыком, в KFC или заказывать пиццу.


    1. fildub Автор
      06.03.2019 17:28

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


      1. JakUi
        06.03.2019 17:34
        -1

        Тогда отправляйте смс. Привезти заказ без подтверждения — вот агрессивное продвижение.


        1. TRIMER
          07.03.2019 08:10

          СМС — аналогичная звонку жесть, но чуть менее бесящая. Доставку по расписанию лучше тогда делать в приложении. Если человеку надо, то он настроит расписание в приложении/получит пуш.


  1. 0o00oo00o0
    07.03.2019 10:06

    Посмотрев на ваши вычисления косинусов (у меня первое значение 0,951 ~ 163/(sqrt(534)*sqrt(55))), захотелось подменить их вычислениями коэффициентов корреляции, потому что не очень понятно, как приведенные числа интерпретировать. Коэффициенты корреляции: r_ab ~ 0,894, r_bc ~ -0,0455 r_ac ~ 0,3874. Остается воспользоваться интерпретацией из мат. статистики. Но в каждом случае есть интересные вопросы интерпретации. Например, что можно сказать о зависимости a = (1, 1, 1, 1), b = (3, 3, 3, 3) (и вообще для любых пар векторов такого вида или векторов, у которых значения очень близки к средним), ведь здесь коэффициент корреляции = 0 — зависимости нет, косинус = 1 — зависимость есть?


    1. fildub Автор
      07.03.2019 10:12

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


  1. in_heb
    09.03.2019 11:02

    Внедрение технологий на производство и использование машинного обучения это конечно всё хорошо. Но можно сделать просто вкусную пиццу с доставкой? (пробовал 2 раза заказывать додо-пиццу, ничем не лучше десятка других пиццерий за такие же деньги, а если честно, то вообще не понравилась)