Найти тему

Пайплайн по созданию рекомендательной системы по принципу матричного разложения

Оглавление
Для данных такого вида
Для данных такого вида

0. Импорт библиотек

Подключение к облаку:

from google.colab import drive

drive.mount('/content/gdrive')

Для работы с таблицами:

import pandas as pd

Для работы с массивами и математических операций:

import numpy as np

from math import sqrt

Для обучения:

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

Для сжатия и разложения матриц:

import scipy.sparse as sp

from scipy.sparse.linalg import svds

# если не установлено, то скачиваем через "!pip install scipy"

1. Загрузка данных и первичная обработка

ratings = pd.read_csv(path)

n_users = ratings['userId'].unique().shape[0]

n_items = ratings['movieId'].unique().shape[0]

input_list = ratings['movieId'].unique()

def scale_move_id(input_id):

-return np.where(input_list == input_id)[0][0] + 1

ratings['movieId'] = ratings['movieId'].apply(scale_move_id)

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

2. Разделение данных на выборки и их обработка

train_data, test_data = train_test_split(ratings, test_size=0.2)

train_data_matrix = np.zeros((n_users, n_items))

for line in train_data.itertuples():

-train_data_matrix[line[1] - 1, line[2] - 1] = line[3]

test_data_matrix = np.zeros((n_users, n_items))

for line in test_data.itertuples():

-test_data_matrix[line[1] - 1, line[2] - 1] = line[3]

3. Подготовка метрики

def rmse(prediction, ground_truth):

-prediction = prediction[ground_truth.nonozero()].flatten()

-ground_truth = ground_truth[ground_truth.nonozero()].flatten()

-return sqrt(mean_squared_error(prediction, ground_truth))

4. Обучение и создание результирующей матрицы

u, s, vt = svds(train_data_matrix, k=10) # u - таблица пользователей, s - какая-то ерундовина с размерностью, равной параметру k, vt - таблица предметов

s_diag_matrix = np.diag(s)

x_pred = np.dot(np.dot(u, s_diag_matrix), vt) # создает таблицу, где столбцы - индексы фильмов, строки - индексы пользователей, а элементы - предполагаемый рейтинг, который пользователь поставит фильму

5. Предсказания

x_pred[user_index][item_index] # вытаскивает спрогнозированный рейтинг, который пользователь (user_index) поставит фильму (item_index)