Surprise实现单个Book推荐
参考网址:https://zhuanlan.zhihu.com/p/352181306
数据链接:https://pan.baidu.com/s/1JS1fTrCrZHonNsywLDLhhQ?pwd=a6uf
提取码:a6uf
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 difflib 7 import random 8 9 # 读取数据 10 ratings_data = pd.read_csv('./data/ratings.csv') 11 books_metadata = pd.read_csv('./data/books.csv') 12 # print(ratings_data.head(10)) 13 14 # 创建Surprise数据集 15 reader = Reader(rating_scale=(1, 5)) # Reader类用于解析包含评级的文件,rating_scale用于每个评级的评级尺度。默认值为(1,5) 16 # 从panda数据帧里加载数据集,第一个参数需要包含user (raw) ids, the item (raw) ids, and the ratings,第二个参数读取文件的读取器 17 data = Dataset.load_from_df(ratings_data[['user_id', 'book_id', 'rating']], reader) 18 19 # SVD实现 20 # verbose:输出当前epoch,默认为False 21 # n_epochs:迭代次数,默认为20 22 # n_factors:k值,默认为100 23 svd = SVD(verbose=True, n_epochs=10) 24 # 三重交叉验证对SVD模型进行了交叉验证 25 cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=3, verbose=True) 26 27 28 # 使用build_full_trainset 方法将交叉验证的数据集转换为一个Surprise的Trainset对象 29 # trainset = data.build_full_trainset() 30 # 可以使用fit方法在整个数据集上训练模型。 31 # svd.fit(trainset) 32 33 # 有了一个经过训练的SVD模型,我们可以使用它来预测给定用户ID(UID)和项目/书籍ID(IID)的用户对图书的评分。 34 # print(svd.predict(uid=10, iid=100)) 35 36 def get_book_id(book_title, metadata): 37 """ 38 根据元数据数据帧中最接近的匹配获取书名的图书ID。 39 """ 40 41 existing_titles = list(metadata['title'].values) 42 closest_titles = difflib.get_close_matches(book_title, existing_titles) 43 book_id = metadata[metadata['title'] == closest_titles[0]]['id'].values[0] 44 return book_id 45 46 47 def get_book_info(book_id, metadata): 48 """ 49 给定图书id和元数据数据框架,返回有关图书的一些基本信息。 50 """ 51 52 book_info = metadata[metadata['id'] == book_id][['id', 'isbn','authors', 'title', 'original_title']] 53 return book_info.to_dict(orient='records') 54 55 56 def predict_review(user_id, book_title, model, metadata): 57 """ 58 预测用户对某本书的评论(1-5分)。 59 """ 60 61 book_id = get_book_id(book_title, metadata) 62 review_prediction = model.predict(uid=user_id, iid=book_id) 63 return review_prediction.est 64 65 66 def generate_recommendation(user_id, model, metadata, thresh=4): 67 """ 68 根据评分阈值为用户生成图书推荐。只有预测评分达到或高于阈值的书籍才会被推荐 69 """ 70 71 book_titles = list(metadata['title'].values) 72 random.shuffle(book_titles) 73 74 for book_title in book_titles: 75 rating = predict_review(user_id, book_title, model, metadata) 76 if rating >= thresh: 77 book_id = get_book_id(book_title, metadata) 78 return get_book_info(book_id, metadata) 79 80 81 #生成一个图书推荐 82 print(generate_recommendation(1000, svd, books_metadata))