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

в интернет-магазине: 

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

lead data scientist

ozon.ru
Товарные рекомендации
Что было до нас, далекий 2012
Сбор логов в SQL сервере
• хранятся окном в неделю
• плохая детализация
• неудобно анализировать
Рекомендации считаются на SQL
• считаются медленно
• неподдерживаемый и нерасширяемый код
Первый подход: Python
• Придумываем новые признаки, решаем проблему
холодного старта.
• Применяем машинное обучение для настройки
модели.
• Запускаем тест на ограниченном ассортименте
книжного каталога.
• Получаем прирост конверсии в добавления в
корзину из полки рекомендаций.
Второй подход: С++
• Хотим запустить тест на большем числе товаров,
но не можем: Python медленный, занимает много
памяти и работает в один поток.
• Переписываем движок на C++ с
распараллеливанием на OpenMP.
• Сложное обучение, матрица признаков не
помещается в память. Пишем дополнительный
код, используем диск.
• Запускаем тест, опять получаем прирост.
Что дальше?
Мы уперлись в ресурсы одного сервера, развивать
движок стало невозможно.
Но есть и другие проблемы:
• SQL сервер - неудобное хранилище для
больших объемов данных, которые хочется
обрабатывать не только SQL запросами.
• Нам нужны детальные логи, их надо собирать и
где-то хранить.
Архитектура платформы
Счетчик SQL серверПотоки данных
Hadoop кластер
HDFS, Hive
RabbitMQ + Flume Sqoop
Алгоритмы
Cassandra
Сервис
Data Volume & Velocity
• Логи со счетчика (трек действий пользователя,
добавления в корзину, просмотры товаров,
поиски, просмотры каталогов и многое другое)
- 100 events/sec, 15 GB/day (raw).
• Заказы.
• Описания товаров, цены, доступность, ветки
каталогов - 8 млн. постоянно обновляемых
товаров.
На чем писать алгоритмы?
Первый блин комом: Java.
Плюсы:
• Работает быстро
Минусы:
• Многословна, не видно логики, математикам
сложно расширять или улучшать.
• Бедное MapReduce API. Например, на каждый
tuple (кортеж) приходится писать свой класс.
Может можно проще?
Дубль два: Apache Spark.
Плюсы:
• Python/Scala API
• Более богатое API, чем у MapReduce: map и reduceByKey - частные
случаи операций, еще есть join, distinct, intersection, ...
• Умеет кэшировать данные в памяти, помогает итерационным алгоритмам.
• Умеет работать с Hive таблицами.
Минусы:
• Проект активно развивается, но сыроват: не все работает из коробки,
надо тьюнить под разный размер задачи.
SQL на больших данных?
Hive on TEZ: выполняет SQL-like запросы поверх больших
таблиц в HDFS.
Заметили, что в некоторых случаях 

SQL запросы выразительнее и понятнее 

даже Python кода на Spark.
Плюсы:
• Все, что можно выразить SQL запросом считается быстро.
Минусы:
• Если SQL не хватает, то нужно писать UDF (User-Defined
Function) на Java.
Рабочий вариант
Лучше всего работает комбинация: 

