Surprise实现baby product产品推荐

数据链接:https://pan.baidu.com/s/1JS1fTrCrZHonNsywLDLhhQ?pwd=a6uf

提取码:a6uf

推荐数据集参考网站:http://snap.stanford.edu/data/amazon/productGraph/categoryFiles/

这里只是实现了最基本的推荐前五个产品的功能,还有很多需要完善的地方,有机会再过来补充。(主要是python不会,所以编程显得寸步难行,不过已经迈出第一步,相信慢慢会熟练)

 1 import pandas as pd
 2 from surprise import Dataset
 3 from surprise import Reader
 4 from surprise import SVD
 5 from surprise.model_selection import cross_validate
 6 import random
 7 
 8 # 读取数据
 9 ratings_data = pd.read_csv('./data/ratings_Baby_Products.csv')
10 products_metadata = pd.read_csv('./data/meta_Baby_Products.csv')
11 # print(ratings_data.head(10))
12 
13 # 创建Surprise数据集
14 reader = Reader(rating_scale=(1, 5))  # Reader类用于解析包含评级的文件,rating_scale用于每个评级的评级尺度。默认值为(1,5)
15 # 从panda数据帧里加载数据集,第一个参数需要包含user (raw) ids, the item (raw) ids, and the ratings,第二个参数读取文件的读取器
16 data = Dataset.load_from_df(ratings_data[['reviewerID', 'asin', 'rating']], reader)
17 
18 # SVD实现
19 # verbose:输出当前epoch,默认为False
20 # n_epochs:迭代次数,默认为20
21 # n_factors:k值,默认为100
22 svd = SVD(verbose=True, n_epochs=10)
23 # 三重交叉验证对SVD模型进行了交叉验证
24 cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=3, verbose=True)
25 
26 
27 # 使用build_full_trainset 方法将交叉验证的数据集转换为一个Surprise的Trainset对象
28 # trainset = data.build_full_trainset()
29 # 可以使用fit方法在整个数据集上训练模型。
30 # svd.fit(trainset)
31 
32 # 有了一个经过训练的SVD模型,我们可以使用它来预测给定用户ID(UID)和项目/书籍ID(IID)的用户对图书的评分。
33 # print(svd.predict(uid=10, iid=100))
34 
35 def get_product_info(product_id, metadata):
36     """
37     给定图书id和元数据数据框架,返回有关图书的一些基本信息。
38     """
39     a = metadata[metadata['asin'] == product_id]['asin']
40     book_info = metadata[metadata['asin'] == product_id][['asin', 'title', 'price']]
41     return book_info
42 
43 
44 def predict_review(user_id, product_id, model, metadata):
45     """
46     预测用户对某本书的评论(1-5分)。
47     """
48 
49     review_prediction = model.predict(uid=user_id, iid=product_id)
50     return review_prediction.est
51 
52 
53 def generate_recommendation(user_id, model, metadata, thresh):
54     """
55     根据评分阈值为用户生成图书推荐。只有预测评分达到或高于阈值的书籍才会被推荐
56     """
57 
58     product_id = list(metadata['asin'].values)
59     random.shuffle(product_id)
60     product_list = []
61     for product_id in product_id:
62         rating = predict_review(user_id, product_id, model, metadata)
63         #打分超过阈值将被纪录
64         if rating >= thresh:
65             product_info = get_product_info(product_id, metadata)
66             product_info.insert(loc=0, column='rating', value=rating)
67             product_list.append(product_info.to_dict(orient='records'))
68     return product_list
69 
70 
71 # Main
72 if __name__ == '__main__':
73     product_list = generate_recommendation('A2A4MYBCV8W9V1', svd, products_metadata, thresh = 4.5)
74     # 将dict_values转成list类型并进行排序
75     list_test = []
76     for num, line in enumerate(product_list):
77         list_test.append(list(line[0].values()))
78     list_test = sorted(list_test, key=lambda x: x[0], reverse=True)
79     #打印前5个高分产品
80     for i in list_test[0:5]:
81         print(i)

 

posted @ 2022-10-30 09:38  silvan_happy  阅读(72)  评论(0编辑  收藏  举报