使用SVDpp算法获取所有用户的预测

2024-04-19 14:39:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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])

我的疑问是,如果它在整个数据集上进行训练,为什么要建立一个反测试? 我怎样才能得到所有用户的推荐,同时在我的整个数据集上训练算法


Tags: theinfromimportfortopdatasetsurprise
3条回答

试试这个: 您可以使用已经拟合数据的模型(algo),然后迭代所有用户和所有项目以计算估计的评分

topn = defaultdict(list)
for uid in users:
    for iid in items:
        est = algo.predict(uid, iid).est
        topn[uid].append(iid,est)

使用惊奇库,您只能获得培训集中用户的预测。反测试集由不在培训集中的所有对(用户,项目)组成,因此它建议用户过去未与之交互的项目

这不是一个有效的答案,但可能会有所帮助

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)

相关问题 更多 >