Трибуна
Epoch 8
1647

Epoch8.co — рекомендательная система для интернет-магазина на основе машинного обучения

Как нам удалось в два раза увеличить конверсию из просмотра товара в покупку по сравнению с лучшим рекомендательным алгоритмом в интернет-магазине нашего клиента.

В закладки

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

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

Как работают классические алгоритмы рекомендаций, и когда они ломаются

Классические алгоритмы рекомендаций работают так: машина ничего не знает про товар, кроме его идентификатора в базе.

Когда пользователь взаимодействует с товаром, алгоритм получает обучающие данные вида «человек посмотрел товар номер 1 и 2, затем купил товар номер 3; буду всегда рекомендовать товар номер 3 после просмотров 1 и 2» или «человек купил товары 3 и 4, наверное, это близкие товары, надо их рядом показать».

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

Но что делать, если товаров в вашем интернет-магазине гораздо больше, чем посетителей или товарный ассортимент очень часто меняется? Так бывает, если у вас, например, маркетплейс китайских товаров, магазин одежды с большим количеством новинок или доска объявлений, где каждый «товар» (объявление) уникально.

Альтернативный подход к формированию рекомендаций

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

Представим себе, что Алиса зашла на сайт крупного интернет-магазина bizon.ru с задачей подобрать хороший подарок на день рождения своему другу Бобу.

Сначала Алиса оценивает ассортимент магазина, чтобы понять, из чего выбирать.

Затем она вспоминает интересы Боба, например, так: «Боб любит экстремальный спорт, фотографировать и собирает коллекцию курительных трубок».

Курительных трубок на bizon.ru нет, поэтому Алиса выбирает подарки, связанные с экстремальным спортом и фотографией.

Это Боб и его интересы (по мнению Алисы)

Дальше Алиса разными способами фильтрует товары на bizon.ru и оценивает, насколько найденные товары соответствуют интересам Боба. Для этого каждый товар, который она просматривает, она оценивает по двум параметрам: насколько он «про экстремальный спорт» и насколько он «про фотографию».

GoPro: подходит для экстремальных съемок, фотографировать тоже что-то умеет.
Рация: пригодится «экстремальщику» в путешествии, а фотографу не нужна.
Умные часы: могут принести какую-то пользу «экстремальщику», а фотографу, скорее всего, не нужны.
Polaroid: не нужен «экстремальщику», зато может быть приятным аксессуаром для фотографа.
Дрон с фотокамерой: хорошо подходит и «экстремальщику», и фотографу.

Таким образом, у Алисы формируется список потенциальных подарков Бобу, отсортированных от самого подходящего к наименее подходящему.

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

Реализуем этот подход на практике

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

Мы реализовали такой подход к рекомендациям для одного из наших клиентов — крупного маркетплейса китайских товаров.

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

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

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

В течение первых минут работы рекомендательной системы «в бою» мы получили характерные профили покупателей.

Типичный женский профиль
И это тоже типичный женский профиль
Похоже, что этот покупатель — техногик
А этот профиль похож на профиль автолюбителя

Метрики

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

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

Преимущества такого подхода к построению рекомендаций

  • Для того, чтобы рекомендательная система заработала, нам не нужна история просмотров и покупок товара: алгоритм работает с «сутью» товара, а не с его безликим численным id.

  • Нет проблемы «холодного старта»: рекомендательная система начинает работать очень быстро: пользователю достаточно посмотреть 3-5 товаров, чтобы профиль пользователя заполнился, и алгоритм начал понимать его интересы.

  • Рекомендательная система может работать даже с плохой текстовой информацией, например, с наименованиями товаров в чеке.

Сложно ли интегрироваться?

Супер-просто.

Сначала мы забираем фид товаров вашего интернет-магазина и историю покупок товаров.

Затем мы выставляем для вас API с тремя методами:

  • Появился новый товар;

  • Пользователь просмотрел товар;

  • Дай мне рекомендации для такого-то пользователя.

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

Хочу тестировать, куда писать?

Пишите: hello@epoch8.co (мы пока в альфе, поэтому подключаем клиентов вручную).

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

Написать
{ "author_name": "Epoch 8", "author_type": "self", "tags": [], "comments": 19, "likes": 16, "favorites": 65, "is_advertisement": false, "subsite_label": "tribuna", "id": 62370, "is_wide": false, "is_ugc": true, "date": "Tue, 26 Mar 2019 12:02:53 +0300", "is_special": false }
0
{ "id": 62370, "author_id": 194003, "diff_limit": 1000, "urls": {"diff":"\/comments\/62370\/get","add":"\/comments\/62370\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/62370"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199116, "last_count_and_date": null }
19 комментариев
Популярные
По порядку
Написать комментарий...
2

Вы внедрили рекомендательную систему в магазин, который по сути работал без неё и получили супер-результат. Здорово, великолепно. А теперь дайте свои метрики по сравнению, скажем, с https://retailrocket.net/

Ответить
1

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

То есть наше решение встраивается в листинг не отдельным блоком типа "те, кто смотрел это еще смотрят другое", а сам порядок объектов в листинге меняется в соответствии с результатом работы системы персонализации.

Как пример: главный экран сервиса Wish или Joom, перечень и порядок объектов на этом экране - результат персонализации, он меняется в зависимости от вашего поведения.

Ответить
2

"До внедрения нашего алгоритма самым успешным рекомендательным алгоритмом в маркетплейсе был “топ продаваемых товаров”"
может это не ваша заслуга а косяк маркетплейса?

Ответить
0

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

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

В этом конкретном маркетплейсе кроме нашего решения стояла еще одна система персонализированных рекомендаций, которая сильно проигрывала "топу продаваемых товаров" по итогам А/Б теста.

Ответить
0

А если не секрет (я понимаю что это скользкая тема), как вы разделяете то value что дает ваше решение и остальное? например рекламные кампании стартующие одновремено с вами и тп

Ответить
1

A/Б тестирование разных стратегий рекомендации (не только нашей, но и конкурирующих) + система атрибуции покупки к конкретной стратегии.

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

После этого можно построить метрики для каждой стратегии:
- отношение количества показов к переходу в карточку товара
- отношение показов к оформленным заказам
- отношение показов к выручке

Ответить
1

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

Ответить
1

Мы предусматриваем возможность размещения системы в контуре у заказчика. Единственный нюанс - для переобучения потребуются сервера с GPU.

Ответить
1

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

Ответить
0

>> Этот подход хорошо работает, когда товаров существенно меньше, чем покупателей

А вот и нет)

Ответить
0

Виталий, вы не могли бы раскрыть что именно имеете ввиду?

Ответить
0

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

Ответить
0

Виталий, все верно, спасибо за уточнение.

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

Ответить
0

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

Ответить
0

Андрей, скорее всего нет.

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

Ответить
0

Ну как же... Утром мне готовить манную кашу, я покупаю манку и хорошее мороженое (лайфхак для каши), но не беру молоко, оно есть. Система всё равно подумает что шашлыки - если будет знать, что я планирую мясо в манке (для корочки, кста). А поймёт ли она, система, что подготовка идёт к каше. Или наоборот - к шашлыкам вместо каши?

Ответить
0

Лук и уксус! Никаких хипстерских шашлыков на киви!!!

Ответить
0

На вкус и цвет...

Ответить
0

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

О каких характеристиках идёт речь? Чтобы это работало, нужна подходящая разметка товаров, в вашем примере это "Экстремальность" и "Фотографичность".
В реальном мире в базе магазина для товаров лежат какие-нибудь измерения типа материала, цвета, толщины, веса, ширины, дальности, объёма и "наличия чехла".

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }