Полное руководство по рекомендательным системам

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

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

В этом блоге мы обсудим пять подходов, которые можно использовать для создания рекомендательных систем. Наборы данных, используемые в этом блоге, взяты из Kaggle, а файлы, связанные с этим блогом, можно найти в моем репозитории GitHub».

1. Система рекомендаций на основе популярности

Как следует из названия, рекомендательные системы, основанные на популярности, рекомендуют пользователям товары, которые сейчас в тренде. Они работают по принципу популярности. например, если продукт А покупается каждым новым пользователем, существует высокая вероятность того, что он порекомендует продукт А пользователю, который только что зарегистрировался. Топ-10 Netflix также основан на системах рекомендаций, основанных на популярности.

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

import pandas as pd
import seaborn as sns
data = pd.read_csv('movies_data.csv') ## can be found on github repo

sorted_data = data.sort_values(by='popularity', ascending=False) ## sorting our movies based on popularity
top_10_popular_movies = sorted_data.iloc[:10] ## extracting top 10 movies

sns.barplot(y='title',x='popularity',data=top_10_popular_movies);

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

import pandas as pd
import seaborn as sns

data = pd.read_csv('movies_data.csv') ## can be found on github repo

sorted_data = data.sort_values(by='vote_average', ascending=False)
top_10_popular_movies_va = sorted_data.iloc[:10]

sns.barplot(y='title',x='vote_average',data=top_10_popular_movies_va);

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

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

2. Система рекомендаций на основе классификации

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

Например, товар Б — это игровая мышь за 100 долларов, которую в основном покупают мужчины в возрасте от 18 до 22 лет. Когда приходят новые пользователи, наш классификатор будет использовать информацию о новых пользователях в сочетании с заранее известной информацией о продукте, чтобы предсказать двоичное значение, классифицирующее, следует ли рекомендовать продукт B пользователю или нет.

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

3. Система рекомендаций на основе контента

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

Например, если пользователь А посмотрел фильм «Железный человек», и он ему понравился, то, основываясь на прошлом опыте пользователя, модель, вероятно, порекомендует ему следующую часть фильма «Железный человек 2» и другие фильмы Marvel аналогичного жанра. Они используются многими крупными компаниями, такими как Spotify, Amazon, Netflix, eBay, H&M и т. д.

Давайте воспользуемся набором данных фильмов TMDB 5000 и попробуем порекомендовать 10 фильмов пользователю, который недавно закончил смотреть «Мстителей». Я буду использовать очищенную версию набора данных для этой статьи. Вы можете найти исходный набор данных и файл для очистки данных в моем репозитории GitHub.

import pandas as pd
import seaborn as sns
import numpy

df = pd.read_csv('Cleaned_df.csv') 
df.head()

## Vectorization
from sklearn.feature_extraction.text import CountVectorizer
countVec = CountVectorizer(max_features=10000)
Vectors = countVec.fit_transform(df['tags']).toarray()

## Cosine Similarity between Vectors
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity(Vectors)

## Custom Functions
def get_title_from_index(index):
    return df[df.index == index]["title"].values[0]
def get_index_from_title(title):
    return df[df.title == title].index[0]

user_liked_movie = 'The Avengers'

movie_index = get_index_from_title(user_liked_movie)
similar_movies = list(enumerate(similarity[movie_index]))
sorted_similar_movies = sorted(similar_movies,key=lambda x:x[1],reverse=True)[1:11]

top_simiar_movies = {}
for i in sorted_similar_movies:
    top_simiar_movies[get_title_from_index(i[0])] = i[1]
sns.barplot(x=list(top_simiar_movies.values()),y=list(top_simiar_movies.keys()));

В приведенном выше примере мы использовали CounterVectorize в качестве нашего алгоритма векторизации и CosineSimilarity в качестве матрицы сходства. Мы можем использовать другие алгоритмы, такие как TF-IDF, Sigmoid Kernel и т. д., чтобы еще больше улучшить наши результаты и рекомендации.

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