40% Apache Spark (Python) + 50% Hive on TEZ + 10% Hive UDF (Java).
Плюсы:
• Парсить данные удобно в Spark на Python, дальше их можно сложить в Hive
таблицу и продолжить обработку SQL запросом.
• ~ 70% code reuse между прототипом и продакшеном: как правило на UDF
переписываются только критичные по производительности и не очень
сложные функции, которые достаточно универсальны.
• Математики могут улучшать алгоритмы (нужно знать Python и SQL)!
Минусы:
• У каждого инструмента есть свои минусы. Но мы учимся использовать
сильные стороны разных инструментов.
Пример из рекомендаций
Рассмотрим матрицу Item-User, где в ячейке
записана 1, если пользователь u покупал товар i.
Одним из признаков рекомендательной системы
может быть косинусная мера похожести между
строчками матрицы (товарами).
u1 u2 u3 u4
i1 1 1 1
i2 1
i3 1 1
Пример из рекомендаций
Решение на Java (только часть кода):
WAT?
Пример из рекомендаций
Решение на Hive (пусть векторы нормированы):
NOT BAD!
Модель и целевой вектор
• Для начала выбрали линейную модель.
• Целевой вектор базируется на информации о
добавлениях в корзину в сессии после просмотра
товара.
• Надежда на то, что целевой вектор коррелирует с
интересующим показателем конверсии в покупку
из полки.
Как настраивали
• Матрица признаков размером 40 ГБ (сжатых
бинарных данных).
• Функционал качества: NDCG@50.
• Различные алгоритмы black-box оптимизации.
• Обучение написали на Spark, и это удобно.
• В Spark MLlib есть и готовые алгоритмы.
Пример: покоординатный спуск на Spark
Результаты и планы
• Увеличение конверсии блока на 7% в AB-тесте,
заметный прирост в деньгах.
• Построили платформу, не придется менять
технологии при увеличении объема данных.
• Можем усложнять модель.
• Работаем над прототипом персонализации.
Тест стороннего сервиса
А что кроме рекомендаций?
• Аксессуары и бандлы
• Прогнозирование продаж
• Оптимизация формулы ранжирования поиска
(настраивались на клики)
• Оптимизация сортировки в каталогах (trade-off
между ценой товара и вероятностью его покупки)
Как рождаются прототипы
Рабочая формула:

Data scientists + Jupyter notebooks
• Практически вся работа математика происходит в веб-
браузере в интерактивной консоли IPython, редко
используется PyCharm.
• Удобно делиться результатами экспериментов: сохранены
все шаги эксперимента, графики, встроенная HTML
визуализация.
• Работа с кластером в этом же окружении.
Пример: Jupyter notebooks
Спасибо за внимание!
Вопросы?

