使用 Surprise SVDpp 算法获取所有用户的预测
Posted
技术标签:
【中文标题】使用 Surprise SVDpp 算法获取所有用户的预测【英文标题】:Get predictions for all users with Surprise SVDpp algorithm 【发布时间】:2020-08-03 23:07:01 【问题描述】:我想使用Surprise
图书馆和购买/不购买作为评分值(而不是经典的1到5)构建一个简单的图书推荐器。
我的问题是我想在我的whole dataset
上进行训练,这样我就可以得到对ALL users
的预测,所以我正在检查这个惊喜示例(examples/top_n_recommendations.py)
:
from collections import defaultdict
from surprise import SVD
from surprise import Dataset
def get_top_n(predictions, n=10):
...
# First train an SVD algorithm on the movielens dataset.
data = Dataset.load_builtin('ml-100k')
trainset = data.build_full_trainset()
algo = SVD()
algo.fit(trainset)
# Then predict ratings for all pairs (u, i) that are NOT in the training set.
testset = trainset.build_anti_testset()
predictions = algo.test(testset)
top_n = get_top_n(predictions, n=10)
# Print the recommended items for each user
for uid, user_ratings in top_n.items():
print(uid, [iid for (iid, _) in user_ratings])
我的疑问是,如果它在整个数据集上进行训练,为什么要构建反测试? 如何获得所有用户的建议,同时在整个数据集上训练算法?
【问题讨论】:
【参考方案1】:使用 Surprise 库,您只能获得训练集中用户的预测。反测试集由不在训练集中的所有对 (user,item) 组成,因此它会推荐用户过去没有与之交互的项目。
【讨论】:
【参考方案2】:试试这个: 您可以使用已经拟合数据的模型(算法),然后遍历所有用户和所有项目以计算估计评分。
topn = defaultdict(list)
for uid in users:
for iid in items:
est = algo.predict(uid, iid).est
topn[uid].append(iid,est)
【讨论】:
如果你也能添加一点解释那就太好了:)【参考方案3】:这不是一个有效的答案,但也许会有所帮助。
df_predictions=pd.DataFrame([])
for i in users:
df_tmp=pd.DataFrame([])
df_pred['Estimate_Scores'] = df_pred['movie'].apply(lambda x: svd.predict(i, x).est)
df_tmp['movie']=df_pred.sort_values('Estimate_Score', ascending=False).jobId.head(10).copy()
df_tmp['user']=i
df_predictions=df_predictions.append(df_tmp)
【讨论】:
以上是关于使用 Surprise SVDpp 算法获取所有用户的预测的主要内容,如果未能解决你的问题,请参考以下文章