4. Совместная система рекомендаций

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

Например, если пользователю А нравятся «Железный человек», «Бэтмен» и «Человек-паук», а пользователю Б нравятся «Бэтмен», «Супермен» и «Тор», то в будущем фильм «Тор» может быть рекомендован пользователю А, а фильм «Железный человек» может быть рекомендован пользователю Б, потому что у пользователей A и B схожие вкусы в кино.

Прошлые взаимодействия между пользователями и элементами хранятся в матрице, называемой «матрицей взаимодействия с пользовательскими элементами», которая используется для рекомендации элементов пользователям.

Существует два распространенных типа подходов, используемых для создания совместных рекомендательных систем:

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

Подходы, основанные на памяти, далее делятся на два разных метода, в которых коэффициенты строк и столбцов меняются местами.

Типы систем совместных рекомендаций на основе памяти

  1. От пользователя к пользователю:
    ▪️ Создайте матрицу пользователей и элементов (сводную таблицу), где каждая строка — это пользователь, а каждый столбец — это элемент.
    ▪️ Вычислять оценки схожести между пользователями (строками).
    ▪ ️Находить пользователей, похожих на конкретного пользователя, на основе сходства между строками.
    ▪️ Предлагайте рекомендации.

2. Элемент к элементу:
▪️ Найдите взаимосвязь между элементами и порекомендуйте наиболее часто просматриваемые элементы разным пользователям.
▪️ Такие системы считаются лучше, чем системы, основанные на пользователях.
▪️ Создайте матрицу пользователей и элементов, где каждая строка — это элемент, а каждый столбец — пользователь.
▪️ Вычислите сходство между элементами.
▪️ Рекомендовать товары пользователям в зависимости от их частоты.

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

## Reading Dataset
import pandas as pd

movies_df  = pd.read_csv('data/movies.csv')
ratings_df = pd.read_csv('data/ratings.csv')

## Merging ID & titles with ratings
df = pd.merge(movies_df,ratings_df,on='movieId').drop(['genres','timestamp'],axis=1)

## Filtering Data (Ignoring Movies with less than 10 ratings, and Users with less than 100 ratings given)
def filter_data(df):
    ## Ratings Per Movie
    ratings_per_movie = df.groupby('movieId')['rating'].count()
    ## Ratings By Each User
    ratings_per_user = df.groupby('userId')['rating'].count()

    ratings_per_movie_df = pd.DataFrame(ratings_per_movie)
    ratings_per_user_df = pd.DataFrame(ratings_per_user)

    filtered_ratings_per_movie_df = ratings_per_movie_df[ratings_per_movie_df.rating >= 10].index.tolist()
    filtered_ratings_per_user_df = ratings_per_user_df[ratings_per_user_df.rating >= 100].index.tolist()
    
    df = df[df.movieId.isin(filtered_ratings_per_movie_df)]
    df = df[df.userId.isin(filtered_ratings_per_user_df)]
    return df

df = filter_data(df)

## PivotTable
userRatings = df.pivot_table(index=['userId'],columns=['title'],values='rating').fillna(0)

## Preparing Correlation Matrix
corrMatrix = userRatings.corr(method='pearson')

### user Input Movies (Single Movie)
def recommend_movies(movie_name,rating):
    similar_ratings = corrMatrix[movie_name]*(rating-2.5)
    recommendations = similar_ratings.sort_values(ascending=False)
    return recommendations

## User Input
movie_name = "Pulp Fiction (1994)"
rating = 5
recommendations = recommend_movies(movie_name,rating)
print(recommendations[1:11].sort_values(ascending=False))

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

5. Гибридная система рекомендаций

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

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

Рекомендуемые чтения

1. A Hybrid approach using collaborative filtering and content based filtering for recommender system

2. Hybrid Recommender Systems: A Systematic Literature Review

3. 7 Types of Hybrid Recommendation System

4. Ontological User profiling in recommender systems

5. A Curated List of Must Read research papers on Recommender systems

Спасибо за прочтение (: