Как система может подобрать подходящий оффер или товар для клиента?

Ответ

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

1. Коллаборативная фильтрация (Collaborative Filtering - CF) Система рекомендует товары, которые понравились похожим пользователям. Мы реализовывали модель матричной факторизации (например, через библиотеку implicit или LightFM), которая хорошо работает с implicit feedback (просмотры, клики).

import implicit
from scipy.sparse import csr_matrix

# Создание sparse-матрицы взаимодействий пользователь-товар
user_item_matrix = csr_matrix((data['weight'], (data['user_id'], data['item_id'])))

# Обучение ALS модели
model = implicit.als.AlternatingLeastSquares(factors=64, iterations=20)
model.fit(user_item_matrix)

# Получение рекомендаций для пользователя
recommendations = model.recommend(user_id, user_item_matrix[user_id], N=10)

2. Контентная фильтрация (Content-Based Filtering) Рекомендации основаны на сходстве атрибутов товаров и профиля пользователя (например, история просмотров категорий). Мы использовали TF-IDF или эмбеддинги для описания товаров и косинусное сходство.

3. Гибридные системы Чаще всего мы комбинировали подходы для компенсации их слабостей (например, "холодный старт" у CF). Одна из архитектур:

  • Ранжирование (Ranking): Модель LightGBM или CatBoost принимала сотни признаков: выходы CF-модели, контентные признаки, исторические метрики пользователя, контекст (время, устройство).
  • Обучение проводилось на логах кликов/покупок.

Ключевые метрики для оценки A/B теста рекомендаций:

  • CTR (Click-Through Rate)
  • Conversion Rate
  • Precision@K / Recall@K (офлайн-метрики на hold-out выборке)
  • NDCG@K (учитывает порядок рекомендаций)

Важные аспекты:

  • Диверсификация: Добавление случайного шума или механизмов для показа новых товаров.
  • Актуальность: Учёт временных трендов и сезонности.
  • Интерпретируемость: Возможность объяснить рекомендацию ("потому что вы смотрели X") повышает доверие пользователя.

Ответ 18+ 🔞

Ну слушай, история с рекомендашками — это вообще отдельный вид искусства, а не инженерия. Тут как в хорошем борще: если переборщишь с чем-то одним, получится пиздопроебина, а не еда. Мы обычно такими тремя китами всё держали, иначе нихуя не работает.

1. Коллаборативная фильтрация (Collaborative Filtering - CF) Это когда система смотрит, какие товары облюбовали другие чуваки, похожие на тебя. Типа, «ваши единомышленники тоже скупали этот говняный соус, может, и вам залетит?». Мы юзали матричную факторизацию — штука мощная, особенно когда у тебя только implicit feedback, то есть не оценки, а клики и просмотры. Библиотеки implicit или LightFM — просто спасение, ёпта.

import implicit
from scipy.sparse import csr_matrix

# Создание sparse-матрицы взаимодействий пользователь-товар
user_item_matrix = csr_matrix((data['weight'], (data['user_id'], data['item_id'])))

# Обучение ALS модели
model = implicit.als.AlternatingLeastSquares(factors=64, iterations=20)
model.fit(user_item_matrix)

# Получение рекомендаций для пользователя
recommendations = model.recommend(user_id, user_item_matrix[user_id], N=10)

Но у этой модели есть одна хитрая жопа: если товар новый или пользователь только зарегился — она нихуя не посоветует, потому что данных ноль. Это называется «холодный старт», и он реально выносит мозг.

2. Контентная фильтрация (Content-Based Filtering) Тут уже умнее: система смотрит на сами товары. Ты, допустим, пять раз покупал чёрные носки с единорогами. Ну так вот, держи ещё двадцать пар чёрных носков с единорогами, пока не обносишься! Используем TF-IDF или эмбеддинги, чтобы описать товары, и потом ищем похожее через косинусное сходство. Проблема в том, что система превращается в заезженную пластинку и диверсификации — ноль ебать.

3. Гибридные системы Вот тут начинается магия, потому что по отдельности эти методы — как одноглазый слесарь: вроде и видит, но нихуя не делает. Мы их скрещивали, чтобы слабые места друг друга прикрывали. Классика жанра:

  • Ранжирование (Ranking): Запускаем, например, LightGBM или CatBoost. Кидаем в него овердохуища признаков: что нам наваяла CF-модель, что наконтрила контентная фильтрация, всю историю пользователя (кто, когда, что тыкал), плюс контекст — время суток, устройство. Модель учится на логах, кто что в итоге купил или проигнорировал.

На что смотрим, когда тестируем эту красоту в A/B:

  • CTR (Click-Through Rate) — сколько кликов на показы. Базовый показатель, но если только на него ориентироваться, можно скатиться в кликбейт.
  • Conversion Rate — а вот это уже серьёзнее, сколько реальных покупок.
  • Precision@K / Recall@K — офлайн-метрики, чтобы не ждать месяц A/B-теста, а прикинуть, не говно ли модель.
  • NDCG@K — король метрик, если важен порядок. Потому что хуйня на первом месте и геморрой на десятом — это две большие разницы.

А ещё куча подводных камней, без которых нихуя:

  • Диверсификация: Если показывать одно и то же, пользователь заскучает и уйдёт. Иногда надо подкинуть случайный товар или новинку, даже если модель не уверена. Иначе получится эхо-камера.
  • Актуальность: Тренды меняются быстрее, чем ты успеваешь сказать «ёперный театр». Летом — велосипеды, зимой — лыжи. Модель должна это чувствовать, а не рекомендовать санки в июле.
  • Интерпретируемость: Это вообще святое. Пользователь должен понимать, почему ему это предложили. Фраза «потому что вы смотрели вот это» вызывает в разы больше доверия, чем молчаливая выдача какого-то хуя с горы. Доверия ебать ноль — и пользователь просто забивает.