Сервис для предсказания следующей покупки пользователя
Бизнес-цель - повышение дохода интернет/магазинов и маркетплейсов за счет увеличения числа покупок старыми пользователями. Цель сервиса - по историческим данным о покупках пользователей наиболее точно предсказывать товары, из которых будет состоять следующая покупка каждого пользователя. Это может как увеличить разнообразие в его корзине и следовательно повысить ее стоимость, порекомендовав товары, о которых он не знал ранее, так и напомнить о забытых товарах, а также повысить лояльность пользователя к сервису за счет упрощения сбора корзины. Такие предсказания могут быть использованы:
- 🖼 Для контекстной рекламы
- 📧 Для составления персонализированных рассылок и акций
- 🛍 Для предложения конкретного набора товаров пользователю с целью ускорить процесс совершения покупки
- 🛒 Для указания возможных для добавления в корзину товаров перед оплатой
Данная задача из сферы продаж актуальна в связи с важной ролью интернет магазинов в жизни человека. Особенно в последние два года возможность покупать вещи и продукты из дома в несколько нажатий стала как никогда популярной и нужной.
Для соответствия оценки модели с (бизнес-)целью проекта будет удобно использовать следующий подход.
Для каждой пары пользователя и товара (из всех, которые он покупал ранее) итоговый алгоритм выдаст 1 или 0 в зависимости от того, купит ли этот пользователь этот товар в следующий раз или нет.
Сама по себе задача относится к классу RecSys. Модель получает для каждого пользователя набор продуктов, поэтому можно сказать, что решается задача ранжирования. Однако полагаем, что в данном случае не важен порядок отображения рекомендаций - допустим, товары предьявляются пользователю в случайном, меняющемся при обновлении страницы порядке, - а важно только их попадание в рекомендуемую корзину.
В качестве метрики качества была выбрана F1-score. Она учитывает в себе как точность (Precision), так и полноту (Recall) предсказаний, являясь их средним гармоническим, что позволяет не делать выбор в пользу одной из них.
При этом заметим, что, несмотря на использование в алгоритме параметров top_k
и подобных, использование метрик Precision@k и/или Recall@k не приминимо к задаче, так как размер корзин пользователей разный, и применение подобных метрик свело бы текущую задачу к "обычным рекомендациям".
Идеал, к которому необходимо стремиться - абсолютно точно предсказывать следующую корзину пользователя. Определение порогового значения F1 как меры успешности модели может быть сделано после первых АВ-тестов, дающих возможность оценить экономический эффект модели (см.п.6) и его связь с F1.
Датасет был взят из 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 года.
- Базовые модели -
1. Typical baselines.ipynb
- Рекомендовать топ популярных товаров
- Рекомендовать топ популярный товаров лично каждого пользователя
- Рекомендовать такие же товары, как пользователь купил в последний раз
- Продвинутая агрегация исторических данных (лучший результат) -
3. TIFU KNN.ipynb
- Решение на основе классификации при помощи random forest -
4. ML Solution.ipynb
Подробнее о каждом варианте решения можно узнать в соответствующем ноутбуке.
Из не рассмотренных вариантов также стоит отметить нейросетевой подход DREAM, который требует гораздо больших вычислительных и временных ресурсов, но по результатам публичных исследований выдает результаты меньше, чем подход TIFU KNN.
Лучшим решением оказалась вариация алгоритма TIFU KNN.
- Максимальный (средний по трем последним покупкам) результат F1: bestScore = 0.39744
- Прирост по сравнению с baseline моделями:
- User last cart: +0.069 (0.32841)
- Top personal recs: +0.073 (0.32415)
- Top global recs: +0.022 (0.37593)
- Валидация модели производилась при помощи проверки алгоритма на последних, предпоследних и предпредпоследних покупках пользователей из датасета.
Среднеквадратичное (стандартное) отклонение по трем последним покупкам σ = 0.013
Была замечена тендеция уменьшения значения метрики при проверке алгоритма на более ранних данных: с увеличениемlevel
(см.3. TIFU KNN.ipynb
) происходило уменьшение метрики.
Это может быть связано с:- Уменьшением данных для "обучения" - чем более ранние покупки берем для проверки, тем больше данных отрезаем.
- Уменьшением количества задействованных товаров - часть товаров была использована впервые лишь в последних покупках.
- Уменьшением количества пользователей, так как алгоритм использует поиск ближайших соседей для каждого пользователя
- Строго говоря, итоговое решение представляет из себя алгоритм агрегации данных о покупках пользователей. В связи с этим нельзя выделить важность признаков.
- Слабым сегментом модели являются новые пользователи, которые совершили очень мало покупок или не совершали совсем. В таких случаях можно рассматривать использование baseline моделей для рекомендации подобным пользователям просто популярных товаров.
- Вероятно, сильным сегментом модели являются пользователи с большой историей схожих между собой покупок.
- О деградации модели:
В среднем модель, чтобы не падать в качестве ниже значения метрики bestScore - σ, требует переобучения после 2-х покупок большинства пользователей.
Cредний интервал между покупками всех пользователей в датасете составляет 2 дня и 5 часов.
Таким образом, максимальный срок использования одной модели, после которого она начинает падать в качестве больше, чем на σ, составляет около 4.5 дней. При наличии возможностей переобучать модель следует примерно раз в 2 дня.
Произвести офлайн оценку экономического эффекта данной задачи достаточно трудно, т.к. доп.прибыль будет только от тех товаров, которые пользователь сам не купил бы (и не увидел/вспомнил), а с данной рекомендательной системой - купит. А мы располагаем историческими данными только о, конечно реальных покупках.
Таким образом, необходимо А/B тестирование в каждом из направлений, где может быть использован этот сервис. В ходе теста могут оцениваться такие экономические показатели, как:
- доход с пользовательской сессии
- средний чек
- клики и т.д.
В качестве совершенствования модели для повышения экономического эффекта можно при принятии решения о включении товара в рекомендации учитывать его маржинальность.
git clone https://github.com/sokolcom/mts-teta-nbr.git
cd mts-teta-nbr/demo
streamlit run main.py
- Выбираем модель и параметры
- Вводим id пользователя (1-19999)
- Можем сами собрать этому пользователю ещё одну корзину для уточнения рекомендаций
- Получаем рекомендации