Как сделать рекомендации SVD - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь использовать SVD, чтобы давать рекомендации по книгам на основе покупок. Я использую матрицу, в которой столбцы - это книги, строки - это имена пользователей и содержание, если он / она приобрел нужную книгу (1, если пользователь сделал, или 0, если он этого не сделал. это лучший вариант]). Я также создал матрицу косинус сходства, в которой я могу видеть сходство между пользователями на основе их покупок.

# 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.copy().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)


reader = Reader()
# Famous SVD algorithm 
algo = SVDpp()
data = Dataset.load_from_df(order_df[['username', 'product', 'count']], reader)
# Divide the data into train and test (80-20)
trainset, testset = train_test_split(data, test_size=0.2)
algo.train(trainset)

Поскольку я новичок в этой технологии, мой вопрос здесь заключается в том, как получить список рекомендации после тренировки СВД.

1 Ответ

0 голосов
/ 16 февраля 2020

Вы можете следовать этому примеру и интегрировать его с вашим кодом.

from surprise import SVD
from surprise import Dataset
from surprise import accuracy
from surprise.model_selection import train_test_split

# Load the movielens-100k dataset (download it if needed),
data = Dataset.load_builtin('ml-100k')

trainset, testset = train_test_split(data, test_size=.25)

algo = SVD()
algo.fit(trainset)
predictions = algo.test(testset)
test = pd.DataFrame(predictions)
test = test.rename(columns={'uid':'userId', 'iid': 'movieId', 
                            'r_ui':'actual', 'est':'prediction'})
cf_model = test.pivot_table(index='userId', 
                            columns='movieId', values='prediction').fillna(0)

def get_users_predictions(user_id, n, model):
    recommended_items = pd.DataFrame(model.loc[user_id])
    recommended_items.columns = ["predicted_rating"]
    recommended_items = recommended_items.sort_values('predicted_rating', ascending=False)    
    recommended_items = recommended_items.head(n)
    return recommended_items.index.tolist()

def get_recs(model, k):
    recs = []
    for user in model.index:
        cf_predictions = get_users_predictions(user, k, model)
        recs.append(cf_predictions)
    return recs    

# Top-10 recommendations for each user
k = 10
recs = get_recs(cf_model, k)
preds = pd.DataFrame(index=cf_model.index)
preds[f'Top-{k} Recommendation'] = recs
preds.head()

Вывод:

|   userId | Top-10 Recommendation                                                     |
|---------:|:--------------------------------------------------------------------------|
|        1 | ['50', '174', '173', '268', '183', '89', '64', '251', '100', '136']       |
|       10 | ['174', '178', '98', '530', '474', '511', '478', '132', '493', '709']     |
|      100 | ['887', '292', '1235', '268', '1238', '348', '1234', '271', '326', '886'] |
|      101 | ['181', '742', '237', '596', '405', '118', '255', '1028', '717', '928']   |
|      102 | ['50', '98', '96', '187', '168', '79', '530', '435', '228', '185']        |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...