Skip to content

Latest commit

 

History

History
101 lines (80 loc) · 12.7 KB

README.md

File metadata and controls

101 lines (80 loc) · 12.7 KB

MTS.Teta ML Project
Next Basket Recommendation

Сервис для предсказания следующей покупки пользователя

1. Цель

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

  • 🖼 Для контекстной рекламы
  • 📧 Для составления персонализированных рассылок и акций
  • 🛍 Для предложения конкретного набора товаров пользователю с целью ускорить процесс совершения покупки
  • 🛒 Для указания возможных для добавления в корзину товаров перед оплатой

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

2. Математическая постановка задачи

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

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

В качестве метрики качества была выбрана F1-score. Она учитывает в себе как точность (Precision), так и полноту (Recall) предсказаний, являясь их средним гармоническим, что позволяет не делать выбор в пользу одной из них.

При этом заметим, что, несмотря на использование в алгоритме параметров top_k и подобных, использование метрик Precision@k и/или Recall@k не приминимо к задаче, так как размер корзин пользователей разный, и применение подобных метрик свело бы текущую задачу к "обычным рекомендациям".

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

3. Данные

Датасет был взят из Kaggle соревнования. Он представляет из себя таблицу с тремя колонками - user_id, order_completed_at и cart.

user_id order_completed_at cart
0 2 2015-03-22 09:25:46 399
1 2 2015-03-22 09:25:46 14
2 2 2015-03-22 09:25:46 198
3 2 2015-03-22 09:25:46 88
4 2 2015-03-22 09:25:46 157

Здесь cart - id небольшой категории товаров, но модель может работать и с данными, где последняя колонка содержит id конкретных товаров.

Всего в датасете 3123064 записей о покупках 20000 пользователей. Временной диапазон данных: с марта 2015 года по сентябрь 2020 года.

4. Варианты решения задачи

  • Базовые модели - 1. Typical baselines.ipynb
    • Рекомендовать топ популярных товаров
    • Рекомендовать топ популярный товаров лично каждого пользователя
    • Рекомендовать такие же товары, как пользователь купил в последний раз
  • Продвинутая агрегация исторических данных (лучший результат) - 3. TIFU KNN.ipynb
  • Решение на основе классификации при помощи random forest - 4. ML Solution.ipynb

Подробнее о каждом варианте решения можно узнать в соответствующем ноутбуке.

Из не рассмотренных вариантов также стоит отметить нейросетевой подход DREAM, который требует гораздо больших вычислительных и временных ресурсов, но по результатам публичных исследований выдает результаты меньше, чем подход TIFU KNN.

5. Итоговая модель и результат

Лучшим решением оказалась вариация алгоритма TIFU KNN.

  1. Максимальный (средний по трем последним покупкам) результат F1: bestScore = 0.39744
  2. Прирост по сравнению с baseline моделями:
    • User last cart: +0.069 (0.32841)
    • Top personal recs: +0.073 (0.32415)
    • Top global recs: +0.022 (0.37593)
  3. Валидация модели производилась при помощи проверки алгоритма на последних, предпоследних и предпредпоследних покупках пользователей из датасета.
    Среднеквадратичное (стандартное) отклонение по трем последним покупкам σ = 0.013
    Была замечена тендеция уменьшения значения метрики при проверке алгоритма на более ранних данных: с увеличением level (см. 3. TIFU KNN.ipynb) происходило уменьшение метрики.
    Это может быть связано с:
    • Уменьшением данных для "обучения" - чем более ранние покупки берем для проверки, тем больше данных отрезаем.
    • Уменьшением количества задействованных товаров - часть товаров была использована впервые лишь в последних покупках.
    • Уменьшением количества пользователей, так как алгоритм использует поиск ближайших соседей для каждого пользователя
  4. Строго говоря, итоговое решение представляет из себя алгоритм агрегации данных о покупках пользователей. В связи с этим нельзя выделить важность признаков.
  5. Слабым сегментом модели являются новые пользователи, которые совершили очень мало покупок или не совершали совсем. В таких случаях можно рассматривать использование baseline моделей для рекомендации подобным пользователям просто популярных товаров.
  6. Вероятно, сильным сегментом модели являются пользователи с большой историей схожих между собой покупок.
  7. О деградации модели:
    В среднем модель, чтобы не падать в качестве ниже значения метрики bestScore - σ, требует переобучения после 2-х покупок большинства пользователей.
    Cредний интервал между покупками всех пользователей в датасете составляет 2 дня и 5 часов.
    Таким образом, максимальный срок использования одной модели, после которого она начинает падать в качестве больше, чем на σ, составляет около 4.5 дней. При наличии возможностей переобучать модель следует примерно раз в 2 дня.

6. Оценка экономического эффекта

Произвести офлайн оценку экономического эффекта данной задачи достаточно трудно, т.к. доп.прибыль будет только от тех товаров, которые пользователь сам не купил бы (и не увидел/вспомнил), а с данной рекомендательной системой - купит. А мы располагаем историческими данными только о, конечно реальных покупках.

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

  • доход с пользовательской сессии
  • средний чек
  • клики и т.д.

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

7. Демо

Запуск

git clone https://github.com/sokolcom/mts-teta-nbr.git
cd mts-teta-nbr/demo
streamlit run main.py

Использование

  1. Выбираем модель и параметры
  2. Вводим id пользователя (1-19999)
  3. Можем сами собрать этому пользователю ещё одну корзину для уточнения рекомендаций
  4. Получаем рекомендации