Как Мы Разрабатываем Персональные Рекомендации По Продуктам



Как мы разрабатываем персональные рекомендации по продуктам

Клиенты нашего магазина хотят делать крутой маркетинг.

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

И каждый раз думают: «Что мне написать в письмеЭ» Можно просто написать: «Покупайте у нас чаще!», но это не особо работает. Лучшая идея — вставить в письмо рекламу продукта.

Целесообразно рекламировать товары, которые заинтересуют покупателей.

Далее я расскажу, как мы с нуля сделали настоящие персональные рекомендации.

Выбираем, что порекомендовать Рекомендовать можно что угодно.

Вы можете порекомендовать наиболее покупаемые товары.

Например, в магазине электроники это жесткие диски и мобильные телефоны.

А как быть тем, у кого они уже есть? Получается, что всем рекомендуют одно и то же – не очень круто.

Можно порекомендовать что-то похожее на то, что человек посмотрел на сайте - например, посмотрел обувь, порекомендуем.

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

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

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

Так мы начали давать универсальные персональные рекомендации.

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



Как мы разрабатываем персональные рекомендации по продуктам

Преобразование списка покупок в матрицу клиент-продукт Далее мы используем совместная фильтрация .

Интуиция здесь проста: покупатель №1 купил товар №1 и два товара №3; покупатель №2 также купил товар №1 – вероятно, он захочет купить товар №3. Совместная фильтрация предполагает разложение одной большой разреженной матрицы на две плотные вытянутые матрицы.

скрытые черты значительно меньше по размеру.

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

После обучения модели мы получаем скрытые функции для всех клиентов и всех продуктов.

Они представлены в виде матриц (количество клиентов х количество функций) и (количество продуктов х количество функций) соответственно.

Скрытые черты – это черты, которые нигде явно не указаны, как, скажем, рост человека или площадь квартиры.

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

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

С большой долей условности можно сказать, что там, где были большие цифры, там и будут большие цифры – примерно единица.

Где меньше, там меньше.

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

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



Как мы разрабатываем персональные рекомендации по продуктам

Покупки, которые сильно влияют друг на друга, выделены одним цветом.

В рамке указаны некоторые будущие рекомендации.

Теперь, если мы возьмем вектор характеристик конкретного клиента и умножим его на матрицу характеристик продукта, то получим вектор оценок всех продуктов этого клиента.

Останется только выбрать из него несколько товаров с максимальной скоростью.

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

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

Мы провели AB-тесты, в которых сравнивали личные рекомендации с бестселлерами.

В некоторых случаях разницы не было, но в других наблюдался статистически значимый рост конверсии заказов до 10%.

В основном это были магазины с высокой частотой покупок и соответственно большим объемом данных.

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

Хотя бы потому, что у многих покупателей вообще нет покупок.

Поэтому мы решили улучшить наши рекомендации.



Добавление информации обо всех действиях

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



С учетом продолжительности действия

Мы посчитали, что покупка вчера и покупка год назад не должны оказывать одинаковое влияние на рекомендации.

Поэтому мы ввели экспоненциальный коэффициент забывания для всех действий.

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

.



Учитываем очевидные признаки

В нашей базе данных содержится самая разнообразная информация.

Мы решили, что нужно использовать всё.

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

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

Чтобы прикрепить все это к модели, мы:

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

  2. На основе характеристик продукции и существующей матрицы клиент-продукт восстанавливаем парные дополнительные характеристики для клиентов.

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

    Эти дополнительные возможности мы приклеиваем к уже существующим скрытым.

  3. То же самое мы делаем с атрибутами клиента.



Как мы разрабатываем персональные рекомендации по продуктам

Дополнение скрытых черт явными.

Теперь у нас больше признаков и мы можем давать более точные рекомендации.

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

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

Настройка гиперпараметров

Сначала о метриках

Конечно, мы постоянно тестировали наши рекомендации.

Мы проводили как оффлайн, так и онлайн-тесты.

Конечно, онлайн-тесты AB — более надежный способ проверить, насколько хороши рекомендации.

И эти испытания показали хорошие результаты.