2 bdw.key

  • 1.
    Товарные рекомендации 
 в интернет-магазине:
 опыт внедрения Андрей Зимовнов
 lead data scientist
 ozon.ru
  • 2.
  • 3.
    Что было донас, далекий 2012 Сбор логов в SQL сервере • хранятся окном в неделю • плохая детализация • неудобно анализировать Рекомендации считаются на SQL • считаются медленно • неподдерживаемый и нерасширяемый код
  • 4.
    Первый подход: Python •Придумываем новые признаки, решаем проблему холодного старта. • Применяем машинное обучение для настройки модели. • Запускаем тест на ограниченном ассортименте книжного каталога. • Получаем прирост конверсии в добавления в корзину из полки рекомендаций.
  • 5.
    Второй подход: С++ •Хотим запустить тест на большем числе товаров, но не можем: Python медленный, занимает много памяти и работает в один поток. • Переписываем движок на C++ с распараллеливанием на OpenMP. • Сложное обучение, матрица признаков не помещается в память. Пишем дополнительный код, используем диск. • Запускаем тест, опять получаем прирост.
  • 6.
    Что дальше? Мы уперлисьв ресурсы одного сервера, развивать движок стало невозможно. Но есть и другие проблемы: • SQL сервер - неудобное хранилище для больших объемов данных, которые хочется обрабатывать не только SQL запросами. • Нам нужны детальные логи, их надо собирать и где-то хранить.
  • 8.
    Архитектура платформы Счетчик SQLсерверПотоки данных Hadoop кластер HDFS, Hive RabbitMQ + Flume Sqoop Алгоритмы Cassandra Сервис
  • 9.
    Data Volume &Velocity • Логи со счетчика (трек действий пользователя, добавления в корзину, просмотры товаров, поиски, просмотры каталогов и многое другое) - 100 events/sec, 15 GB/day (raw). • Заказы. • Описания товаров, цены, доступность, ветки каталогов - 8 млн. постоянно обновляемых товаров.
  • 10.
    На чем писатьалгоритмы? Первый блин комом: Java. Плюсы: • Работает быстро Минусы: • Многословна, не видно логики, математикам сложно расширять или улучшать. • Бедное MapReduce API. Например, на каждый tuple (кортеж) приходится писать свой класс.
  • 11.
    Может можно проще? Дубльдва: Apache Spark. Плюсы: • Python/Scala API • Более богатое API, чем у MapReduce: map и reduceByKey - частные случаи операций, еще есть join, distinct, intersection, ... • Умеет кэшировать данные в памяти, помогает итерационным алгоритмам. • Умеет работать с Hive таблицами. Минусы: • Проект активно развивается, но сыроват: не все работает из коробки, надо тьюнить под разный размер задачи.
  • 12.
    SQL на большихданных? Hive on TEZ: выполняет SQL-like запросы поверх больших таблиц в HDFS. Заметили, что в некоторых случаях 
 SQL запросы выразительнее и понятнее 
 даже Python кода на Spark. Плюсы: • Все, что можно выразить SQL запросом считается быстро. Минусы: • Если SQL не хватает, то нужно писать UDF (User-Defined Function) на Java.
  • 13.
    Рабочий вариант Лучше всегоработает комбинация: 
 40% Apache Spark (Python) + 50% Hive on TEZ + 10% Hive UDF (Java). Плюсы: • Парсить данные удобно в Spark на Python, дальше их можно сложить в Hive таблицу и продолжить обработку SQL запросом. • ~ 70% code reuse между прототипом и продакшеном: как правило на UDF переписываются только критичные по производительности и не очень сложные функции, которые достаточно универсальны. • Математики могут улучшать алгоритмы (нужно знать Python и SQL)! Минусы: • У каждого инструмента есть свои минусы. Но мы учимся использовать сильные стороны разных инструментов.
  • 14.
    Пример из рекомендаций Рассмотримматрицу Item-User, где в ячейке записана 1, если пользователь u покупал товар i. Одним из признаков рекомендательной системы может быть косинусная мера похожести между строчками матрицы (товарами). u1 u2 u3 u4 i1 1 1 1 i2 1 i3 1 1
  • 15.
    Пример из рекомендаций Решениена Java (только часть кода):
  • 16.
  • 17.
    Пример из рекомендаций Решениена Hive (пусть векторы нормированы):
  • 18.
  • 19.
    Модель и целевойвектор • Для начала выбрали линейную модель. • Целевой вектор базируется на информации о добавлениях в корзину в сессии после просмотра товара. • Надежда на то, что целевой вектор коррелирует с интересующим показателем конверсии в покупку из полки.
  • 20.
    Как настраивали • Матрицапризнаков размером 40 ГБ (сжатых бинарных данных). • Функционал качества: NDCG@50. • Различные алгоритмы black-box оптимизации. • Обучение написали на Spark, и это удобно. • В Spark MLlib есть и готовые алгоритмы.
  • 21.
  • 22.
    Результаты и планы •Увеличение конверсии блока на 7% в AB-тесте, заметный прирост в деньгах. • Построили платформу, не придется менять технологии при увеличении объема данных. • Можем усложнять модель. • Работаем над прототипом персонализации.
  • 23.
  • 24.
    А что кромерекомендаций? • Аксессуары и бандлы • Прогнозирование продаж • Оптимизация формулы ранжирования поиска (настраивались на клики) • Оптимизация сортировки в каталогах (trade-off между ценой товара и вероятностью его покупки)
  • 25.
    Как рождаются прототипы Рабочаяформула:
 Data scientists + Jupyter notebooks • Практически вся работа математика происходит в веб- браузере в интерактивной консоли IPython, редко используется PyCharm. • Удобно делиться результатами экспериментов: сохранены все шаги эксперимента, графики, встроенная HTML визуализация. • Работа с кластером в этом же окружении.
  • 26.
  • 27.