
Рекомендательные не только помогают нам экономить время, предоставляя персонализированные рекомендации, но и оказывают влияние на наш выбор и потребительское поведение. Подобные системы нашли применение в различных областях, включая электронную коммерцию, социальные сети, медиа-стриминг и даже медицину, помогая врачам принимать более обоснованные решения.
Surprise — это мощный инструмент, предоставляющий широкий набор алгоритмов и инструментов для построения и оценки рекомендательных систем. Эта библиотека основана на Python, является простой в использовании и гибкой в применение, что делает ее прекрасным выбором для как начинающих, так и опытных разработчиков.
Основы рекомендательных систем
Рекомендательные системы можно разделить на несколько основных типов, каждый из которых имеет свои преимущества и ограничения.
-
Фильтрация по содержанию
Фильтрация по содержанию основана на анализе характеристик товаров или контента и соотнесении их с предпочтениями пользователя. Например, для рекомендации фильмов можно анализировать жанры, актеров, режиссеров, и предлагать фильмы, которые имеют схожие характеристики с теми, которые пользователь предпочитает.
-
Коллаборативная фильтрация
Коллаборативная фильтрация основана на анализе поведения пользователей и сравнении их с другими пользователями. Существует два подтипа коллаборативной фильтрации:
-
User-Based Collaborative Filtering (UBCF): Рекомендации строятся на основе схожести между пользователями. Если два пользователя имеют похожие предпочтения, то они могут получить рекомендации на основе того, что понравилось другому пользователю.
-
Item-Based Collaborative Filtering (IBCF): Рекомендации строятся на основе схожести между товарами или контентом. Если пользователь предпочитал определенный товар, то ему будут рекомендованы похожие товары, которые другие пользователи с похожими интересами также предпочли.
-
-
Гибридные системы
Гибридные системы объединяют в себе элементы как фильтрации по содержанию, так и коллаборативной фильтрации, чтобы улучшить качество рекомендаций. Это позволяет справляться с ограничениями каждого из подходов.
Принцип работы рекомендательных систем в корне зависит от их типа. В случае фильтрации по содержанию, система анализирует характеристики элементов (товаров, контента) и пытается найти наиболее подходящие для пользователя на основе его предпочтений.
В коллаборативной фильтрации, система анализирует историю взаимодействий пользователя с системой и использует эту информацию для нахождения схожих пользователей или элементов.
Гибридные системы комбинируют оба подхода, что позволяет улучшить качество рекомендаций, учитывая разнообразные аспекты интересов пользователя.
Существует несколько ключевых задач и метрик для оценки рекомендательных систем:
-
Задача ранжирования: Оценка того, насколько хорошо система упорядочивает рекомендации. Метрики, такие как 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 предоставляет множество классов и функций для создания, обучения и оценки рекомендательных систем. Давайте рассмотрим основные компоненты библиотеки:
-
Dataset: Класс
Datasetпозволяет загружать и предобрабатывать данные для рекомендательной системы. Вы можете использовать встроенные датасеты или загрузить собственные данные в формате, поддерживаемом Surprise.
from surprise import Dataset # Загрузка встроенного датасета data = Dataset.load_builtin('ml-100k') # Загрузка данных из файла data = Dataset.load_from_file('custom_data.csv', reader=reader)
-
Reader: Класс
Readerиспользуется для определения того, как данные хранятся в файле. Вы можете настроить параметры, такие как разделитель столбцов, минимальное и максимальное значение рейтинга и др.
from surprise import Reader reader = Reader(line_format='user item rating timestamp', sep='\t', rating_scale=(1, 5))
-
Модели алгоритмов: 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)
-
Метрики оценки: 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)
-
Кросс-валидация: Вы можете использовать кросс-валидацию для оценки производительности модели на разных наборах данных.
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, на которые вы можете абсолютно бесплатно зарегистрироваться на странице курса.
ссылка на оригинал статьи https://habr.com/ru/articles/764222/
Добавить комментарий