Руководство по созданию надежной системы рекомендаций

Введение:

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

Информация из набора данных Netflix Prize (EDA)

Из-за огромного размера набора данных управление всеми данными на машине с ограниченной конфигурацией было сложной задачей. Поэтому мы решили использовать 70 % всех данных для исследовательского анализа данных (EDA), чтобы обеспечить эффективную обработку и анализ.

Блокнот: https://github.com/githubssd/NETFLIX-RECO/blob/main/notebooks/EDA.ipynb

  1. Матричная композиция:
  • Разреженная матрица имеет размеры 479 552 строки и 17 770 столбцов.
  • Он содержит 70 033 063 элемента.
  • Матрица заполнена всего на 0,82%.

2. Целостность данных:

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

3. Распределение оценок:

4. Временные тенденции:

Более 99 % всех фильмов были выпущены после 1900 года, поэтому фильмы, выпущенные до этого года, можно исключить из анализа.

5. Поведение пользователей:

6. Опытные пользователи и неопытные пользователи:

7. Рекомендуемое содержание:

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

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

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

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

Онлайн-показатели.
Онлайн-показатели используются для оценки эффективности моделей рекомендаций в реальных сценариях. A/B-тестирование проводится для сравнения таких показателей, как рейтинг кликов (CTR), время просмотра и коэффициент конверсии. Эти метрики дают представление о том, насколько хорошо модели работают при развертывании на живой пользовательской базе.

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

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

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

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

4. Управление перегруженными компонентами: некоторые компоненты системы рекомендаций с большей вероятностью будут перегружены. Netflix должен предвидеть эти узкие места и соответствующим образом масштабировать систему.

5. Что делать в случае недоступности: в случае недоступности компонента должны быть приняты меры для устранения и смягчения влияния на общую производительность системы.

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

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

Этапы модели рекомендации:

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

Эксперименты:

Коэффициент корреляции Пирсона

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

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

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

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

import pandas as pd

def load_data():
    interactions_df = pd.read_csv(
              '/kaggle/input/netflix-prize-lite/netflix_interactions_lite.csv',
                                  usecols=[1, 2, 3])
    movie_titles_df = pd.read_csv(
                           '/kaggle/input/netflix-prize-data/movie_titles.csv',
                           header=None, encoding="ISO-8859-1", 
                        usecols=[0, 1, 2], names=['movieId', 'year', 'title'])

    movie_titles_df.movieId = movie_titles_df.movieId.astype(str)
    
    return interactions_df, movie_titles_df

def create_movie_title_dict(movie_titles_df):
    movie_title_dict = dict(zip(movie_titles_df.movieId, movie_titles_df.title))
    return movie_title_dict

def create_pivot_table(interactions_df):
    piv_df = pd.pivot_table(interactions_df, index="userId", columns='movieId',
                                     values="rating",aggfunc='mean').fillna(0)
    return piv_df

def item_based_corr(piv_df, movie_id, movie_title_dict):
    movie_id = movie_id.lower()
    movie_rating = piv_df[int(movie_id)]
    similar_movies = piv_df.corrwith(movie_rating)
    similar_movies_df = pd.DataFrame(similar_movies, columns=['corr'])
    similar_movies_df = similar_movies_df.sort_values(by=['corr'], 
                                                            ascending=False)
    similar_movies_df.reset_index(inplace=True)
    similar_movies_df['title'] = similar_movies_df.movieId.apply(lambda x: 
                                                      movie_title_dict[str(x)])
    
    return similar_movies_df.head(11)

def main(movie_id):
    interactions_df, movie_titles_df = load_data()
    movie_title_dict = create_movie_title_dict(movie_titles_df)
    piv_df = create_pivot_table(interactions_df)
    
    reco_df = item_based_corr(piv_df, movie_id, movie_title_dict)
    return reco_df

if __name__ == "__main__":
    movie_id = '28'
    print("Query Movie:", movie_title_dict['28'])
    main(movie_id)

Косинусное сходство

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

from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
import pandas as pd
from sklearn.neighbors import NearestNeighbors

def load_data():
    interactions_df = pd.read_csv('/kaggle/input/netflix-prize-lite/netflix_interactions_lite.csv',
                                  usecols=[1, 2, 3])
    movie_titles_df = pd.read_csv('/kaggle/input/netflix-prize-data/movie_titles.csv',
                                  header=None, encoding="ISO-8859-1",
                                  usecols=[0, 1, 2], names=['movieId', 'year', 'title'])
    movie_titles_df.movieId = movie_titles_df.movieId.astype(str)

    return interactions_df, movie_titles_df

def create_movie_title_dict(movie_titles_df):
    movie_title_dict = dict(zip(movie_titles_df.movieId, movie_titles_df.title))
    return movie_title_dict

def create_pivot_table(interactions_df):
    piv_df = pd.pivot_table(interactions_df, index="userId", columns='movieId',
                            values="rating", aggfunc='mean').fillna(0)
    return piv_df

def create_csr_matrix(piv_df):
    csr_matrix = sparse.csr_matrix(piv_df.T.values)
    return csr_matrix

def create_knn_model(csr_matrix):
    knn = NearestNeighbors(n_neighbors=11, metric='cosine')
    knn.fit(csr_matrix)
    return knn

def nearest_neighbors_reco(movie_id, piv_df, knn, movie_title_dict):
    movie_id = movie_id.lower()
    movie_rating = piv_df[int(movie_id)]

    d, ind = knn.kneighbors(movie_rating.values.reshape(1, -1), n_neighbors=11)

    for i in range(6):
        print(movie_title_dict[str(piv_df.columns[ind.flatten()[i]])], d.flatten()[i])

def main(movie_id):
    interactions_df, movie_titles_df = load_data()
    movie_title_dict = create_movie_title_dict(movie_titles_df)
    piv_df = create_pivot_table(interactions_df)
    csr_matrix = create_csr_matrix(piv_df)
    knn = create_knn_model(csr_matrix)

    nearest_neighbors_reco(movie_id, piv_df, knn, movie_title_dict)

if __name__ == "__main__":
    movie_id = "8"
    print("Query Movie:", movie_title_dict[movie_id])
    main(movie_id)

Совместная фильтрация с помощью Keras

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

Совместную фильтрацию можно разделить на два основных типа:

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

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

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

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

код для этого можно найти здесь: https://github.com/githubssd/NETFLIX-RECO/tree/main/notebooks

Заключение и будущая работа

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

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

А пока, удачного изучения и до скорой встречи!