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)