Машинное обучение в Додо. Как запустить новое направление, если ты разработчик

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



    Подготовка


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

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


    Впервые я столкнулся с машинным обучением во ВШЭ — получал вторую вышку по направлению 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.

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

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

      +8

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

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

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

          +1
          … Статистика показала, что покупатели действительно могут быть заинтересованы в совершенно разных продуктах, а не только в напитках… И ???? Результат есть? Такое предположение наши аналитики делают и без ML :)
            0
            Моя цель была показать, что нельзя основываться только на экспертном мнении без подкрепления аналитикой данных. Дальше будет внедрение других алгоритмов с более персонализированными для клиента рекомендациями.
            +2
            Спасибо за статью! Буду ждать продолжения.

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

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

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

                +2
                Никогда, уже выпилили его из репозитория :)
                0
                Признаться честно, не очень понимаю какой толк в попытке выведения рекомендаций на основе выбора схожих пользователей в условиях достаточно ограниченного предложения номенклатуры. Если речь идёт именно о рекомендациях, не лучше ли попытаться проанализировать состав заказываемых пользователем пицц? Например, если пользователь постоянно берёт пиццу с курицей 1 и иногда пиццу с курицей 2, скорее всего ему будет интересна и третья, а может даже удастся скормить крылышки. Тем более вам всё равно придётся копать в эту сторону для прогнозирования закупок ингредиентов.
                  0
                  Здесь была задача рекомендовать на основе выбранных в корзине продуктов, так как был ориентир на неавторизованных пользователей. Следующим этапом будут как раз решения для рекомендаций на основе истории заказов по пользователям.
                  –1
                  Странно, что вы выбрали в качестве пилота нишевое направление кастомизированной пиццы, а не мэйнстрим. Ведь в нише затраты могут попросту не окупиться, а в основном направлении даже небольшая отдача умножится на большое количество продаж. Да и данных на пару порядков больше для обобщений и обучения. Неужели таки в продаже стандартной пиццы вы не нашли места машинному обучению?
                    0
                    Нишевый продукт кастомизированной пиццы был проанализирован еще перед проектом с рекомендациями. Такой анализ был нужен, чтобы быстро и без вывода в продакшн показать, что алгоритмы могут быть полезны. А дальше уже началась история с поиском пилотного проекта и его реализацией.
                      –1
                      А экономический эффект от внедрежа можете оценить?
                    –1
                    Мы с женой почти каждую пятницу заказываем пиццу в одном и том же месте, в одно и тоже время (±). В меню около 30 пицц, но у нас есть список любимых и мы заказываем одну из них. Однажды я поймал себя на мысли, что не хочу выбирать пиццу, звонить в пиццерию и делать заказ, а хочу подъехать к дому и увидеть, что курьер уже ждет меня с пиццей, которая мне сегодня понравится.Уверен, что я такой не один.
                    Поэтому предлагаю вам реализовать такую схему: собираете данные о том, что клиент обычно заказывает, по каким дням, в какое время ждет курьера (мы всегда делаем заказ за час до желаемого времени прибытия курьера) и с какой периодичностью -> на основе этих данных делаем прогноз о том когда клиент захочет сделать следующий заказ и что он захочет купить (можно предложить пиццу не из тех, которые клиент брал раньше, но из тех, которые ему должны понравиться) — > в день Х оператор звонит клиенту и говорит «Здравствуйте, Имярек мы готовы доставить вам пиццу „ВамТочноПонравится“ в течение часа, привозим?» Если я даю добро — оператор спрашивает нужно ли еще что-нибудь добавить в заказ и подтверждает доставку, иначе — перезвонит через неделю. Я, например, был бы доволен и не стал думать идти мне за шашлыком, в KFC или заказывать пиццу.
                      0
                      Прогноз когда сделает следующий заказ — интересная тема, думаю, мы до нее доберемся. Но скорее в другой конечной реализации, звонок — достаточно агрессивное продвижение.
                        –1
                        Тогда отправляйте смс. Привезти заказ без подтверждения — вот агрессивное продвижение.
                          0
                          СМС — аналогичная звонку жесть, но чуть менее бесящая. Доставку по расписанию лучше тогда делать в приложении. Если человеку надо, то он настроит расписание в приложении/получит пуш.
                      0
                      Посмотрев на ваши вычисления косинусов (у меня первое значение 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 — зависимость есть?

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

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое