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)