Как провести кросс-валидацию Leave One Out для систем рекомендаций Топ n?

Вопрос или проблема

Я новичок в создании систем рекомендаций. Я использую библиотеку surpriselib для оценки своих рекомендаций. Все метрики точности хорошо поддерживаются в этой библиотеке. Но я также хочу вычислить коэффициент попаданий в своей топ n системе рекомендаций.

Я знаю, что формула для коэффициента попаданий выглядит так:

(количество товаров, которые пользователи уже купили)/(количество пользователей)

Но это не имеет смысла для меня, потому что для обучения и тестирования рейтингов пользователей по товарам у меня есть только те пользователи в моем наборе данных, которые уже оценили все товары, которые есть в наборе данных. (**В конце концов, именно это позволяет мне измерять точность моих предсказаний рейтингов**)

Это означает, что я буду получать КОЭФФИЦИЕНТ ПОПАДАНИЙ 100% каждый раз!!!

Моя теория неверна, если нет, что я могу сделать, чтобы правильно измерить коэффициент попаданий?
Я знаю, что существует метод под названием кросс-валидация с оставлением одного, который может помочь мне в этом случае. Если это ответ, как это работает с топ n системами рекомендаций?

Вот моя процедура для вычисления “коэффициента попаданий с кросс-валидацией с оставлением одного”:

  1. оставить только одно фактическое взаимодействие пользователь-товар (это может быть рейтинг, покупка или что-то еще, с чем вы работаете в своих данных) из обучающего набора данных (это даст вам в общей сложности U “невидимых” взаимодействий, при условии, что у вас есть как минимум одно взаимодействие на пользователя);
  2. сгенерировать топ n рекомендаций для всех пользователей с помощью той рекомендации, которую вы используете;
  3. если пользователь действительно взаимодействовал с рекомендованным товаром (если “оставленный” товар находился среди топ n рекомендаций для этого конкретного пользователя) => это попадание.
    Коэффициент попаданий = сумма всех попаданий по пользователям (это может быть не более U, так как у вас может быть не более 1 попадания на пользователя) РАЗДЕЛИТЬ НА количество пользователей (U).

Ответ или решение

Для измерения Hit Rate в рекомендательных системах с использованием метода Leave-One-Out Cross Validation (LOOCV) можно следовать следующему алгоритму:

Шаги выполнения Leave-One-Out Cross Validation для рекомендации "Top N":

  1. Подготовка данных:
    Начните с вашей основной матрицы взаимодействий пользователей и предметов (например, оценок, покупок и т.д.). Убедитесь, что у вас есть хотя бы одно взаимодействие для каждого пользователя.

  2. Разделение данных:
    Для каждого пользователя вы должны оставить одно взаимодействие (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()
  3. Сгенерируйте 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  # Сохраните рекомендации
  4. Проверка 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
  5. Итоговое вычисление Hit Rate:
    Hit Rate — это отношение количества попаданий к общему числу пользователей, что будет отражать, насколько хорошо ваша модель рекомендаций справляется с задачей предложить пользователям именно те элементы, которые они ранее приобрели.

Заключение

Данный метод Leave-One-Out Cross Validation позволяет вам оценивать Hit Rate вашей рекомендательной системы, избегая искусственного завышения результата, связанного с использованием полной матрицы взаимодействий. Таким образом, теперь вы можете адекватно измерять эффективность ваших рекомендаций и улучшать свою модель.

Оцените материал
Добавить комментарий

Капча загружается...