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

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

Основы рекомендательных систем

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

  1. Фильтрация по содержанию

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

  2. Коллаборативная фильтрация

    Коллаборативная фильтрация основана на анализе поведения пользователей и сравнении их с другими пользователями. Существует два подтипа коллаборативной фильтрации:

    • User-Based Collaborative Filtering (UBCF): Рекомендации строятся на основе схожести между пользователями. Если два пользователя имеют похожие предпочтения, то они могут получить рекомендации на основе того, что понравилось другому пользователю.

    • Item-Based Collaborative Filtering (IBCF): Рекомендации строятся на основе схожести между товарами или контентом. Если пользователь предпочитал определенный товар, то ему будут рекомендованы похожие товары, которые другие пользователи с похожими интересами также предпочли.

  3. Гибридные системы

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

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

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

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

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

  • Задача ранжирования: Оценка того, насколько хорошо система упорядочивает рекомендации. Метрики, такие как Hit Rate и Normalized Discounted Cumulative Gain (NDCG), используются для измерения качества ранжирования.

  • Задача классификации: Оценка, предсказывает ли система, понравится ли пользователю рекомендация. Метрики, такие как точность (Precision) и полнота (Recall), используются для оценки качества классификации.

  • Задача прогнозирования рейтинга: Оценка, насколько близко система предсказывает рейтинг, который пользователь дал элементу. Метрики, такие как Mean Absolute Error (MAE) и Root Mean Square Error (RMSE), используются для измерения точности прогнозов.

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

Введение в библиотеку Surprise

Surprise (Simple Python RecommendatIon System Engine) - это Python-библиотека, разработанная для создания и оценки рекомендательных систем. Она предоставляет простой и эффективный способ реализовать различные алгоритмы рекомендации, позволяя разработчикам быстро и легко создавать персонализированные рекомендательные системы.

Установка и настройка

Установка Surprise осуществляется через Python Package Index (PyPI) с помощью pip. Для начала установки выполните следующую команду:

pip install scikit-surprise

После успешной установки, вы готовы начать работу с библиотекой Surprise. Важно отметить, что Surprise требует наличия библиотеки scipy, так что убедитесь, что она установлена в вашем окружении.

Основные функциональности и классы Surprise

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

  1. Dataset: Класс Dataset позволяет загружать и предобрабатывать данные для рекомендательной системы. Вы можете использовать встроенные датасеты или загрузить собственные данные в формате, поддерживаемом Surprise.

from surprise import Dataset

# Загрузка встроенного датасета
data = Dataset.load_builtin('ml-100k')

# Загрузка данных из файла
data = Dataset.load_from_file('custom_data.csv', reader=reader)
  1. Reader: Класс Reader используется для определения того, как данные хранятся в файле. Вы можете настроить параметры, такие как разделитель столбцов, минимальное и максимальное значение рейтинга и др.

from surprise import Reader

reader = Reader(line_format='user item rating timestamp', sep='\t', rating_scale=(1, 5))
  1. Модели алгоритмов: Surprise предоставляет множество алгоритмов для создания рекомендательных систем, таких как SVD, K-Nearest Neighbors (KNN), и другие. Вы можете выбрать подходящий алгоритм и настроить его параметры.

from surprise import SVD

# Создание модели SVD
model = SVD(n_factors=100, n_epochs=20, lr_all=0.005, reg_all=0.02)

# Обучение модели на данных
trainset = data.build_full_trainset()
model.fit(trainset)
  1. Метрики оценки: Surprise предоставляет различные метрики для оценки производительности моделей, такие как Mean Absolute Error (MAE), Root Mean Square Error (RMSE), Precision, Recall и другие.

from surprise import accuracy

# Получение прогнозов модели
testset = trainset.build_testset()
predictions = model.test(testset)

# Расчет MAE и RMSE
mae = accuracy.mae(predictions)
rmse = accuracy.rmse(predictions)
  1. Кросс-валидация: Вы можете использовать кросс-валидацию для оценки производительности модели на разных наборах данных.

from surprise.model_selection import cross_validate

