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

Проблема в…

Что касается бизнеса, мы хотели со временем увеличить удержание клиентов и прибыль от клиентов. Обычная модель для многих предприятий (показанная здесь) - значительная часть доходов поступает от небольшого процента постоянных клиентов. Моя гипотеза заключалась в том, что предоставление персонализированных рекомендаций может повысить ценность отдельных заказов, что со временем приведет к увеличению доходов.

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

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

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

«Наша проблема сопоставления еды в ресторане имеет свои особенности, поскольку и заданный текст для сопоставления (например, пункт меню ресторана), и соответствующий текст в базе данных приложения (например, блюдо с его описанием) короткие по длине. Кроме того, как лексическая, так и грамматическая структура каждого слова имеет большее влияние на общую точность, чем это могло бы быть в случае стандартных настроек: к «мясному соусу для спагетти» нужно относиться иначе, чем к «спагетти с мясным соусом». Порядок слов также оказывает значительное влияние на общую точность сопоставления: к «молочному шоколаду» следует относиться иначе, чем к «молочному шоколаду». Все эти нюансы в совокупности делают непосредственное применение предыдущих задач сопоставления текста сложной задачей ».

Решение проблемы

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

Https://developer.squareup.com/blog/caviars-word2vec-tagging-for-menu-item-recommendations/

Этот подход имел для меня смысл (и хорошо соответствовал темам, которые я освещал в своем классе НЛП), поэтому я решил посмотреть, смогу ли я заставить его работать с моими данными!

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

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

Веб-парсинг до победы

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

Мне нужно было увеличить размер тренировочных данных. После некоторого исследования я наткнулся на AllMenu, агрегатор меню ресторанов в США.

Чтобы создать веб-парсер, я обратился к Scrapy. Scrapy предлагает мощную структуру, которая абстрагирует многие из более технических аспектов веб-скрапинга (регулирование, асинхронные задания), что позволяет мне сосредоточиться на идентификации и сборе данных, которые мне нужны.

Имея в руках мой новый веб-скребок, я смог найти более 1,8 миллиона уникальных пунктов меню и их описаний, что значительно увеличило мои обучающие данные!

Создание категорий продуктов питания с обучением без учителя

С новыми данными я обучил модель Word2Vec с помощью пакета Gensim. В отличие от того, когда модель обучалась только 50 000 пунктов меню, теперь я мог видеть значимые связи между словами. Посмотрите на 10 самых похожих слов для блинов - все продукты для завтрака, как и следовало ожидать!

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

Для этого я применил ту же технику, что использовали специалисты по обработке данных Caviar - для данного пункта меню (скажем, «черничные блины») я усреднил векторы слов для «черника» и «блины» вместе.

Если это сработает, я смогу использовать алгоритм кластеризации для группировки пунктов меню вместе. Я использовал кластеризацию KMeans, тестировал и проверял от 20 до 50 кластеров. Путем ручной проверки я обнаружил, что 30 из них дали наиболее значимые кластеры.

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

Наконец, я визуализировал кластеры с помощью t-SNE, метода уменьшения размерности, который особенно хорошо подходит для визуализации в двух измерениях. Результаты показывают четко различимые категории при раскрашивании по номеру кластера.

Рекомендации при обучении с учителем

Конечная цель - дать дополнительные рекомендации по мере того, как покупатель размещает заказ. Когда покупатель делает заказ через Интернет, товары добавляются в корзину по одному - процесс заказа выглядит примерно так:

[10 ”Маринара Пицца]

[10 дюймов Marinara Pizza, 1 20 унций кока-колы]

[10 дюймов Marinara Pizza, 1 20 унций кока-колы, 1 канноли]

В случае приведенного выше примера мы хотели бы порекомендовать Coca-Cola или cannoli’s клиентам, которые заказывают только пиццу, с целью повышения их удовлетворенности своим заказом и увеличения размера заказа.

Я создал обучающие данные, моделируя описанный выше процесс заказа. Во-первых, я использую модель K-средних, чтобы предсказать, к какой категории должен относиться каждый пункт меню в транзакции. Для каждой транзакции я перебираю все элементы в транзакции, каждый раз вытаскивая по одному элементу, который служит целью для прогнозирования, а остальные элементы - как функции. Это создает 1,6 миллиона примеров транзакций в качестве обучающих данных.

Разделив их на данные обучения и тестирования, я использовал библиотеку SKLearn для обучения модели мультиноминальной логистической регрессии на данных обучения. Модель достигает точности 71% при прогнозировании удерживаемой категории на тестовых данных.

Вот несколько простых тестов для сравнения: выбор случайной категории и выбор самой популярной категории. Случайная категория даст точность 3% (шанс 1 из 30). Фиктивная модель, которая каждый раз угадывает самую популярную категорию, будет правильной в 10,3% случаев. Модель логистической регрессии обеспечивает значительно более высокую точность, чем эти наивные исходные данные.

Обсуждение и следующие шаги

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

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

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

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

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