Могу ли я использовать SVD с историей покупок вместо рейтингов? - PullRequest
0 голосов
/ 18 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...