Создание рекомендательных систем с использованием библиотеки Surprise

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


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

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='	', 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, на которые вы можете абсолютно бесплатно зарегистрироваться на странице курса.


Источник: habr.com

Комментарии: