使用 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 算法获取所有用户的预测的主要内容,如果未能解决你的问题,请参考以下文章

svdpp分解推荐,java实现

推荐系统设计

CF809E Surprise me!

surprise库使用

ModuleNotFoundError:没有名为'surprise'的模块

python 安装surprise库解决 c++tools错误问题