results = cross_validate(model, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

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

Разработка огромной рекомендательной системы с использованием Surprise

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

from surprise import SVD
from surprise.model_selection import train_test_split

# Разделение данных на обучающий и тестовый наборы
trainset, testset = train_test_split(data, test_size=0.2)

# Создание модели SVD
model = SVD(n_factors=100, n_epochs=20, lr_all=0.005, reg_all=0.02)

# Обучение модели на обучающем наборе
model.fit(trainset)

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

Оценка производительности модели

Для оценки производительности модели мы можем использовать различные метрики, такие как Mean Absolute Error (MAE) и Root Mean Square Error (RMSE). Эти метрики позволяют оценить, насколько близко прогнозы модели к реальным рейтингам пользователей.

from surprise import accuracy

# Получение прогнозов модели на тестовом наборе
predictions = model.test(testset)

# Расчет MAE и RMSE
mae = accuracy.mae(predictions)
rmse = accuracy.rmse(predictions)

print(f'MAE: {mae}')
print(f'RMSE: {rmse}')

Выдача рекомендаций на основе обученной модели

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

# Получение топ 10 рекомендаций для пользователя с идентификатором user_id
user_id = '123'
top_n = model.get_top_n(predictions, n=10)

# Вывод рекомендаций
for user, user_ratings in top_n.items():
    if user == user_id:
        print(f"Рекомендации для пользователя {user_id}:")
        for item_id, rating in user_ratings:
            print(f"Товар ID: {item_id}, Рейтинг: {rating}")

Настройка и оптимизация рекомендательной системы

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

Выбор правильных параметров модели может существенно повысить ее точность и эффективность. Для этого часто используют методы подбора гиперпараметров, такие как кросс-валидация и поиск по сетке. Рассмотрим пример подбора параметров для модели SVD с использованием библиотеки GridSearchCV из scikit-learn:

from surprise import SVD
from surprise.model_selection import GridSearchCV

# Задаем сетку параметров для поиска
param_grid = {'n_factors': [50, 100, 200],
              'n_epochs': [20, 30, 50],
              'lr_all': [0.002, 0.005, 0.01],
              'reg_all': [0.02, 0.1, 0.2]}

# Создаем объект модели SVD
model = SVD()

# Используем GridSearchCV для подбора параметров
grid_search = GridSearchCV(model, param_grid, measures=['rmse'], cv=5)
grid_search.fit(data)

# Получаем наилучшие параметры
best_params = grid_search.best_params['rmse']
print(f'Наилучшие параметры: {best_params}')

После выполнения этого кода, вы получите наилучшие параметры для модели SVD на основе кросс-валидации.

Оптимизация скорости работы

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

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

  • Кэширование: Храните предварительно вычисленные результаты, чтобы избежать повторных вычислений.

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

  • Оптимизация запросов к базе данных: Если вы используете базу данных для хранения данных, оптимизируйте запросы для минимизации времени выполнения.

Управление рекомендациями и фильтрацией

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

  • Фильтрация: Применяйте фильтры для исключения нежелательных элементов. Например, фильтрация по возрасту, жанру или категории.

  • Персонализация: Учитывайте интересы и предпочтения каждого пользователя при формировании рекомендаций.

  • Активное обучение: Собирайте обратную связь от пользователей и используйте ее для улучшения рекомендаций.

Пример применения фильтрации по жанру и персонализации:

# Получение топ 10 рекомендаций для пользователя с учетом жанра 'комедия'
user_id = '123'
top_n = model.get_top_n(predictions, n=10, genre='комедия', user=user_id)

# Вывод рекомендаций
for item_id, rating in top_n:
    print(f"Товар ID: {item_id}, Рейтинг: {rating}")

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

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

Пример применения библиотеки Surprise

Создадим рекомендательную систему для онлайн магазина книг с использованием библиотеки Surprise. Мы начнем с создания собственного датасета, а затем шаг за шагом создадим и настроим рекомендательную систему. (тестируйте код у себя на collab/jupiter)

Шаг 1: Импорт необходимых библиотек

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

import random
import pandas as pd
from surprise import Dataset, Reader, SVD
from surprise.model_selection import train_test_split
from surprise import accuracy

Шаг 2: Создание собственного датасета

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

# Создаем список пользователей и книг
users = [str(i) for i in range(1, 101)]
books = [str(i) for i in range(1, 201)]

# Генерируем случайные оценки пользователей для книг
data = []
for user in users:
    for book in books:
        rating = random.randint(1, 5)
        data.append([user, book, rating])

# Создаем DataFrame из данных
df = pd.DataFrame(data, columns=['user_id', 'book_id', 'rating'])

# Создаем объект Reader для определения формата данных
reader = Reader(rating_scale=(1, 5))

# Создаем датасет из DataFrame и объекта Reader
dataset = Dataset.load_from_df(df[['user_id', 'book_id', 'rating']], reader)

Шаг 3: Разделение данных на обучающий и тестовый наборы

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

trainset, testset = train_test_split(dataset, test_size=0.2, random_state=42)

Шаг 4: Создание и обучение модели

Теперь создадим модель рекомендательной системы. В этом примере мы используем модель SVD.

model = SVD()
model.fit(trainset)

Шаг 5: Получение прогнозов и оценка производительности модели

Мы получим прогнозы на тестовом наборе и оценим производительность модели.

predictions = model.test(testset)

mae = accuracy.mae(predictions)
rmse = accuracy.rmse(predictions)

print(f'MAE: {mae}')
print(f'RMSE: {rmse}')

Шаг 6: Получение рекомендаций для конкретного пользователя

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

# Выбираем случайного пользователя
user_id = random.choice(users)

# Получаем топ N рекомендаций для пользователя
top_n = model.get_top_n(predictions, n=10, user=user_id)

print(f"Рекомендации книг для пользователя {user_id}:")
for book_id, rating in top_n:
    print(f"Книга ID: {book_id}, Рейтинг: {rating}")

Шаг 7: Настройка параметров модели (по желанию)

Для настройки параметров модели, мы можем использовать методы подбора гиперпараметров, такие как GridSearchCV из scikit-learn.

from surprise.model_selection import GridSearchCV

param_grid = {'n_factors': [50, 100, 200],
              'n_epochs': [20, 30, 50],
              'lr_all': [0.002, 0.005, 0.01],
              'reg_all': [0.02, 0.1, 0.2]}

# Создаем объект модели SVD
model = SVD()

# Используем GridSearchCV для подбора параметров
grid_search = GridSearchCV(model, param_grid, measures=['rmse'], cv=5)
grid_search.fit(dataset)

# Получаем наилучшие параметры
best_params = grid_search.best_params['rmse']
print(f'Наилучшие параметры: {best_params}')

Шаг 8: Оптимизация скорости работы (по желанию)

Для оптимизации скорости работы системы можно использовать параллельное обучение. В библиотеке Surprise это можно сделать с помощью параметра n_jobs.

model = SVD(n_jobs=-1)  # Использовать все доступные ядра процессора
model.fit(trainset)

Шаг 9: Управление рекомендациями и фильтрацией (по желанию)

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

# Получение топ 10 рекомендаций для пользователя с учетом жанра 'фантастика'
user_id = '42'
genre = 'фантастика'

top_n = model.get_top_n(predictions, n=10, user=user_id)

filtered_recommendations = [(book_id, rating) for book_id, rating in top_n if genre in get_genre_of_book(book_id)]

print(f"Рекомендации книг в жанре '{genre}' для пользователя {user_id}:")
for book_id, rating in filtered_recommendations:
    print(f"Книга ID: {book_id}, Рейтинг: {rating}")

Шаг 10: Интеграция в магазин

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

def get_recommendations_for_user(user_id, n=10):
    # Получаем рекомендации для пользователя
    top_n = model.get_top_n(predictions, n=n, user=user_id)
    return top_n

# Использование функции в магазине
user_id = '42'
recommended_books = get_recommendations_for_user(user_id)

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

Заключение

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

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

Комментарии (1)


  1. Suharkov
    03.10.2023 05:10

    Сие есть цитата:

    # Генерируем случайные оценки пользователей для книг
    data = []
    for user in users:
        for book in books:
            rating = random.randint(1, 5)
            data.append([user, book, rating])

    У вас уже каждый из 100 пользователей поставил оценку каждой из 200 книг, что вы там предсказывать собрались?