Введение в рекомендательную систему Заметки об исследовании

искусственный интеллект

«Это первый день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г.".

1. Введение в рекомендательную систему

1.1 Концепция и предыстория

  • Что такое рекомендательная система

    ​Наш сервис посещают пользователи, у которых нет четких потребностей, а элементы в сервисе представляют собой информационную перегрузку для пользователя.Система сортирует элементы по определенным правилам, и отображает элементы впереди для пользователя.Такая система это рекомендательная система.

  • Информационная перегрузка и неясные потребности пользователей

    • Категория: Охватывает небольшое количество популярных веб-сайтов. Типичное приложение: Hao123 Yahoo
    • Поисковые системы: определяйте потребности с помощью условий поиска. Типичное приложение: Google Baidu
    • Система рекомендаций: она не требует от пользователей предоставления явных потребностей и моделирует интересы пользователей, анализируя историческое поведение пользователей, чтобы активно рекомендовать пользователям информацию, которая может удовлетворить их интересы и потребности.
  • Система рекомендаций и поисковая система

    поиск рекомендовать
    Поведение инициатива пассивный
    намерение чистый Нечеткий
    персонализировать слабый мощный
    Распределение трафика Эффект Мэтью эффект длинного хвоста
    Цель быстрое удовлетворение непрерывное обслуживание
    Метрики оценки лаконичный сложный

1.2 Принцип работы и функции рекомендательной системы

  • Как работают рекомендательные системы

    • социальная рекомендация
    • Рекомендации на основе контента
    • Рекомендации на основе популярности
    • на основеСовместная фильтрацияРекомендовано: найти пользователей со схожими историческими интересами
  • Роль рекомендательных систем

    • Эффективно связывайте пользователей и элементы
    • Увеличьте время пребывания пользователя и его активность
    • Эффективно помочь продуктам реализовать свою коммерческую ценность

1.3 Различия между рекомендательными системами и веб-проектами

  • Достижение цели совершенствования за счет фильтрации информации V.S. Стабильная система циркуляции информации

    • веб-проект: обрабатывать сложную бизнес-логику, обрабатывать высокий уровень параллелизма и создавать стабильную службу потока информации для пользователей.
    • Система рекомендаций: рост индикатора преследования, коэффициент удержания/время чтения/GMV (валовой объем продаж на веб-сайте электронной коммерции)/VV веб-сайта видео (просмотр видео)
  • Уверенность против неопределенного мышления

    • веб-проект: иметь твердое ожидание результата
    • Рекомендательные системы: результат зависит от вероятности

2. Дизайн системы рекомендаций

2.1 Элементы системы рекомендаций

  • Пользовательский интерфейс и УЭ
  • Данные (лямбда-архитектура)
  • знание бизнеса
  • алгоритм

2.2 Архитектура системы рекомендаций

  • Лямбда-архитектура больших данных

    • Архитектура Lambda — это инфраструктура обработки больших данных в реальном времени, предложенная Натаном Марцем, автором фреймворка Storm для обработки больших данных в реальном времени.

    • Архитектура Lambda объединяет автономные вычисления и вычисления в реальном времени, а также проектирует архитектуру, которая может соответствовать ключевым характеристикам систем больших данных в реальном времени, включая высокую отказоустойчивость, малую задержку и масштабируемость.

    • Многоуровневая архитектура

      • пакетный слой
        • Данные неизменяемы, можно выполнить любой расчет и масштабировать по горизонтали.
        • Высокая задержка: от нескольких минут до нескольких часов (объем вычислений и объем данных различаются)
        • Сбор логов: Flume
        • Распределенное хранилище: Hadoop
        • Распределенные вычисления: Hadoop, Spark
        • просмотреть базу данных магазина
          • osql(HBase/Cassandra)
          • Redis/memcache
          • MySQL
      • уровень обработки в реальном времени
        • Потоковая передача, непрерывные вычисления
        • Хранить и анализировать данные в пределах определенного окна (горячие рейтинги продаж за период времени, горячие поиски в реальном времени и т. д.)
        • Flume & kafka для сбора данных в реальном времени
        • Анализ данных в режиме реального времени.
      • сервисный слой
        • Поддержка случайного чтения
        • Необходимо вернуть результаты в очень короткие сроки
        • Чтение и объединение результатов пакетного слоя и слоя обработки в реальном времени
  • Архитектура алгоритма рекомендаций

    • Этап отзыва (аудиторский отбор)

      • Отзыв определяет потолок для окончательного результата рекомендации
      • Общие алгоритмы
        • Совместная фильтрация
        • основанный на содержании
    • Этап сортировки (рекомендуемый)

      • Отзыв определяет потолок итогового результата рекомендации, а ранжирование приближается к этому пределу, что и определяет конечный эффект рекомендации.
      • Оценка CTR (оценка рейтинга кликов с использованием алгоритма LR), чтобы оценить, будет ли пользователь нажимать на определенный элемент, требуются данные о кликах пользователя.

3. Алгоритм рекомендации

3.1 Процесс построения рекомендательной модели

Данные (данные)->Функции (функции)->Алгоритм ML (выберите модель обучения алгоритма)->Вывод прогноза (вывод прогноза)

  • Очистка/обработка данных

    • Источники данных
      • явные данные
        • Рейтинг
        • Комментарии Комментарии/оценки
      • невидимые данные
        • История заказов
        • добавить в корзину
        • Вид страницы
        • нажмите
        • история поиска
    • Количество данных / могут ли данные соответствовать требованиям
  • разработка функций

    • Фильтрация объектов по данным

      • Данный товар может быть приобретен пользователями со схожими вкусами или потребностями.

      • Описание продуктов с использованием данных о поведении пользователей

    • данные о функциях

      • Объедините все действия пользователей вместе, чтобы сформировать матрицу элементов пользователя.
  • Выберите правильный алгоритм

    • Совместная фильтрация
    • основанный на содержании
  • Генерировать рекомендуемые результаты

    • Оценить рекомендуемые результаты и выйти в интернет после прохождения оценки

3.2 Самый классический рекомендательный алгоритм: рекомендательный алгоритм совместной фильтрации

Collaborative Filtering

Идея алгоритма:Рыбак рыбака видит издалека

Базовый алгоритм рекомендаций по совместной фильтрации основан на следующих предположениях:

  • "Как тебе нравитсяпохожие людиНравятся вещи, которые вам могут понравиться»: рекомендации по совместной фильтрации на основе пользователей (CF на основе пользователей)
  • "Что тебе нравитсяпохожие вещиВам также, скорее всего, понравится": CF на основе предметов

Существует несколько шагов для реализации рекомендаций по совместной фильтрации:

  1. Найдите наиболее похожих людей или предметы: TOP-N похожих людей или предметов

    Вычисляя сходство между парами для сортировки, вы можете найти ТОП-N похожих людей или предметов.

  2. Создавайте рекомендации на основе похожих людей или предметов

    Используйте результаты TOP-N для создания первоначальных результатов рекомендаций, а затем отфильтруйте элементы, которые пользователь уже записал, или элементы, которые явно не представляют интереса.

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

  • Что касается вычисления подобия, вот простая идея: если есть два одноклассника X и Y, хобби одноклассников X [футбол, баскетбол, настольный теннис], хобби одноклассников Y [теннис, футбол, баскетбол, бадминтон], можно увидеть, что их общего есть 2 увлечения, то их сходство можно выразить так: 2/3 * 2/4 = 1/3 ≈ 0,33.

3.3 Расчет подобия

  • Как рассчитать сходство

    • Евклидово расстояние — это метод измерения расстояния в евклидовом пространстве.Два объекта представляются как две точки в одном и том же пространстве.Если они называются p и q, они имеют n координат соответственно, то евклидово расстояние измеряет эти две точки.расстояние между ними точки Евклидово расстояние не работает между булевыми векторами

    Значение евклидова расстояния — неотрицательное число, а максимальное значение — бесконечность.Обычно ожидается, что результат вычисления подобия будет между [-1, 1] или [0, 1].Как правило, вы можете использовать

    Формула преобразования выглядит следующим образом:

    • косинусное сходство
    • Измерение представляет собой угол между двумя векторами, а косинус угла используется для измерения сходства.
      • Если угол между двумя векторами равен 0, косинус равен 1. Когда угол равен 90 градусам, косинус равен 0, а если угол равен 180 градусам, косинус равен -1.
      • Косинусное сходство чаще используется при измерении сходства текста, сходства пользователей и сходства элементов.
      • Характеристики косинусного сходства не имеют ничего общего с длиной вектора. Расчет косинусного сходства должен нормализовать длину вектора. Пока два вектора находятся в одном направлении, независимо от того, насколько они сильны или слабы, их можно считать «похожими»
  • Коэффициент корреляции Пирсона Пирсона

    • На самом деле это тоже косинусное сходство, но сначала центрируются векторы, а каждый из векторов a и b вычитается из среднего значения векторов, а затем вычисляется косинусное сходство.
    • Результат расчета подобия Пирсона находится в диапазоне от -1 до 1, -1 означает отрицательную корреляцию, 1 означает положительную корреляцию.
    • Измерьте, увеличиваются и уменьшаются ли две переменные одновременно
    • Коэффициент корреляции Пирсона измеряет, согласуются ли тренды двух переменных.Не подходит для вычисления корреляций между булевыми векторами.
  • Сходство Жаккара

    • Отношение количества элементов пересечения двух множеств в объединении, которое очень подходит для булева векторного представления

    • Числитель — это скалярное произведение двух булевых векторов, а результат — количество элементов пересечения.

    • Знаменатель - это операция ИЛИ двух логических векторов, а затем поэлементная сумма

  • Как выбрать косинусное сходство

    • Косинусное сходство/коэффициент корреляции Пирсона для данных пользовательского рейтинга (реальные значения),
    • Сходство Жаккара подходит для неявных данных обратной связи (логическое значение 0,1, добавлять ли в избранное, нажимать ли, добавлять ли в корзину)

3.4 Кодовая реализация рекомендательного алгоритма совместной фильтрации

  • набор инструментов для импорта

    import pandas as pd
    import numpy as np
    
  • Создайте набор данных

    users = ["User1", "User2", "User3", "User4", "User5"]
    items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
    # 构建数据集
    datasets = [
        ["buy",None,"buy","buy",None],
        ["buy",None,None,"buy","buy"],
        ["buy",None,"buy",None,None],
        [None,"buy",None,"buy","buy"],
        ["buy","buy","buy",None,"buy"],
    ]
    
  • При расчетах наши данные обычно необходимо обрабатывать или кодировать. Цель состоит в том, чтобы облегчить нам работу с данными. Например, вот относительно простая ситуация. Мы используем 1 и 0, чтобы указать, купил ли пользователь продукт, затем Наш набор данных должен выглядеть так:

    users = ["User1", "User2", "User3", "User4", "User5"]
    items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
    # 用户购买记录数据集
    datasets = [
        [1,0,1,1,0],
        [1,0,0,1,1],
        [1,0,1,0,0],
        [0,1,0,1,1],
        [1,1,1,0,1],
    ]
    import pandas as pd
    
    df = pd.DataFrame(datasets,
                      columns=items,
                      index=users)
    print(df)
    
  • С набором данных мы можем рассчитать сходство дальше, но на самом деле существует много специальных методов расчета сходства для расчета сходства, таких как косинусное сходство, коэффициент корреляции Пирсона, сходство Жаккара и т. д. Подождите. Здесь мы решили использовать коэффициент подобия Жаккара [0,1]

    from sklearn.metrics import jaccard_similarity_score
    # 直接计算某两项的杰卡德相似系数
    # 计算Item A 和Item B的相似度
    print(jaccard_similarity_score(df["Item A"], df["Item B"]))
    
    # 计算所有的数据两两的杰卡德相似系数
    from sklearn.metrics.pairwise import pairwise_distances
    # 计算用户间相似度
    user_similar = 1 - pairwise_distances(df, metric="jaccard")
    user_similar = pd.DataFrame(user_similar, columns=users, index=users)
    print("用户之间的两两相似度:")
    print(user_similar)
    
    # 计算物品间相似度
    item_similar = 1 - pairwise_distances(df.T, metric="jaccard")
    item_similar = pd.DataFrame(item_similar, columns=items, index=items)
    print("物品之间的两两相似度:")
    print(item_similar)
    

Имея сходство в парах, вы можете просмотреть ТОП-N похожих результатов и дать рекомендации.

  • User-Based CF

    import pandas as pd
    import numpy as np
    from pprint import pprint
    
    users = ["User1", "User2", "User3", "User4", "User5"]
    items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
    # 用户购买记录数据集
    datasets = [
        [1,0,1,1,0],
        [1,0,0,1,1],
        [1,0,1,0,0],
        [0,1,0,1,1],
        [1,1,1,0,1],
    ]
    
    df = pd.DataFrame(datasets,
                      columns=items,
                      index=users)
    
    # 计算所有的数据两两的杰卡德相似系数
    from sklearn.metrics.pairwise import pairwise_distances
    # 计算用户间相似度  1-杰卡德距离=杰卡德相似度
    user_similar = 1 - pairwise_distances(df, metric="jaccard")
    user_similar = pd.DataFrame(user_similar, columns=users, index=users)
    print("用户之间的两两相似度:")
    print(user_similar)
    
    topN_users = {}
    # 遍历每一行数据
    for i in user_similar.index:
        # 取出每一列数据,并删除自身,然后排序数据
        _df = user_similar.loc[i].drop([i])
        #sort_values 排序 按照相似度降序排列
        _df_sorted = _df.sort_values(ascending=False)
        # 从排序之后的结果中切片 取出前两条(相似度最高的两个)
        top2 = list(_df_sorted.index[:2])
        topN_users[i] = top2
    
    print("Top2相似用户:")
    pprint(topN_users)
    
    # 准备空白dict用来保存推荐结果
    rs_results = {}
    #遍历所有的最相似用户
    for user, sim_users in topN_users.items():
        rs_result = set()    # 存储推荐结果
        for sim_user in sim_users:
            # 构建初始的推荐结果
            rs_result = rs_result.union(set(df.ix[sim_user].replace(0,np.nan).dropna().index))
        # 过滤掉已经购买过的物品
        rs_result -= set(df.ix[user].replace(0,np.nan).dropna().index)
        rs_results[user] = rs_result
    print("最终推荐结果:")
    pprint(rs_results)
    
  • Item-Based CF

    import pandas as pd
    import numpy as np
    from pprint import pprint
    
    users = ["User1", "User2", "User3", "User4", "User5"]
    items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
    # 用户购买记录数据集
    datasets = [
        [1,0,1,1,0],
        [1,0,0,1,1],
        [1,0,1,0,0],
        [0,1,0,1,1],
        [1,1,1,0,1],
    ]
    
    df = pd.DataFrame(datasets,
                      columns=items,
                      index=users)
    
    # 计算所有的数据两两的杰卡德相似系数
    from sklearn.metrics.pairwise import pairwise_distances
    # 计算物品间相似度
    item_similar = 1 - pairwise_distances(df.T, metric="jaccard")
    item_similar = pd.DataFrame(item_similar, columns=items, index=items)
    print("物品之间的两两相似度:")
    print(item_similar)
    
    topN_items = {}
    # 遍历每一行数据
    for i in item_similar.index:
        # 取出每一列数据,并删除自身,然后排序数据
        _df = item_similar.loc[i].drop([i])
        _df_sorted = _df.sort_values(ascending=False)
    
        top2 = list(_df_sorted.index[:2])
        topN_items[i] = top2
    
    print("Top2相似物品:")
    pprint(topN_items)
    
    rs_results = {}
    # 构建推荐结果
    for user in df.index:    # 遍历所有用户
        rs_result = set()
        for item in df.ix[user].replace(0,np.nan).dropna().index:   # 取出每个用户当前已购物品列表
            # 根据每个物品找出最相似的TOP-N物品,构建初始推荐结果
            rs_result = rs_result.union(topN_items[item])
        # 过滤掉用户已购的物品
        rs_result -= set(df.ix[user].replace(0,np.nan).dropna().index)
        # 添加到结果中
        rs_results[user] = rs_result
    
    print("最终推荐结果:")
    pprint(rs_results)
    

3.5 О наборах данных, используемых алгоритмом совместной фильтрации

​ В предыдущей демонстрации мы использовали только запись о покупке товара пользователем, что может быть похоже на просмотр записей о кликах, записи о прослушивании и т. д. Таким образом, результат нашего предсказания фактически эквивалентен предсказанию того, заинтересован ли пользователь в определенном элементе, и степень предпочтения не может быть хорошо предсказана.

Таким образом, в алгоритме рекомендаций по совместной фильтрации для прогнозирования будут использоваться «рейтинговые» данные пользователя о элементах.Благодаря набору данных для оценки мы можем предсказать рейтинг пользователя для элементов, которые он не оценил. Его принцип реализации и идея такие же, но используемый набор данных — это данные рейтинга пользователя.

О матрице оценок пользователей

Матрица оценки пользовательского элемента, будут разные решения в зависимости от разреженности матрицы оценки.

  • плотная матрица оценок

  • Разреженная матрица оценок

Обработка плотной скоринговой матрицы здесь представлена ​​первой, а обработка разреженной матрицы относительно сложна.

Прогноз рейтинга пользователей с использованием алгоритма совместной фильтрации

  • набор данных

    Цель: предсказать оценку пользователя 1 для элемента E.

  • Создайте набор данных: обратите внимание, что при построении данных оценки здесь нам нужно сохранить отсутствующую часть как Нет, Если для нее установлено значение 0, она будет рассматриваться как значение оценки 0.

    users = ["User1", "User2", "User3", "User4", "User5"]
    items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
    # 用户购买记录数据集
    datasets = [
        [5,3,4,4,None],
        [3,1,2,3,3],
        [4,3,4,3,5],
        [3,3,1,5,4],
        [1,5,5,2,1],
    ]
    
  • Вычислить сходство: для оценки данных мы используем коэффициент корреляции Пирсона [-1,1] для расчета, -1 означает сильную отрицательную корреляцию, +1 означает сильную положительную корреляцию.

    Метод corr в Pandas можно напрямую использовать для расчета коэффициента корреляции Пирсона.

    df = pd.DataFrame(datasets,
                      columns=items,
                      index=users)
    
    print("用户之间的两两相似度:")
    # 直接计算皮尔逊相关系数
    # 默认是按列进行计算,因此如果计算用户间的相似度,当前需要进行转置
    user_similar = df.T.corr()
    print(user_similar.round(4))
    
    print("物品之间的两两相似度:")
    item_similar = df.corr()
    print(item_similar.round(4))
    

    результат операции:

    # 运行结果:
    用户之间的两两相似度:
            User1   User2   User3   User4   User5
    User1  1.0000  0.8528  0.7071  0.0000 -0.7921
    User2  0.8528  1.0000  0.4677  0.4900 -0.9001
    User3  0.7071  0.4677  1.0000 -0.1612 -0.4666
    User4  0.0000  0.4900 -0.1612  1.0000 -0.6415
    User5 -0.7921 -0.9001 -0.4666 -0.6415  1.0000
    物品之间的两两相似度:
            Item A  Item B  Item C  Item D  Item E
    Item A  1.0000 -0.4767 -0.1231  0.5322  0.9695
    Item B -0.4767  1.0000  0.6455 -0.3101 -0.4781
    Item C -0.1231  0.6455  1.0000 -0.7206 -0.4276
    Item D  0.5322 -0.3101 -0.7206  1.0000  0.5817
    Item E  0.9695 -0.4781 -0.4276  0.5817  1.0000
    

    Видно, что наиболее похожими на пользователя 1 являются пользователь 2 и пользователь 3, наиболее похожими на элемент А предметами являются предмет Е и предмет D соответственно.

    Уведомление: Когда мы прогнозируем рейтинги, мы часто делаем прогнозы на основе пользователей или элементов, которые имеют с ними положительную корреляцию. Если положительной корреляции нет, то мы не сможем делать прогнозы. Это особенно часто встречается в разреженных матрицах оценок, где сложно получить положительные коэффициенты корреляции.

  • Предсказание рейтинга

    Прогнозирование оценки CF на основе пользователей: прогнозирование с использованием схожести между пользователями

    Существует также множество схем оценки методов прогнозирования, вот лучшая схема, которая учитывает собственную оценку пользователя и средневзвешенную оценку сходства соседних пользователей для прогнозирования:

    pred(u,i)=rui^=vеUsum(u,v)*rvivеUsim(u,vpred(u,i)=\hat{r_{ui}}=\frac{\sum_{v\in U}sum(u,v)*r_{vi}}{\sum_{v\in U}|sim(u,v|}

    Мы хотим предсказать рейтинг пользователя 1 для элемента E, тогда мы можем сделать прогнозы на основе пользователя 2 и пользователя 3, которые являются ближайшими соседями пользователя 1, и расчет будет следующим:

    pred(u1,i5)=0.85*3+0.71*50.85+0.71=3.91pred(u_1,i_5)=\frac{0.85*3+0.71*5}{0.85+0.71}=3.91

    Наконец, прогнозируется, что рейтинг пользователя 1 по пункту 5 составит 3,91.

    Прогнозирование оценки CF на основе элементов: прогнозирование с использованием сходства между элементами

    Здесь вычисление прогнозируемого сходства элементов такое же, как указано выше, и также учитывается собственный средний коэффициент оценки пользователя в сочетании со средневзвешенной оценкой сходства прогнозируемого элемента и аналогичных элементов для прогнозирования:

    pred(u,i)=rui^=jеIratedsim(i,j)*rujjеIratedsim(i,j)pred(u,i)=\hat{r_{ui}}=\frac{\sum_{j\in I_{rated}}sim(i,j)*r_{uj}}{\sum_{j\in I_{rated}}sim(i,j)}

    Мы хотим спрогнозировать рейтинг пользователя 1 для элемента E, затем мы можем спрогнозировать на основе элементов A и D, которые являются ближайшими соседями к элементу E. Расчет выглядит следующим образом:

    pred(u1,i5)=0.97*5+0.58*40.97+0.58=4.63pred(u_1,i_5)=\frac{0.97*5+0.58*4}{0.97+0.58}=4.63

    Из сравнения видно, что существуют различия между оценкой предсказания CF на основе пользователей и оценкой CF на основе элементов, потому что, строго говоря, они должны принадлежать двум разным алгоритмам рекомендаций.Эффект каждого метода лучше, но какой из них лучше должен оцениваться по разумному эффекту.Поэтому при реализации рекомендательной системы часто необходимо реализовать эти два алгоритма, а затем оценивается и анализируется полученный рекомендательный эффект лучшего решения.

4. Случай — рекомендация фильма на основе совместной фильтрации

4.1 User-Based CF для предсказания рейтингов фильмов

  • Загрузка набора данных

  • ссылка для скачивания

  • Загрузить ratings.csv, преобразовать в матрицу оценок фильмов пользователей и вычислить сходство между пользователями.

    import os
    
    import pandas as pd
    import numpy as np
    
    DATA_PATH = "./datasets/ml-latest-small/ratings.csv"
    
    dtype = {"userId": np.int32, "movieId": np.int32, "rating": np.float32}
    # 加载数据,我们只用前三列数据,分别是用户ID,电影ID,已经用户对电影的对应评分
    ratings = pd.read_csv(data_path, dtype=dtype, usecols=range(3))
    # 透视表,将电影ID转换为列名称,转换成为一个User-Movie的评分矩阵
    ratings_matrix = ratings.pivot_table(index=["userId"], columns=["movieId"],values="rating")
    #计算用户之间相似度
    user_similar = ratings_matrix.T.corr()
    
  • Прогнозирование оценок пользователей для элементов (в качестве примера возьмем фильм 1, оцененный пользователем 1)

    Формула подсчета очков:pred(u,i)=rui^=vеUsim(u,v)*rvivеUsim(u,vФормула подсчета очков: pred(u,i)=\hat{r_{ui}}=\frac{\sum_{v\in U}sim(u,v)*r_{vi}}{\sum_{v\in U }|сим(и,в|}
    # 1. 找出uid用户的相似用户
    similar_users = user_similar[1].drop([1]).dropna()
    # 相似用户筛选规则:正相关的用户
    similar_users = similar_users.where(similar_users>0).dropna()
    # 2. 从用户1的近邻相似用户中筛选出对物品1有评分记录的近邻用户
    ids = set(ratings_matrix[1].dropna().index)&set(similar_users.index)
    finally_similar_users = similar_users.ix[list(1)]
    # 3. 结合uid用户与其近邻用户的相似度预测uid用户对iid物品的评分
    numerator = 0    # 评分预测公式的分子部分的值
    denominator = 0    # 评分预测公式的分母部分的值
    for sim_uid, similarity in finally_similar_users.iteritems():
        # 近邻用户的评分数据
        sim_user_rated_movies = ratings_matrix.ix[sim_uid].dropna()
        # 近邻用户对iid物品的评分
        sim_user_rating_for_item = sim_user_rated_movies[1]
        # 计算分子的值
        numerator += similarity * sim_user_rating_for_item
        # 计算分母的值
        denominator += similarity
    # 4 计算预测的评分值
    predict_rating = numerator/denominator
    print("预测出用户<%d>对电影<%d>的评分:%0.2f" % (1, 1, predict_rating))
    
  • Инкапсулирован в метод прогнозирования рейтинга любого пользователя для любого фильма.

    def predict(uid, iid, ratings_matrix, user_similar):
        '''
        预测给定用户对给定物品的评分值
        :param uid: 用户ID
        :param iid: 物品ID
        :param ratings_matrix: 用户-物品评分矩阵
        :param user_similar: 用户两两相似度矩阵
        :return: 预测的评分值
        '''
        print("开始预测用户<%d>对电影<%d>的评分..."%(uid, iid))
        # 1. 找出uid用户的相似用户
        similar_users = user_similar[uid].drop([uid]).dropna()
        # 相似用户筛选规则:正相关的用户
        similar_users = similar_users.where(similar_users>0).dropna()
        if similar_users.empty is True:
            raise Exception("用户<%d>没有相似的用户" % uid)
    
        # 2. 从uid用户的近邻相似用户中筛选出对iid物品有评分记录的近邻用户
        ids = set(ratings_matrix[iid].dropna().index)&set(similar_users.index)
        finally_similar_users = similar_users.ix[list(ids)]
    
        # 3. 结合uid用户与其近邻用户的相似度预测uid用户对iid物品的评分
        numerator = 0    # 评分预测公式的分子部分的值
        denominator = 0    # 评分预测公式的分母部分的值
        for sim_uid, similarity in finally_similar_users.iteritems():
            # 近邻用户的评分数据
            sim_user_rated_movies = ratings_matrix.ix[sim_uid].dropna()
            # 近邻用户对iid物品的评分
            sim_user_rating_for_item = sim_user_rated_movies[iid]
            # 计算分子的值
            numerator += similarity * sim_user_rating_for_item
            # 计算分母的值
            denominator += similarity
    
        # 计算预测的评分值并返回
        predict_rating = numerator/denominator
        print("预测出用户<%d>对电影<%d>的评分:%0.2f" % (uid, iid, predict_rating))
        return round(predict_rating, 2)
    
  • Предсказать все рейтинги фильмов для пользователя

    def predict_all(uid, ratings_matrix, user_similar):
        '''
        预测全部评分
        :param uid: 用户id
        :param ratings_matrix: 用户-物品打分矩阵
        :param user_similar: 用户两两间的相似度
        :return: 生成器,逐个返回预测评分
        '''
        # 准备要预测的物品的id列表
        item_ids = ratings_matrix.columns
        # 逐个预测
        for iid in item_ids:
            try:
                rating = predict(uid, iid, ratings_matrix, user_similar)
            except Exception as e:
                print(e)
            else:
                yield uid, iid, rating
    if __name__ == '__main__':
        for i in predict_all(1, ratings_matrix, user_similar):
            pass
    
  • Рекомендовать лучшие фильмы для данного пользователя на основе их оценок

    def top_k_rs_result(k):
        results = predict_all(1, ratings_matrix, user_similar)
        return sorted(results, key=lambda x: x[2], reverse=True)[:k]
    if __name__ == '__main__':
        from pprint import pprint
        result = top_k_rs_result(20)
        pprint(result)
    

4.2 CF на основе элементов для прогнозирования рейтингов фильмов

  • Загрузить ratings.csv, преобразовать в матрицу оценок фильмов пользователей и вычислить сходство между пользователями.

    import os
    
    import pandas as pd
    import numpy as np
    
    DATA_PATH = "./datasets/ml-latest-small/ratings.csv"
    
    dtype = {"userId": np.int32, "movieId": np.int32, "rating": np.float32}
    # 加载数据,我们只用前三列数据,分别是用户ID,电影ID,已经用户对电影的对应评分
    ratings = pd.read_csv(data_path, dtype=dtype, usecols=range(3))
    # 透视表,将电影ID转换为列名称,转换成为一个User-Movie的评分矩阵
    ratings_matrix = ratings.pivot_table(index=["userId"], columns=["movieId"],values="rating")
    #计算用户之间相似度
    item_similar = ratings_matrix.corr()
    
  • Прогнозирование оценок пользователей для элементов (в качестве примера возьмем фильм 1, оцененный пользователем 1)

    Формула подсчета очков:pred(u,i)=rui^=vеUsim(u,v)*rvivеUsim(u,vФормула подсчета очков: pred(u,i)=\hat{r_{ui}}=\frac{\sum_{v\in U}sim(u,v)*r_{vi}}{\sum_{v\in U }|сим(и,в|}
    # 1. 找出iid物品的相似物品
    similar_items = item_similar[1].drop([1]).dropna()
    # 相似物品筛选规则:正相关的物品
    similar_items = similar_items.where(similar_items>0).dropna()
    # 2. 从iid物品的近邻相似物品中筛选出uid用户评分过的物品
    ids = set(ratings_matrix.ix[1].dropna().index)&set(similar_items.index)
    finally_similar_items = similar_items.ix[list(ids)]
    
    # 3. 结合iid物品与其相似物品的相似度和uid用户对其相似物品的评分,预测uid对iid的评分
    numerator = 0    # 评分预测公式的分子部分的值
    denominator = 0    # 评分预测公式的分母部分的值
    for sim_iid, similarity in finally_similar_items.iteritems():
        # 近邻物品的评分数据
        sim_item_rated_movies = ratings_matrix[sim_iid].dropna()
        # 1用户对相似物品物品的评分
        sim_item_rating_from_user = sim_item_rated_movies[1]
        # 计算分子的值
        numerator += similarity * sim_item_rating_from_user
        # 计算分母的值
        denominator += similarity
    
    # 计算预测的评分值并返回
    predict_rating = sum_up/sum_down
    print("预测出用户<%d>对电影<%d>的评分:%0.2f" % (uid, iid, predict_rating))
    
  • Инкапсулирован в метод прогнозирования рейтинга любого пользователя для любого фильма.

    def predict(uid, iid, ratings_matrix, user_similar):
        '''
        预测给定用户对给定物品的评分值
        :param uid: 用户ID
        :param iid: 物品ID
        :param ratings_matrix: 用户-物品评分矩阵
        :param user_similar: 用户两两相似度矩阵
        :return: 预测的评分值
        '''
        print("开始预测用户<%d>对电影<%d>的评分..."%(uid, iid))
        # 1. 找出uid用户的相似用户
        similar_users = user_similar[uid].drop([uid]).dropna()
        # 相似用户筛选规则:正相关的用户
        similar_users = similar_users.where(similar_users>0).dropna()
        if similar_users.empty is True:
            raise Exception("用户<%d>没有相似的用户" % uid)
    
        # 2. 从uid用户的近邻相似用户中筛选出对iid物品有评分记录的近邻用户
        ids = set(ratings_matrix[iid].dropna().index)&set(similar_users.index)
        finally_similar_users = similar_users.ix[list(ids)]
    
        # 3. 结合uid用户与其近邻用户的相似度预测uid用户对iid物品的评分
        numerator = 0    # 评分预测公式的分子部分的值
        denominator = 0    # 评分预测公式的分母部分的值
        for sim_uid, similarity in finally_similar_users.iteritems():
            # 近邻用户的评分数据
            sim_user_rated_movies = ratings_matrix.ix[sim_uid].dropna()
            # 近邻用户对iid物品的评分
            sim_user_rating_for_item = sim_user_rated_movies[iid]
            # 计算分子的值
            numerator += similarity * sim_user_rating_for_item
            # 计算分母的值
            denominator += similarity
    
        # 计算预测的评分值并返回
        predict_rating = numerator/denominator
        print("预测出用户<%d>对电影<%d>的评分:%0.2f" % (uid, iid, predict_rating))
        return round(predict_rating, 2)
    
  • Предсказать все рейтинги фильмов для пользователя

    def predict_all(uid, ratings_matrix, item_similar):
        '''
        预测全部评分
        :param uid: 用户id
        :param ratings_matrix: 用户-物品打分矩阵
        :param item_similar: 物品两两间的相似度
        :return: 生成器,逐个返回预测评分
        '''
        # 准备要预测的物品的id列表
        item_ids = ratings_matrix.columns
        # 逐个预测
        for iid in item_ids:
            try:
                rating = predict(uid, iid, ratings_matrix, item_similar)
            except Exception as e:
                print(e)
            else:
                yield uid, iid, rating
    
    if __name__ == '__main__':
        for i in predict_all(1, ratings_matrix, item_similar):
            pass
    
  • Рекомендовать лучшие фильмы для данного пользователя на основе их оценок

    -def top_k_rs_result(k):
        results = predict_all(1, ratings_matrix, item_similar)
        return sorted(results, key=lambda x: x[2], reverse=True)[:k]
    if __name__ == '__main__':
        from pprint import pprint
        result = top_k_rs_result(20)
        print(result)
    

V. Оценка системы рекомендаций

5.1 Метрики оценки рекомендательных систем

  • Оцените источники данных для явной и неявной обратной связи

    явная обратная связь неявная обратная связь
    пример Рейтинг фильмов/книг/Нравится эта рекомендация Воспроизвести/Нажать/Просмотреть/Скачать/Купить
    точность высокий Низкий
    количество немного многие
    Затраты на приобретение высокий Низкий
  • Обычно используемые показатели оценки

    • Точность • Доверие • Удовлетворенность • В режиме реального времени • Покрытие • Надежность • Разнообразие • Масштабируемость • Новизна • Бизнес-цели • Неожиданность • Удержание пользователей

    • Точность (теоретическая перспектива)

      • Предсказание рейтинга
        • RMSE MAE
      • topNРекомендуется
        • вспомнить точность
    • Точность (с точки зрения бизнеса)

    • Покрытие

      • Информационная энтропия Чем больше рекомендация, тем лучше
      • покрытие
    • Разнообразие, новинка и сюрприз

      • Разнообразие: непохожесть парных элементов в списке рекомендаций. (Как измеряется сходство?
      • Новизна: категории, авторы, на которых не подписаны, средняя популярность результатов рекомендаций
      • Удивление: История не похожа (удивление), но очень довольна (радость).
      • Часто требует жертвовать точностью
      • Предсказать, насколько пользователям нравится элемент, используя историческое поведение
      • Система придает слишком большое значение реальному времени.
    • Эксплуатация и разведка Проблемы разведки и эксплуатации

      • Эксплуатация: выберите наилучшее решение прямо сейчас
      • Исследование: выберите некоторые варианты, которые в настоящее время являются неопределенными, но могут иметь высокодоходные варианты в будущем.
      • В процессе принятия двух типов решений постоянно обновлять понимание неопределенности всех решений и оптимизировать долгосрочные цели
    • Практика вопросов ЭО

      • Расширение интересов: похожие темы, рекомендации по словосочетаниям
      • Алгоритм толпы: кластеризация пользователей userCF
      • Сбалансируйте соотношение персонализированных рекомендаций и популярных рекомендаций
      • Случайно сбрасывать историю поведения пользователя
      • Параметры модели случайных возмущений
    • Возможные проблемы с ЕЕ

      • Исследование вредит пользовательскому опыту, может привести к оттоку пользователей
      • Долгосрочная выгода (коэффициент удержания), приносимая разведкой, имеет длительный цикл оценки и высокое давление KPI.
      • Как сбалансировать реальные и долгосрочные интересы
      • Как сбалансировать краткосрочный опыт продукта и долгосрочную экологию системы
      • Как сбалансировать массовые вкусы и потребности ниши

5.2 Метод оценки рекомендательной системы

  • метод оценки
    • Анкета: высокая стоимость
    • Оффлайн оценка:
      • Оценка может быть выполнена только для набора кандидатов, который видел пользователь, и есть отклонение от фактического онлайн-эффекта.
      • Только несколько показателей могут быть оценены
      • Высокая скорость без ущерба для пользовательского опыта
    • Онлайн-оценка: выпуск в оттенках серого и A/B-тестирование 50 % полного запуска
    • Практика: офлайн-оценка в сочетании с онлайн-оценкой, регулярный анкетный опрос.

6. Проблема холодного старта рекомендательной системы

6.1 Концепция холодного пуска рекомендательной системы

  • Пользовательский холодный старт: как сделать персональные рекомендации для пользователей
  • Холодный старт элемента: как рекомендовать новые элементы пользователям (совместная фильтрация)
  • Холодный запуск системы: холодный запуск пользователя + холодный запуск элемента
  • Суть в том, что рекомендательная система опирается на исторические данные, а без исторических данных невозможно предсказать предпочтения пользователей.

6.2 Общие методы решения проблемы холодного запуска рекомендательных систем

  • Холодный запуск пользователя
    • Собирайте характеристики пользователей
      • Регистрация пользователей Информация: Пол, Возраст, Регион
      • Информация об устройстве: местоположение, модель телефона, список приложений
      • Социальная информация, рекламные материалы, источники установки
    • Помогите пользователям заполнить их интересы
    • Использование поведенческих данных с других сайтов
    • Различия между новой и старой стратегиями рекомендаций пользователей
      • Новые пользователи более склонны к популярным рейтингам на этапе холодного старта, а старым пользователям потребуется больше рекомендаций с длинным хвостом.
      • Узнайте, как использовать силу
      • Оценка с использованием отдельных функций и моделей
  • предмет холодный пуск
    • маркировать предметы
    • Используя информацию о содержимом элемента, новый элемент сначала доставляется пользователям, которым понравились другие элементы с аналогичным содержанием.
  • Холодный запуск системы
    • Ранние рекомендательные системы на основе контента
    • Контентная рекомендация постепенно переходит в совместную фильтрацию
    • Рассчитываются результаты как рекомендации на основе контента, так и рекомендации совместной фильтрации, а взвешенное суммирование используется для получения окончательного результата рекомендации.