#python #python-3.x #pandas #knn #recommender-systems
Вопрос:
Я использую библиотеку сюрпризов Python для обучения модели KNN на основе CSV-файла. Файл CSV, как обычно, содержит пользователей, элементы и рейтинги.
В моем случае оценки-это только нули и единицы, потому что у меня есть только две возможности: либо пользователь использует какой-либо элемент, либо нет в проблемном пространстве. Тем не менее, у меня нет нулевых оценок в моем наборе данных. Следовательно, CSV-файлы для данных о поездах и тестах выглядят примерно так: только строки с номером оценки 1:
user1, item1, 1
user1, item2, 1
user2, item1, 1
user2, item3, 1
user4, item4, 1
Если я хочу получить правильный результат из модели KNN, я должен добавить строки, подобные user1, item3, 0
моему набору данных, но проблема в том, что, поскольку набор данных разрежен, конечный набор данных станет огромным, если я добавлю в него строки с нулевым рейтингом, а это трудоемкая задача.
Во-первых, я открыл CSV-файлы для наборов данных для тестирования и обучения:
import pandas as pd
from surprise import Dataset
from surprise import Reader
from surprise.model_selection import train_test_split
train, test = pd.read_csv('train.csv'), pd.read_csv('test.csv'])
train_data = Dataset.load_from_df(train[["user", "item", "rating"]], Reader(rating_scale=(0, 1)))
test_data = Dataset.load_from_df(test[["user", "item", "rating"]], Reader(rating_scale=(0, 1)))
train_set = train_data.build_full_trainset()
test_set = train_test_split(test_data, test_size=1.0)[1]
Я нашел решение для добавления строк с нулевым рейтингом в фрейм данных открытых данных, но я уверен, что есть лучшее решение:
train_set_filled = []
for u in train_set.all_users():
user_items = {j for (j, _) in train_set.ur[u]}
for i in train_set.all_items():
if i not in user_items:
train_set_filled = [(train_set.to_raw_uid(u), train_set.to_raw_iid(i), 0)]
else:
train_set_filled = [(train_set.to_raw_uid(u), train_set.to_raw_iid(i), 1)]
train_set = Dataset.load_from_df(pd.DataFrame(train_set_filled), Reader(rating_scale=(0, 1))).build_full_trainset()
Наконец, я обучил модель и проверил свои тестовые данные на ней:
algo = train(train_set)
predictions = algo.test(test_set, verbose=False)
Библиотека сюрпризов содержит различные алгоритмы с именами KNNBasic, KNNWithZScore, KNNBaseline, SVD, SVDpp, NMF, SlopeOne и совместное использование. Мой второй вопрос заключается в том, какой из этих алгоритмов лучше всего подходит для данных с нулевым и одним рейтингом?
Комментарии:
1. на этот вопрос нет прямого ответа, вы должны попробовать их и выбрать наиболее подходящую модель для ваших данных на основе набора проверок