Добро пожаловать на второй урок курса по созданию рекомендательных систем! Прежде чем мы перейдем к сложным алгоритмам коллаборативной фильтрации или контентного анализа, нам необходимо подготовить «фундамент» — настроить среду разработки и разобраться с инструментарием. Рекомендательные системы работают с огромными массивами данных, поэтому стандартных средств Python будет недостаточно. Нам потребуются специализированные библиотеки, которые оптимизируют вычисления и позволяют эффективно манипулировать таблицами.
Основой любого проекта по анализу данных в Python является библиотека Pandas. Она предоставляет две основные структуры данных: Series (одномерный массив) и DataFrame (двумерная таблица). В контексте рекомендательных систем Pandas используется для загрузки данных о пользователях, товарах и их взаимодействиях (например, рейтингов или покупок). С помощью Pandas мы будем очищать данные от пропусков, фильтровать неактивных пользователей и объединять разные источники информации в единый набор для обучения модели.
Для выполнения тяжелых математических операций мы используем NumPy. В то время как Pandas удобен для работы с таблицами, NumPy работает с многомерными массивами (ndarrays) и предоставляет высокооптимизированные функции для линейной алгебры. Поскольку большинство рекомендательных алгоритмов (например, матричное разложение SVD) в своей основе представляют собой перемножение огромных матриц, NumPy позволяет делать это в десятки раз быстрее, чем обычные циклы Python, благодаря использованию векторных вычислений.
Третий столп нашего стека — Scikit-learn. Это самая популярная библиотека для классического машинного обучения. В создании рекомендательных систем она незаменима для вычисления сходства между объектами (например, косинусного сходства), предобработки данных (масштабирования признаков) и оценки качества модели с помощью метрик, таких как RMSE (Root Mean Squared Error) или Precision@K. Scikit-learn предоставляет унифицированный интерфейс, что позволяет легко менять одну модель на другую для сравнения результатов.
Давайте рассмотрим, как на практике происходит инициализация данных и базовые операции с ними. Представьте, что у нас есть список взаимодействий пользователей с фильмами. Нам нужно превратить этот список в структуру, с которой может работать алгоритм.
import pandas as pd
import numpy as np
# Создание демонстрационного набора данных
data = {
'user_id': [1, 1, 1, 2, 2, 3, 3],
'item_id': [101, 102, 103, 101, 104, 102, 105],
'rating': [5, 4, 1, 4, 5, 2, 4]
}
df = pd.DataFrame(data)
# Создание матрицы взаимодействий (Pivot Table)
user_item_matrix = df.pivot(index='user_id', columns='item_id', values='rating').fillna(0)
print(user_item_matrix)
В данном коде мы сначала импортируем Pandas и NumPy. Создаем словарь data, который имитирует лог оценок: кто какой товар оценил и на сколько баллов. Затем мы преобразуем этот словарь в DataFrame. Ключевым этапом является метод .pivot(), который перестраивает таблицу так, чтобы строки стали пользователями, столбцы — товарами, а значениями стали рейтинги. Метод .fillna(0) заменяет все пустые значения (NaN) на нули, так как отсутствие оценки в рекомендательных системах часто интерпретируется как нейтральное или нулевое взаимодействие.
Выбор метода pivot в сочетании с fillna обоснован тем, что большинство алгоритмов рекомендаций требуют ввода в виде матрицы (User-Item Matrix). Альтернативой мог бы быть ручной перебор данных через циклы, но это было бы катастрофически медленно на реальных данных. Использование встроенных функций Pandas позволяет выполнять эти операции на уровне скомпилированного C-кода, что критически важно при работе с миллионами строк.
Теперь разберем, как использовать Scikit-learn для вычисления сходства между пользователями. Это база для создания простых рекомендательных систем «пользователь-пользователь».
from sklearn.metrics.pairwise import cosine_similarity
# Допустим, у нас есть матрица из предыдущего примера (в виде массива NumPy)
matrix_values = user_item_matrix.values
# Вычисление косинусного сходства между всеми пользователями
similarity_matrix = cosine_similarity(matrix_values)
# Превращаем результат обратно в DataFrame для удобства чтения
similarity_df = pd.DataFrame(similarity_matrix, index=user_item_matrix.index, columns=user_item_matrix.index)
print(similarity_df)
В этом примере мы извлекаем численные значения из нашего DataFrame с помощью атрибута .values, чтобы передать их в функцию cosine_similarity из модуля sklearn.metrics.pairwise. Эта функция вычисляет косинус угла между векторами пользователей в многомерном пространстве. Чем ближе значение к 1, тем более похожи вкусы пользователей. В конце мы оборачиваем результат обратно в DataFrame, чтобы видеть, какой именно пользователь с кем схож.
Косинусное сходство было выбрано потому, что оно эффективно работает с разреженными данными и не зависит от величины векторов (например, если один пользователь ставит много оценок, а другой мало, но их вкусы совпадают, косинусное сходство все равно будет высоким). Альтернативой является Евклидово расстояние, но оно очень чувствительно к масштабу данных, что делает его менее надежным для профилей пользователей с разной активностью.
Распространенной ошибкой новичков является игнорирование типов данных. Часто ID пользователей или товаров считываются как числа (int), хотя они являются категориальными признаками. Это может привести к тому, что модель попытается найти «среднее арифметическое» между ID 101 и 105, что не имеет физического смысла. Чтобы этого избежать, всегда проверяйте типы данных с помощью df.info() и при необходимости приводите их к типу string или category. Также часто забывают про обработку пропусков (NaN), что вызывает ошибки при передаче данных в Scikit-learn.
В реальных продакшн-системах (например, в Netflix или Amazon) эти концепции реализуются на стеке Big Data (PySpark), но логика остается идентичной. Pandas и NumPy используются для прототипирования и анализа небольших выборок (sampling), чтобы проверить гипотезы перед запуском модели на терабайтах данных. Вычисление матриц сходства в реальном времени оптимизируется с помощью векторных баз данных (например, FAISS от Meta), которые позволяют искать «ближайших соседей» не перебором всей таблицы, а с помощью специальных индексов.
Register to answer these questions interactively and have your exam graded.