Искусственный Интеллект 2 мин чтения

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

PROFSCODE Ekibi 26 июл 2026
Paylaş:
Создание простой рекомендательной системы с коллаборативной фильтрацией на Python

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

Что такое коллаборативная фильтрация?

Коллаборативная фильтрация (Collaborative Filtering) — это метод формирования новых рекомендаций на основе прошлых поведений и взаимодействий пользователей или элементов. В основном, у нее есть два главных подхода:

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

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

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

Surprise — это библиотека Python, которая упрощает разработку рекомендательных систем в области машинного обучения. Она позволяет легко применять различные алгоритмы (SVD, NMF, k-NN и т.д.) с использованием данных о рейтингах пользователей и оценивать модели. Установка довольно проста:

pip install scikit-surprise

Подготовка данных

Для рекомендательных систем нам обычно требуется набор данных, состоящий из столбцов user_id, item_id и rating (или взаимодействия). В этом примере мы будем имитировать небольшую часть набора данных MovieLens 100k.

import pandas as pdfrom surprise import Dataset, Readerfrom surprise.model_selection import train_test_split, cross_validate# Создание примера данных (в реальных приложениях читается из базы данных или файла)data = {    'user_id': ['user1', 'user1', 'user2', 'user2', 'user3', 'user3', 'user1', 'user2', 'user3'],    'item_id': ['itemA', 'itemB', 'itemB', 'itemC', 'itemA', 'itemC', 'itemC', 'itemA', 'itemB'],    'rating': [4, 3, 5, 4, 3, 2, 5, 4, 3]}df = pd.DataFrame(data)# Создание объекта Reader, который понимает библиотека Surprise. Объект Reader определяет шкалу рейтинговreader = Reader(rating_scale=(1, 5))# Загрузка DataFrame в формат 'Dataset' библиотеки Surprise (используя метод load_from_df)data_surprise = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader)print("Набор данных успешно загружен.")

Выбор и обучение модели

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

from surprise import SVD# Разделение данных на обучающие и тестовые наборы (аналогично традиционным методам машинного обучения)trainset, testset = train_test_split(data_surprise, test_size=0.25, random_state=42)# Инициализация и обучение алгоритма SVDalgo = SVD(random_state=42, n_epochs=20, lr_all=0.005, reg_all=0.02)algo.fit(trainset)print("Модель успешно обучена.")

Оценка модели

Для оценки того, насколько хорошо наша обученная модель делает предсказания, обычно используются метрики, такие как RMSE (среднеквадратическая ошибка) и MAE (средняя абсолютная ошибка). Более низкие значения указывают на лучшую производительность.

from surprise import accuracy# Выполнение предсказаний на тестовом набореpredictions = algo.test(testset)# Расчет значений RMSE и MAEaccuracy.rmse(predictions, verbose=True)accuracy.mae(predictions, verbose=True)

Выполнение предсказаний и генерация рекомендаций

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

# Предсказание, какую оценку user1 поставит itemDprediction_user1_itemD = algo.predict('user1', 'itemD')print(f"Предсказанная оценка для user1 для itemD: {prediction_user1_itemD.est:.2f}")# Предсказание, какую оценку user3 поставит itemAprediction_user3_itemA = algo.predict('user3', 'itemA')print(f"Предсказанная оценка для user3 для itemA: {prediction_user3_itemA.est:.2f}")

Теперь давайте посмотрим, как сделать топ-3 рекомендации для пользователя из элементов, которые он еще не оценил:

def get_top_n_recommendations(predictions, user_id, n=3):    # Отфильтровать все предсказания для пользователя    user_predictions = [pred for pred in predictions if pred.uid == user_id]    # Отсортировать по предполагаемой оценке    user_predictions.sort(key=lambda x: x.est, reverse=True)    # Получить топ n рекомендаций    top_n = user_predictions[:n]    return [(item.iid, item.est) for item in top_n]# Давайте создадим предсказания для всех пользователей и элементов (включая те, которых нет в обучающем наборе)all_predictions = []for uid in df['user_id'].unique():    for iid in df['item_id'].unique():        # Предсказывать только для элементов, которые пользователь еще не оценил        if not ((df['user_id'] == uid) & (df['item_id'] == iid)).any():            all_predictions.append(algo.predict(uid, iid))# Получить топ-3 рекомендации для 'user1'top_3_for_user1 = get_top_n_recommendations(all_predictions, 'user1', n=3)print(f"Топ-3 рекомендации для user1: {top_3_for_user1}")# Получить топ-3 рекомендации для 'user2'top_3_for_user2 = get_top_n_recommendations(all_predictions, 'user2', n=3)print(f"Топ-3 рекомендации для user2: {top_3_for_user2}")

Заключение

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

Назад к блогу

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

Пока нет комментариев. Будьте первым!

Отправить комментарий