Top Banner
Товарные рекомендации в интернет-магазине: опыт внедрения Андрей Зимовнов lead data scientist ozon.ru
27

2 bdw.key

Jul 19, 2015

Download

Data & Analytics

antishmanti
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 2 bdw.key

Товарные рекомендации в интернет-магазине:

опыт внедренияАндрей Зимовнов lead data scientist

ozon.ru

Page 2: 2 bdw.key

Товарные рекомендации

Page 3: 2 bdw.key

Что было до нас, далекий 2012

Сбор логов в SQL сервере

• хранятся окном в неделю

• плохая детализация

• неудобно анализировать

Рекомендации считаются на SQL

• считаются медленно

• неподдерживаемый и нерасширяемый код

Page 4: 2 bdw.key

Первый подход: Python

• Придумываем новые признаки, решаем проблему холодного старта.

• Применяем машинное обучение для настройки модели.

• Запускаем тест на ограниченном ассортименте книжного каталога.

• Получаем прирост конверсии в добавления в корзину из полки рекомендаций.

Page 5: 2 bdw.key

Второй подход: С++

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

• Переписываем движок на C++ с распараллеливанием на OpenMP.

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

• Запускаем тест, опять получаем прирост.

Page 6: 2 bdw.key

Что дальше?

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

Но есть и другие проблемы:

• SQL сервер - неудобное хранилище для больших объемов данных, которые хочется обрабатывать не только SQL запросами.

• Нам нужны детальные логи, их надо собирать и где-то хранить.

Page 7: 2 bdw.key
Page 8: 2 bdw.key

Архитектура платформы

Счетчик SQL серверПотоки данных

Hadoop кластер

HDFS, Hive

RabbitMQ + Flume Sqoop

Алгоритмы

Cassandra

Сервис

Page 9: 2 bdw.key

Data Volume & Velocity

• Логи со счетчика (трек действий пользователя, добавления в корзину, просмотры товаров, поиски, просмотры каталогов и многое другое) - 100 events/sec, 15 GB/day (raw).

• Заказы.

• Описания товаров, цены, доступность, ветки каталогов - 8 млн. постоянно обновляемых товаров.

Page 10: 2 bdw.key

На чем писать алгоритмы?

Первый блин комом: Java.

Плюсы:

• Работает быстро

Минусы:

• Многословна, не видно логики, математикам сложно расширять или улучшать.

• Бедное MapReduce API. Например, на каждый tuple (кортеж) приходится писать свой класс.

Page 11: 2 bdw.key

Может можно проще?Дубль два: Apache Spark.

Плюсы:

• Python/Scala API

• Более богатое API, чем у MapReduce: map и reduceByKey - частные случаи операций, еще есть join, distinct, intersection, ...

• Умеет кэшировать данные в памяти, помогает итерационным алгоритмам.

• Умеет работать с Hive таблицами.

Минусы:

• Проект активно развивается, но сыроват: не все работает из коробки, надо тьюнить под разный размер задачи.

Page 12: 2 bdw.key

SQL на больших данных?Hive on TEZ: выполняет SQL-like запросы поверх больших таблиц в HDFS.

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

Плюсы:

• Все, что можно выразить SQL запросом считается быстро.

Минусы:

• Если SQL не хватает, то нужно писать UDF (User-Defined Function) на Java.

Page 13: 2 bdw.key

Рабочий вариантЛучше всего работает комбинация: 40% Apache Spark (Python) + 50% Hive on TEZ + 10% Hive UDF (Java).

Плюсы:

• Парсить данные удобно в Spark на Python, дальше их можно сложить в Hive таблицу и продолжить обработку SQL запросом.

• ~ 70% code reuse между прототипом и продакшеном: как правило на UDF переписываются только критичные по производительности и не очень сложные функции, которые достаточно универсальны.

• Математики могут улучшать алгоритмы (нужно знать Python и SQL)!

Минусы:

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

Page 14: 2 bdw.key

Пример из рекомендаций

Рассмотрим матрицу Item-User, где в ячейке записана 1, если пользователь u покупал товар i.

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

u1 u2 u3 u4

i1 1 1 1

i2 1

i3 1 1

Page 15: 2 bdw.key

Пример из рекомендацийРешение на Java (только часть кода):

Page 16: 2 bdw.key

WAT?

Page 17: 2 bdw.key

Пример из рекомендаций

Решение на Hive (пусть векторы нормированы):

Page 18: 2 bdw.key

NOT BAD!

Page 19: 2 bdw.key

Модель и целевой вектор

• Для начала выбрали линейную модель.

• Целевой вектор базируется на информации о добавлениях в корзину в сессии после просмотра товара.

• Надежда на то, что целевой вектор коррелирует с интересующим показателем конверсии в покупку из полки.

Page 20: 2 bdw.key

Как настраивали

• Матрица признаков размером 40 ГБ (сжатых бинарных данных).

• Функционал качества: NDCG@50.

• Различные алгоритмы black-box оптимизации.

• Обучение написали на Spark, и это удобно.

• В Spark MLlib есть и готовые алгоритмы.

Page 21: 2 bdw.key

Пример: покоординатный спуск на Spark

Page 22: 2 bdw.key

Результаты и планы

• Увеличение конверсии блока на 7% в AB-тесте, заметный прирост в деньгах.

• Построили платформу, не придется менять технологии при увеличении объема данных.

• Можем усложнять модель.

• Работаем над прототипом персонализации.

Page 23: 2 bdw.key

Тест стороннего сервиса

Page 24: 2 bdw.key

А что кроме рекомендаций?

• Аксессуары и бандлы

• Прогнозирование продаж

• Оптимизация формулы ранжирования поиска (настраивались на клики)

• Оптимизация сортировки в каталогах (trade-off между ценой товара и вероятностью его покупки)

Page 25: 2 bdw.key

Как рождаются прототипы

Рабочая формула:Data scientists + Jupyter notebooks

• Практически вся работа математика происходит в веб-браузере в интерактивной консоли IPython, редко используется PyCharm.

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

• Работа с кластером в этом же окружении.

Page 26: 2 bdw.key

Пример: Jupyter notebooks

Page 27: 2 bdw.key

Спасибо за внимание!

Вопросы?