Я работаю над базовой c системой рекомендации книг, основанной только на истории покупок пользователя . Я также построил небольшой рекомендатель на основе контента, используя CountVectorizer и Cosine Similarity, который планировал объединить с историей покупок, чтобы повысить точность .
Используемый мной фрейм данных примерно так:
number type username order_code product price publishing_date order_datetime model genres
13 access kerrigan None 130365 9.99 2018-01-15 NaT printedbook fantasy,adventure
1 order 45michael 78910 130365 9.98 2019-02-15 2019-12-10 ebook action
5 access alicia7 None 86833 7.99 2017-03-17 NaT ebook drama, romantic
7 access john5 None 86833 7.99 2020-01-04 NaT printedbook fantasy, kids
1 oder alicia7 12345 76863 15.75 2016-06-12 2020-02-4 printedbook kids
Число указывает, сколько раз пользователь обращался к этому файлу книги. Данные, которые я использую для обучения алгоритма SVDpp, это просто «имя пользователя», «продукт» и «количество» после форматирования DataFrame, чтобы получить что-то вроде этого:
type username product count
0 access kerrigan 130365 0
1 access alicia7 86833 0
2 access john5 86833 0
3 order 45michael 130365 1
4 order alicia7 76863 1
Где ' count ' указывает, купил ли пользователь книгу (1) или если у него нет (0) . Больше всего я сомневаюсь в правильности или даже эффективности использования такого рода данных с этим конкретным c алгоритмом (SVD, SVDpp).
Процесс, которому я следовал, выглядит примерно так:
reader = Reader()
algo = SVDpp()
data = Dataset.load_from_df(order_df[['username', 'product', 'count']], reader)
trainset, testset = train_test_split(data, test_size=0.2)
algo.fit(trainset)
predictions = algo.test(testset)
Еще одна вещь, которую я действительно не знаю, как это сделать, это как я могу получить рекомендации, основанные на определенном пользователе, я имею в виду, что, если я оставил пользователя, для которого я хочу давать рекомендации в поезде ? Как я могу получить список рекомендаций с указанием 'username' , за которое я хочу его получить?
EDIT: после некоторого тестирования как с SVD, так и с KNN I ' мы понимаем, что результаты, которые я получаю по прогнозам, примерно такие:
username product actual prediction details
0 kerrigan 130365 0.0 1 {'was_impossible': False}
1 alicia7 130365 1.0 1 {'was_impossible': False}
2 kylemm 537077 1.0 1 {'was_impossible': False}
3 angel8 86217 1.0 1 {'was_impossible': False}
4 john5 130365 1.0 1 {'was_impossible': False}
И это не кажется правильным, я вычислил косинусное сходство между пользователями в зависимости от их покупок, и я получил эту матрицу:
# Matrix with users as rows, products as columns and count as content
df_matrix = pd.pivot_table(order_df, values='count', index='username', columns='product')
# Replace all NaN contents with 0
df_matrix_dummy = df_matrix.fillna(0)
#Compute the cosine similarity matrix using the dummy matrix
cosine_sim = cosine_similarity(df_matrix_dummy, df_matrix_dummy)
#Convert into pandas dataframe
cosine_sim = pd.DataFrame(cosine_sim, index=df_matrix.index, columns=df_matrix.index)
username 45michael alicia7 kerrigan
username
45michael 1.000000 0.577350 0.408248
alicia7 0.577350 1.000000 0.000000
john5 0.816497 0.707107 0.000000
kerrigan 0.408248 0.000000 1.000000
Должен ли я просто использовать косинусное сходство 1037 * напрямую, как я это делал с основанным на контенте рекомендателем? Я думаю, что проблема здесь в том, что у меня есть двоичные данные: 1-купленный, 0-не купленный, у меня нет диапазона значений, таких как рейтинги. Я мог бы использовать общее количество купленных книг, но с книгами я не знаю, как это улучшило бы систему.