Прикладная математика и машинное обучение: совместная фильтрация на основе элементов

Моя первоначальная реализация рекомендательной системы на основе элементов…

Что такое рекомендательные системы?

Благодаря Интернет-волне у человека теперь есть множество вариантов (например, что покупать на Amazon, что смотреть на Netflix / Hulu и т. Д.). Однако, несмотря на увеличение количества вариантов, у людей по-прежнему остается такая же продолжительность внимания.

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

Если они могут правильно порекомендовать вам следующее желаемое действие непосредственно перед тем, как вы покинете веб-сайт, вы будете соблазнены остаться и ознакомиться с этой замечательной рекомендацией. Вы покупаете другой товар или смотрите другое видео, наполненное рекламой, и это приносит им много денег, поэтому они рекомендуют вам еще одно действие снова… и снова… и снова. Вы когда-нибудь замечали, как попадаете на Facebook / Twitter / Instagram / Netflix / и т. Д. трудно оторваться? В более легкой и более юмористической ноте, вы можете думать о них как о местных наркоторговцах, предлагающих вам следующее лекарство. * пожимает плечами *.

Тем не менее, честно говоря, я предпочитаю службу с механизмом рекомендаций, чем без него. Моя обязанность - обладать самоконтролем, и пока я самоконтролируюсь, я всегда предпочитаю лучший сервис (вот почему стартапам трудно превзойти Facebook, даже когда Facebook получает плохую репутацию в прессе ).

Какие бывают типы RS?

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

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

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

Совместная фильтрация - это просто всеобъемлющая категория рекомендательных систем. В рамках совместной фильтрации существует две популярные реализации: на основе пользователя системы рекомендаций для совместной фильтрации (пользовательский CF RS) и на основе элементов. рекомендательные системы для совместной фильтрации (CF RS на основе элементов).

Рекомендации на основе пользователей измеряют, насколько разные пользователи похожи друг на друга. Затем система может порекомендовать вам товары, которые купили похожие на вас пользователи.

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

Для элементов, которые не имеют одного и того же набора отзывов пользователей (скажем, элемент 1 и элемент 3), система может либо предположить, что элемент 1 и элемент 3 полностью различаются, либо попытаться проверить, имеют ли элемент 1 и элемент 3 любые общие элементы (например, если элемент 1 похож на элемент 2 (они имеют НЕКОТОРЫЕ из одних и тех же положительных отзывов пользователей); а также, если элемент 2 и элемент 3 похожи (они имеют НЕКОТОРЫЕ отношения одного и того же положительного пользователя) reviews); тогда элемент 1 может быть похож на элемент 3, просто пользователи, просмотревшие элемент 1, еще не успели опробовать элемент 3).

Как вы, наверное, догадались, мы сосредоточимся на предметном CF RS 😋

Моя реализация

1) Загрузите данные!

Pandas был единственным внешним пакетом, который я использовал для этой быстрой и грязной реализации. Pandas использовался для обработки набора данных обзоров фильмов (можно найти здесь: https://grouplens.org/datasets/movielens/)

Набор данных имеет четыре измерения: идентификатор пользователя (называемый userId), идентификатор фильма (называемый movieId), рейтинг и отметка времени . Многие функции говорят сами за себя: userId - это уникальный идентификатор пользователя для создателя определенного рейтинга фильма, movieId - это уникальный идентификатор фильма для оцениваемого фильма. , оценка - оценка, которую пользователь поставил фильму по шкале от 1 до 5, а отметка времени - оценка фильма пользователем.

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

2) Нормализовать данные!

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

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

К сожалению, люди по-разному используют систему 1–5 звезд. Некоторые используют его правильно (используя весь спектр системы - 1 за абсолютно ужасный, 3 за средний, 5 за отличный); некоторые пользователи оценивают все фильмы в среднем на 5 баллов; а некоторые пользователи оценивают средний фильм на 4, хорошие и потрясающие фильмы на 5, а абсолютно ужасные фильмы на 3.

Самый простой патч для этого - получение среднего (среднего) значения всех оценок пользователя с последующим вычитанием среднего значения из каждой оценки пользователя.

Пример:

Мои оценки пяти разных фильмов (некоторые придуманы)

Мои оценки:

Волк с Уоллстрит - (5)

Социальная сеть - (5)

Путь мальчика домой - (3)

Я люблю ненависть - (1)

Я тоже люблю ненависть - (2)

Среднее / Среднее = ((5 + 5 + 3 + 1 + 2) / (количество оценок)) = 15/5 = 3

Мои нормализованные оценки:

Волк с Уоллстрит - (2)

Социальная сеть - (2)

Путь мальчика домой - (0)

Я люблю ненависть - (-2)

Я тоже люблю ненависть - (-1)

Независимо от конкретного пользователя, вы всегда будете знать, что считается средней оценкой фильма (0). Единственное, что не было учтено из-за халатности, - это расхождение. У некоторых пользователей (например, меня) может быть диапазон от 2 до -2, а у других - от 0 до -4.

ПРИМЕЧАНИЕ. На шаге 3 я также создаю словарь всех фильмов, который будет использоваться на следующем шаге.

4) Создайте матрицу сходства элементов

Если вы попытаетесь воссоздать эту функцию, вы заметите, насколько она медленна при работе с большим набором данных. В этот код можно значительно улучшить, в частности, с помощью pandas и numpy!

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

Пример (с использованием ненормализованных оценок):

Шейн - (Фильм 1: 5, Фильм 2: 4, Фильм 3: 1)

Майк - (Фильм 1: 1, Фильм 2: 3, Фильм 3: 5)

Дональд - (Фильм 1: 4, Фильм 2: 4, Фильм 3: 2)

{

Movie 1: {

… … Movie 2: {

… … … Shane: 1 ,

… … … Mike: 2,

… … … Donald: 0,

… …},

… … Movie 3: {

… … … Shane: 4,

… … … Mike: 4,

… … … Donald: 2,

… …},

…},

Movie 2: {

… … Movie 1: {

… … … Shane: 1 ,

… … … Mike: 2,

… … … Donald: 0,

… …},

… … Movie 3: {

… … … Shane: 3,

… … … Mike: 2,

… … … Donald: 2,

… …},

…},

Movie 3: {

… … Movie 1: {

… … … Shane: 4,

… … … Mike: 4,

… … … Donald: 2,

… …},

… … Movie 2: {

… … … Shane: 3,

… … … Mike: 2,

… … … Donald: 2,

… …},

…}

}

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

{

Movie 1: {

… … Movie 2: 3,

… … Movie 3: 10,

…},

Movie 2: {

… … Movie 1: 3,

… … Movie 3: 7,

…},

Movie 3: {

… … Movie 1: 10,

… … Movie 2: 7,

…}

}

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

Для фильма 3 с человеческой точки зрения ни один из них не близок к фильму 3, но, поскольку мы должны выбрать один, фильм 2 ближе к фильму 3, чем фильм 1 к фильму 3.

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

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

Спасибо за внимание!

Чтобы узнать больше о программировании, музыке, свиданиях и общем образе жизни городских ботаников, подписывайтесь на меня или в публикацию The Urban Nerd!