Lifehacks for recsys
Курсы/видео, которые можно пройти:
- МТС. Your first recsys (Дальше идёт углубленный курс и соревнование, курсы связаны друг с другом, в конце страницы курса есть ссылка на продолжение)
- Более глубокое изучение recsys на Курсере
- Кукбук от Яндекса на ютубе
- Рексис на коленке от VK на ютубе
Вообще на ютубе куча видео (даже на русском!) по рексисамБиблиотеки:
Библиотеки:
- специализированные: implicit и LightFM (Используются для коллаборативной фильтрации и гибридных методов)
- Градиентный бустинг ( catboost / XGBoost / LightGBM )
- рандом, который есть на github:
- surprise (аддон к scipy, есть knn, svd, pmf, nmf)
- EasyRec (штука от алибабы с моделями их разработки)
- подборка от Microsoft
- turicreate от Apple. Легка в использовании: скармливаем данные от объектов, матрицу взаимодействий, получаем на выходе рекомендации для юзера/объекта
Pandas lifehacks
Библиотеки для recsys используют на входе разреженные матрицы, поэтому загружаем данные в scipy.sparse
TP - True Positive - модель рекомендовала объект, с которым пользователь провзаимодействовал
FP - False Positive - модель рекомендовала объект, с которым пользователь не провзаимодействовал
TN - True Negative - модель не рекомендовала объект, с которым пользователь не провзаимодействовал
FN - False Negative - модель не рекомендовала объект, с которым пользователь провзаимодействовал
Популярные метрики для recsys:
Модели
SVD
Для каждого пользователя считаем скалярное произведение со всеми объектами и выбираем топ объектов по полученным значениям
implicit kNN
❗ВАЖНО: kNN медленно работает, если число объектов большое. Поэтому есть такое решение - Approximately Nearest Neighbour. По этой штуке на гитхабе есть бенчмарк, разные датасеты - разные топовые модели
Доступны 3 модели, все item-ориентированы(схожесть объектов, а не пользователей):
Последние две модели подходят для количественных признаков (количество прослушиваний, суммарная длительность просмотра и т.д.)
Гиперпараметр один для всех - K, число соседей, число элементов в нашем топе
Процесс обучения - поиск К ближайших соседей для каждого объекта и сохранение схожести с ними
Как реализуется построение рекомендаций:
- Для каждого объекта из матрицы взаимодействий создаём топ К похожих объектов, суммируем топы, повторяющиеся объекты имеют больший вес
- Получаем из суммированного топа наш топ К
- fit
- recommend
- user_id - номер строки, ID пользователя, для которого строим рекомендации
- user_item_matrix - разреженная матрица с нашими взаимодействиями
- N - топ рекомендаций
- filter_already_liked_items - флаг для исключения уже известных объектов (user_item_matrix) Принимает значения True/False
- filter_items - список столбцов (объектов), которые нужно исключить
- Возвращает список кортежей (tuple) - (столбец(item_id), схожесть)
implicit iALS (можно использовать на GPU!)
implicit - переход от предсказания значений к предсказанию релевантности, учитывая веса
ALS - метод оптимизации, в котором мы поочерёдно фиксируем одну матрицу и делаем оптимизационный шаг по другой
Функционал идентичен implicit kNN
Входная матрица интерпретируется как матрица весов с, обозначающих степень уверенности в факте взаимодействия
Есть возможность сделать предсказания для юзеров, которых не было при обучении, но для которых известны несколько взаимодействий. Для этого в методе recommend используем параметр recalculate_user
Итоговые предсказания должны использоваться только для ранжирования
- factors - размерность вектора
- iterations - количество итераций (1 итерация - проход по P и Q)
- regularization - регуляризация
- use_gpu
- random_state
При повторном вызове fit, метод делает ещё итерации на основе уже имеющихся векторов
LightFM
Отличительная фишка - модель строит отдельные вектора для фичей юзера и объекта. В качестве их векторных представлений берётся сумма векторов их фичей.
Обучается с помощью SGD. Есть две вариации:
Для начала собираем датасет в нужном виде. Для этого на вход классу lightfm.data.Dataset подаём следующие данные:
- users - ID пользователей
- items - ID объектов
- user_features - имена фичей юзеров
- item_features - имена фичей объектов
build_interactions - построение матрицы взаимодействий на основе списка кортежей вида:
build_user_features/build_item_features - построение матрицы фичей на основе кортежей вида:
На практике самый крутой метод, обычно выдаёт наилучший результат.
Основная идея - переход от проверки качества предсказания значения к предсказанию качества ранжирования.
Достигается это путём сэмплирования негативных примеров и построения функции ошибки на основе соотношения предсказанных значений
- Берём пользователя u
- Выбираем объект i, с которым он взаимодействовал
- Выбираем случайный объект j, с которым он не взаимодействовал
- Считаем скалярные произведения p = (u, i) и n = (u, j)
- Сравниваем p и n
Количество сэмплирований - гиперпараметр max_sampled
- no_components - размерность вектора
- learning_rate - лёрнинг рейт при обучении в SGD
- user_alpha/item_alpha - регуляризация по векторам пользователей и объектов
- random_state
Есть loss-зависимые параметры, например для WARP:
- max_sampled - максимальное количество сэмплирований негативных примеров для одной позитивной пары (пользователь, объект). Увеличение приводит к росту качества, но обучение замедляется
Предсказания в lightfm сырые, метод model.predict возвращает массив скоров по заданным парам (пользователь, объект)