Однако онлайн-тесты ужасно неудобны:

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

  • Затем вам нужно подождать день/неделю/два, чтобы получить какие-либо статистически значимые результаты.

  • Вам нужно повторить это 100 раз, чтобы протестировать 100 различных вариантов.

Поэтому без офлайн-тестов не обойтись.

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

В качестве офлайн-метрики мы выбрали популярную и простую: nDCG@K (нормированный дисконтированный совокупный выигрыш при K) , а точнее его среднее значение для нескольких тысяч клиентов.

Ээтот показатель качества рейтинг .

Он принимает значения от 0 до 1 и показывает, насколько хороши рекомендации.

Чтобы рассчитать значение метрики, вам нужны стандартные — идеальные рекомендации.

У нас нет такого стандарта.

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

Но мы никогда об этом не узнаем.

И еще: возможно, мы рекомендовали синюю шапку с помпоном, но клиентка купила синюю шапку без помпона.

Товары вроде бы похожие, но разные - метрика проседает. Поэтому при расчете метрики мы стали учитывать схожесть продуктов.



А теперь о гиперпараметрах

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

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

Некоторые модификации никуда не повлияли.

Некоторые показали улучшения на всех проектах — мы их зафиксировали.

Причем одни улучшили метрики на ряде проектов, а на других ухудшили.

Итак, мы получили настройка гиперпараметра .

На данный момент у нас есть 11 гиперпараметров.

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

После настройки оказалось, что в среднем метрика по всем проектам увеличилась в 6 раз, а самый сильный прирост составил 35 раз! Улучшение функциональности Мы можем дать хорошие личные рекомендации.

Прохладный.

Но как они работают? Примерно так: каждую ночь, когда нагрузка на сервера спадает, мы запускаем перерасчет рекомендаций по всем проектам.

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

Они попадают в специальное хранилище и ждут, когда их оттуда заберут. Почему они это возьмут? Например, отправить письмо.

Звучит отлично.

Или показать на сайте.

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

Но вам нужен мобильный телефон! Как быть? Пришло время дать рекомендации, которые работают в режиме реального времени.

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

Мы по-прежнему обучаем модель один раз в день.

И теперь мы можем выдавать рекомендации онлайн.

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

В запросе указывается, кто что сделал и с каким продуктом.

Алгоритм рекомендаций обрабатывает этот запрос и в ответ генерирует список рекомендаций для этого клиента.

Чтобы это стало возможным, нам понадобилось:

  1. Сделайте хранилище, где будут храниться модели после обучения.

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

  3. Значительно ускоряют наши рекомендации.

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

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

  4. Создайте микросервис, который отслеживает действия человека на сайте, отправляет запрос на рекомендации, принимает эти рекомендации и показывает их человеку.

И эта адская машина заработала.

И это сработало быстро.

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

Чтобы было понятнее, что такое быстро: мы можем выдержать нагрузку в 7000 об/мин (запросов в минуту), используя всего 3 ядра процессора Intel Xeon 2,6 ГГц.

Именно такую нагрузку обеспечивают два наших крупнейших клиента в периоды пиковой активности.

Что дальше Кажется, мы выжали из нынешней модели все, что могли.

Дальнейшее совершенствование потребует фундаментальных изменений.

Один из вариантов улучшения — предварительное сегментирование покупателей на группы.

Люди ведут себя по-разному: кто-то покупает часто и понемногу, кто-то редко, но в больших количествах, кто-то покупает дорогие товары, кто-то дешево.

По сути, модель сама должна находить такие группы и рекомендовать то, что им нужно.

Но это может быть сложно, например, если группы небольшие.

Например, небольшая группа юридических лиц.

Или группа мужчин в женском магазине.

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

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

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

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

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

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

Так что мы продолжаем совершенствоваться и постараемся написать о том, что мы делаем.

Мы не прощаемся :) Теги: #Маркетинг #аналитика #машинное обучение #персональные рекомендации #совместная фильтрация #Алгоритмы #Машинное обучение #Интернет-маркетинг

Вместе с данным постом часто просматривают: