Создайте механизм рекомендаций с помощью совместной фильтрации

Создайте механизм рекомендаций с помощью совместной фильтрации

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

Большинство веб-сайтов, таких как Amazon, YouTube и Netflix, используют совместную фильтрацию как часть своих сложных систем рекомендаций. Вы можете использовать эту технику для создания рекомендаций, которые дают предложения пользователю на основе симпатий и антипатий похожих пользователей.

*В этой статье вы узнаете о:*
  • Совместная фильтрация и ее виды

  • Данные, необходимые для создания рекомендации

  • Библиотеки, доступные в Python для создания рекомендаций

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

    *Бесплатный бонус:* ссылка: [Нажмите здесь, чтобы получить доступ к главе из Python Tricks: The Book], которая показывает вам лучшие практики Python с простыми примерами, которые вы можете применить мгновенно, чтобы написать более красивый + код Python.

Что такое совместная фильтрация?

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

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

Есть много способов решить, какие пользователи похожи, и объединить свой выбор, чтобы создать список рекомендаций. Эта статья покажет вам, как сделать это с Python.

Набор данных

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

Реакция может быть явной (оценка по шкале от 1 до 5, нравится или не нравится) или неявной (просмотр элемента, добавление его в список пожеланий, время, потраченное на статью).

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

Матрица показывает пять пользователей, которые оценили некоторые элементы по шкале от 1 до 5. Например, первый пользователь дал оценку 4 третьему элементу.

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

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

Лучше всего начать с набора данных MovieLens, собранного GroupLens Research. В частности, MovieLens 100k набор данных представляет собой стабильный набор эталонных данных с 100 000 оценок, присвоенных 943 пользователями для 1682 фильмов, причем каждый пользователь оценил не менее 20 фильмов.

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

  • + u.item +: список фильмов

  • + u.data +: список оценок, предоставленных пользователями

Файл + u.data +, содержащий рейтинги, представляет собой список идентификаторов пользователя, идентификатора элемента, рейтинга и отметки времени, разделенных табуляцией. Первые несколько строк файла выглядят так:

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

Шаги, вовлеченные в совместную фильтрацию

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

  • Как вы определяете, какие пользователи или элементы похожи друг на друга?

  • Учитывая, что вы знаете, какие пользователи похожи, как вы определяете оценку, которую пользователь дал бы элементу, основываясь на оценках похожих пользователей? *Как вы оцениваете точность оценок, которые вы рассчитываете?

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

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

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

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

Другой метрикой для измерения точности является средняя абсолютная ошибка (MAE), в которой вы можете определить величину ошибки, найдя ее абсолютное значение и затем взяв среднее значение всех значений ошибок.

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

Теперь давайте посмотрим на различные типы алгоритмов в семействе совместной фильтрации.

На основе памяти

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

Чтобы найти оценку* R , которую пользователь *U дал бы элементу I , подход включает в себя:

*Поиск пользователей, похожих на* U *, которые оценили элемент *I*
*Расчет рейтинга* R *на основе оценок пользователей, найденных на предыдущем шаге

Вы увидите каждый из них подробно в следующих разделах.

Как найти похожих пользователей на основе рейтингов

Чтобы понять концепцию сходства, давайте сначала создадим простой набор данных.

Данные включают четырех пользователей* A , *B , C и D , которые оценили два фильма. Рейтинги хранятся в списках, и каждый список содержит два числа, обозначающие рейтинг каждого фильма:

*Рейтинги* A *: `+ [1.0, 2.0] +`.
*Рейтинги* B * - `+ [2.0, 4.0] +`.
*Рейтинги* C *: `+ [2.5, 4.0] +`.
*Рейтинги* D *: `+ [4.5, 5.0] +`.

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

Points

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

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

>>>

>>> from scipy import spatial

>>> a = [1, 2]
>>> b = [2, 4]
>>> c = [2.5, 4]
>>> d = [4.5, 5]

>>> spatial.distance.euclidean(c, a)
2.5
>>> spatial.distance.euclidean(c, b)
0.5
>>> spatial.distance.euclidean(c, d)
2.23606797749979

Как показано выше, вы можете использовать + scipy.spatial.distance.euclidean +, чтобы вычислить расстояние между двумя точками. Использование его для вычисления расстояния между рейтингами A , B и D до C показывает, что с точки зрения расстояния рейтинги C наиболее близки к оценкам B ,

Вы можете увидеть, что пользователь C ближе всего к B , даже если посмотреть на график. Но из A и D кто ближе к C ?

Вы могли бы сказать, что C ближе к D с точки зрения расстояния. Но, глядя на рейтинг, кажется, что выбор C будет совпадать с выбором A больше, чем D , потому что и A , и C любят второй фильм почти в два раза больше, чем им нравится первый фильм, но D любит оба фильма одинаково.

Итак, что вы можете использовать для определения таких паттернов, которые евклидово расстояние не может? Можно ли использовать угол между линиями, соединяющими точки с началом координат, для принятия решения? Вы можете взглянуть на угол между линиями, соединяющими начало графика и соответствующие точки, как показано:

T двухмерные векторы

На графике показаны четыре линии, соединяющие каждую точку с началом координат. Линии для A и B совпадают, что делает угол между ними нулевым.

Можно считать, что если угол между линиями увеличивается, то сходство уменьшается, а если угол равен нулю, то пользователи очень похожи.

Чтобы вычислить сходство, используя угол, вам нужна функция, которая возвращает большее сходство или меньшее расстояние для меньшего угла и меньшее сходство или большее расстояние для большего угла. Косинус угла - это функция, которая уменьшается от 1 до -1 при увеличении угла от 0 до 180.

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

+ scipy + имеет функцию, которая вычисляет косинусное расстояние векторов. Возвращает более высокое значение для большего угла:

>>>

>>> from scipy import spatial
>>> a = [1, 2]
>>> b = [2, 4]
>>> c = [2.5, 4]
>>> d = [4.5, 5]

>>> spatial.distance.cosine(c,a)
0.004504527406047898

>>> spatial.distance.cosine(c,b)
0.004504527406047898

>>> spatial.distance.cosine(c,d)
0.015137225946083022

>>> spatial.distance.cosine(a,b)
0.0

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

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

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

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

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

*Для пользователя* A * вектор рейтинга `+ [1, 2] +` имеет среднее значение + 1,5 +. Вычитание `+ 1.5 +` из каждого рейтинга даст вам вектор `+ [- 0.5, 0.5] +`.
*Для пользователя* B *вектор рейтинга `+ [2, 4] +` имеет среднее значение + 3 +. Вычитание `+ 3 +` из каждого рейтинга даст вам вектор `+ [- 1, 1] +`.

Делая это, вы изменили значение среднего рейтинга каждого пользователя на 0. Попробуйте сделать то же самое для пользователей* C и D *, и вы увидите, что рейтинги теперь откорректированы, чтобы дать в среднем 0 для всех пользователей, что приводит их всех к одинаковому уровню и устраняет их отклонения.

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

Заполнение пропущенных значений в матрице оценок случайным значением может привести к неточностям. Хорошим выбором для заполнения пропущенных значений может быть средняя оценка каждого пользователя, но исходные средние значения для пользователей A и B равны + 1,5 + и + 3 + соответственно и заполняют все пустые значения A с + 1.5 + и значения B с + 3 + сделают их разнородными пользователями.

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

Евклидово расстояние и косинусное сходство - вот некоторые из подходов, которые вы можете использовать для поиска пользователей, похожих друг на друга, и даже предметов, похожих друг на друга. (Используемая выше функция вычисляет косинусное расстояние. Чтобы вычислить косинусное сходство, вычтите расстояние из 1.)

*Примечание:* Формула для центрированного косинуса такая же, как и для коэффициента корреляции Пирсона. Вы обнаружите, что многие ресурсы и библиотеки по рекомендациям ссылаются на реализацию центрированного косинуса как корреляцию Пирсона.

Как рассчитать рейтинг

После того, как вы определили список пользователей, похожих на пользователя U , вам необходимо рассчитать рейтинг R , который U даст определенному элементу I . Опять же, как и сходство, вы можете сделать это несколькими способами.

Вы можете предсказать, что рейтинг пользователя R для элемента I будет близок к среднему значению оценок, присвоенных I топ-5 или топ-10 пользователями, наиболее похожими на U . Математическая формула для среднего рейтинга, данного n пользователями, будет выглядеть так:

Formula для среднего рейтинга

Эта формула показывает, что средний рейтинг, данный n аналогичными пользователями, равен сумме рейтингов, полученных ими, деленной на количество похожих пользователей, то есть n.

Будут ситуации, когда n похожие пользователи, которых вы нашли, не одинаково похожи на целевого пользователя U . Верхние 3 из них могут быть очень похожими, а остальные могут быть не такими похожими на U , как верхние 3. В этом случае вы могли бы рассмотреть подход, при котором рейтинг наиболее похожего пользователя важнее, чем второй наиболее похожий пользователь, и так далее. Средневзвешенное значение может помочь нам достичь этого.

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

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

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

Formula для средневзвешенного рейтинга

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

*Примечание:* Если вам интересно, почему сумма взвешенных рейтингов делится на сумму весов, а не на _n_, учтите это: в предыдущей формуле среднего, где вы делите на _n_, значение вес был 1.

Знаменатель всегда является суммой весов, когда дело доходит до нахождения средних значений, а в случае нормального среднего вес, равный 1, означает, что знаменатель будет равен n.

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

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

Основанная на пользователях против Совместной фильтрации на основе элементов

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

Эти два подхода математически очень похожи, но между ними есть концептуальная разница. Вот как они сравниваются:

  • На основе пользователя: Для пользователя U , с набором аналогичных пользователей, определенных на основе векторов оценок, состоящих из заданных оценок элементов, оценка для элемента I , который не был оценен, определяется путем выбора исключить N пользователей из списка сходства, которые оценили элемент I и рассчитали рейтинг на основе этих N оценок.

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

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

Хотя подход, основанный на элементах, работает плохо для наборов данных с элементами, относящимися к просмотру или развлечениям, такими как MovieLens, где рекомендации, которые он выдает, кажутся целевым пользователям совершенно очевидными. Такие наборы данных показывают лучшие результаты с техниками факторизации матрицы, которые вы увидите в следующем разделе, или с гибридными рекомендациями, которые также принимают во внимание содержание данных, подобных жанру, используя https://en.wikipedia.org/wiki./Recommender_system # Content-based_filtering [контентная фильтрация].

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

Модель на основе

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

Уменьшение размерности

В матрице пользовательских элементов есть два измерения:

  1. Количество пользователей

  2. Количество предметов

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

*Матричная факторизация* может рассматриваться как разбивка большой матрицы на продукт меньших. Это похоже на факторизацию целых чисел, где `+ 12 +` можно записать как `+6 x 2 +` или `+4 x 3 +`. В случае матриц матрица *A* с размерами `+ m x n +` может быть сведена к произведению двух матриц *X* и *Y* с размерами `+ m x p +` и `+ p x n +` соответственно.
*Примечание:* При умножении матриц матрицу *X* можно умножить на *Y* , только если количество столбцов в *X* равно количеству строк в *Y* . Поэтому две приведенные матрицы имеют общую размерность *p* .

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

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

На изображении выше матрица сведена к двум матрицам. Слева - матрица пользователей с m пользователями, а сверху - матрица элементов с n элементами. Рейтинг «+ 4 +» понижается или разлагается на:

  1. Пользовательский вектор + (2, -1) +

  2. Вектор элемента + (2.5, 1) +

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

  • Предположим, что в пользовательском векторе + (u, v) +, + u + представляет, насколько пользователь любит жанр ужасов, а + v + представляет, насколько ему нравится жанр романтики.

  • Пользовательский вектор + (2, -1) +, таким образом, представляет пользователя, который любит фильмы ужасов и оценивает их позитивно, не любит фильмы, которые имеют романтические отношения, и оценивает их негативно.

  • Предположим, что в элементе vector + (i, j) +, + i + представляет, насколько фильм принадлежит жанру ужасов, а + j + представляет, насколько этот фильм принадлежит жанру Romance. Фильм + (2.5, 1) + имеет рейтинг ужасов + 2.5 + и рейтинг романтики + 1 +. Умножая его на вектор пользователя с использованием правил умножения матриц, вы получите + (2 2.5) + (-1 * 1) = 4 +