Примените KNN к набору данных, содержащему двоичные (нулевые и единичные) оценки в Python

#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. на этот вопрос нет прямого ответа, вы должны попробовать их и выбрать наиболее подходящую модель для ваших данных на основе набора проверок