Вопрос или проблема
Я новичок в создании систем рекомендаций. Я использую библиотеку surpriselib для оценки своих рекомендаций. Все метрики точности хорошо поддерживаются в этой библиотеке. Но я также хочу вычислить коэффициент попаданий в своей топ n системе рекомендаций.
Я знаю, что формула для коэффициента попаданий выглядит так:
(количество товаров, которые пользователи уже купили)/(количество пользователей)
Но это не имеет смысла для меня, потому что для обучения и тестирования рейтингов пользователей по товарам у меня есть только те пользователи в моем наборе данных, которые уже оценили все товары, которые есть в наборе данных. (**В конце концов, именно это позволяет мне измерять точность моих предсказаний рейтингов**)
Это означает, что я буду получать КОЭФФИЦИЕНТ ПОПАДАНИЙ 100% каждый раз!!!
Моя теория неверна, если нет, что я могу сделать, чтобы правильно измерить коэффициент попаданий?
Я знаю, что существует метод под названием кросс-валидация с оставлением одного, который может помочь мне в этом случае. Если это ответ, как это работает с топ n системами рекомендаций?
Вот моя процедура для вычисления “коэффициента попаданий с кросс-валидацией с оставлением одного”:
- оставить только одно фактическое взаимодействие пользователь-товар (это может быть рейтинг, покупка или что-то еще, с чем вы работаете в своих данных) из обучающего набора данных (это даст вам в общей сложности U “невидимых” взаимодействий, при условии, что у вас есть как минимум одно взаимодействие на пользователя);
- сгенерировать топ n рекомендаций для всех пользователей с помощью той рекомендации, которую вы используете;
- если пользователь действительно взаимодействовал с рекомендованным товаром (если “оставленный” товар находился среди топ n рекомендаций для этого конкретного пользователя) => это попадание.
Коэффициент попаданий = сумма всех попаданий по пользователям (это может быть не более U, так как у вас может быть не более 1 попадания на пользователя) РАЗДЕЛИТЬ НА количество пользователей (U).
Ответ или решение
Для измерения Hit Rate в рекомендательных системах с использованием метода Leave-One-Out Cross Validation (LOOCV) можно следовать следующему алгоритму:
Шаги выполнения Leave-One-Out Cross Validation для рекомендации "Top N":
-
Подготовка данных:
Начните с вашей основной матрицы взаимодействий пользователей и предметов (например, оценок, покупок и т.д.). Убедитесь, что у вас есть хотя бы одно взаимодействие для каждого пользователя. -
Разделение данных:
Для каждого пользователя вы должны оставить одно взаимодействие (item) из вашего набора данных, которое будет использоваться как тестовый пример. Это можно сделать с помощью следующего кода:import pandas as pd from surprise import Dataset, Reader # Загрузите ваши данные в DataFrame df = pd.read_csv('ваши_данные.csv') reader = Reader(rating_scale=(1, 5)) # Задайте диапазон оценок data = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader) trainset = data.build_full_trainset()
-
Сгенерируйте Top N рекомендации:
После того как вы исключили одно взаимодействие для каждого пользователя, используйте вашу рекомендательную модель для генерации Top N рекомендаций для всех пользователей, основываясь на оставшихся данных.from surprise import KNNBasic, accuracy algo = KNNBasic() algo.fit(trainset) top_n = {} for uid in trainset.all_users(): # Получите все предсказания для пользователя predictions = algo.get_neighbors(uid, k=n) # Здесь n - количество рекомендуемых элементов top_n[uid] = predictions # Сохраните рекомендации
-
Проверка Hit Rate:
Для расчета Hit Rate проверьте, было ли оставленное взаимодействие среди Top N рекомендаций для каждого пользователя. Если да, это считается попаданием (hit).hits = 0 total_users = len(trainset.all_users()) for uid in trainset.all_users(): left_out_item = ... # Определите какое взаимодействие было исключено if left_out_item in top_n[uid]: hits += 1 hit_rate = hits / total_users
-
Итоговое вычисление Hit Rate:
Hit Rate — это отношение количества попаданий к общему числу пользователей, что будет отражать, насколько хорошо ваша модель рекомендаций справляется с задачей предложить пользователям именно те элементы, которые они ранее приобрели.
Заключение
Данный метод Leave-One-Out Cross Validation позволяет вам оценивать Hit Rate вашей рекомендательной системы, избегая искусственного завышения результата, связанного с использованием полной матрицы взаимодействий. Таким образом, теперь вы можете адекватно измерять эффективность ваших рекомендаций и улучшать свою модель.