Руководство для начинающих с простым для понимания примером системы рекомендаций фильмов.

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

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

Показатель

Часть 1: Введение и теория
Часть 2: Система рекомендаций на основе контента в Python
Часть 3: Система рекомендаций на основе совместной фильтрации в Python
Часть 4: Анализ правил ассоциации и априорный алгоритм

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

Все коды можно найти в репозитории GitHub здесь.

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

Часть 1: Введение

Рекомендательная система — это алгоритм или метод фильтрации информации, который используется для рекомендации продукта/услуги пользователям. Наиболее подходящим примером может служить предложение «Часто покупаемые вместе» внизу страницы Amazon каждый раз, когда вы выбираете продукт для покупки, или список видео, рекомендуемых вам на вашей домашней странице YouTube. Такие системы выгодны как продавцу, так и покупателю, и их цели можно в общих чертах охарактеризовать следующим образом.

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

Чтобы любая система рекомендаций работала, нам необходимо предоставить ей данные, которые могут быть собраны «явно» (пользователь предоставляет оценку для определенного элемента) или «неявно» (пользователь просто просматривает/щелкает определенный элемент). Как было упомянуто выше, рекомендательные системы в основном являются системами фильтрации, и в действительности это данные, собранные от пользователей, если они отфильтрованы с использованием различных алгоритмов для создания рекомендаций. Эти алгоритмы фильтрации называются парадигмами рекомендательных систем и перечислены ниже:

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

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

Часть 2: Системы рекомендаций на основе контента

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

Косинусное сходство: использует косинус угла между векторами.

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

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

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

movies_df = pd.read_csv('...\\movies.csv')
rating_df=pd.read_csv('...\\ratings.csv')

Давайте посмотрим на данные, которые у нас есть

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

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

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

Теперь эти шаги не имеют ничего общего с рекомендательными системами, это просто попытка создать функции, которые каким-то образом будут давать характеристики фильмам. В большинстве примеров в Интернете вы обнаружите, что НЛП (метод tfidf) используется для создания рекомендательных систем на основе контента. Это связано с тем, что НЛП используется для извлечения информации из описания данных фильмов. По сути, это то же самое, что мы здесь делаем, но я избегал использования НЛП, чтобы объяснение было простым.

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

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

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

  • Шаг 1: Извлеките только ту часть базы данных, которая объясняет характеристики фильмов (от столбца «Комедия» до конца)
  • Шаг 2. С помощью этого извлеченного фрейма данных мы создадим матрицу парного сходства.
  • Шаг 3: создайте серию имен фильмов в том же порядке, что и исходный кадр данных, только имя фильмов здесь будет индексной позицией, а номер индексной позиции будет значением серии.
  • Шаг 4: извлеките нужный номер строки из матрицы попарного сходства, сгенерированной ранее в виде списка или ряда.
  • Шаг 5: удалите первые N чисел из отсортированного списка или серии вместе с индексной позицией.
  • Шаг 6: заполните эту индексную позицию в исходной базе данных, чтобы получить названия рекомендуемых фильмов.

Шаг 1

Вот что мы хотим

Шаг 2

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

from sklearn.metrics.pairwise import cosine_similarity
# Compute the cosine similarity matrix
cosine_sim = cosine_similarity(X = movies_df.iloc[:,3:23])

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

Поскольку у нас всего 9742 фильма, матрица сходства будет иметь размер 9742 x 9742 (строки будут представлять собой идентификатор фильма, а столбцы – показатель сходства в том же порядке, что и строки для идентификатора фильма)

Шаг 3

#Construct a reverse map of indices and movie titles
movie_indices = pd.Series(movies_df.index,index=movies_df['title']).drop_duplicates()

Шаг 4

index_position_of_basemovie = indices['Jumanji (1995)']
cosine_sim[index_position_of_basemovie]

Приведенная выше строка кода даст оценку сходства, сгенерированную для фильма «Джуманджи (1995)» со всеми 9742 фильмами. Мы хотим, чтобы оценки были отсортированы, чтобы мы могли выбрать N лучших похожих фильмов.

Шаг 5

sim_scores = list(enumerate(cosine_sim[index_position_of_basemovie]))
sim_scores_sorted = sorted(sim_scores,
                           key=lambda x: x[1], # to sort based on similarity scores
                           reverse=True)

Шаг 6

sim_scores_top10 = sim_scores_sorted[1:11]
movie_indices_top10 = [i[0] for i in sim_scores_top10]
movies_df['title'].iloc[movie_indices_top10]

Здесь у нас есть рекомендации, основанные на содержании.

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

В следующем посте мы рассмотрим рекомендательные системы на основе совместной фильтрации.