如何解决Python Surprise 包为使用潜在因素的预测方法与手动计算提供了不同的预测
我正在使用惊喜包进行矩阵分解。下面是教程的代码:
from surprise import SVD
from surprise import Dataset
from surprise import accuracy
from surprise.model_selection import train_test_split
# Load the movielens-100k dataset (download it if needed),data = Dataset.load_builtin('ml-100k')
trainset = data.build_full_trainset()
algo = SVD()
algo.fit(trainset)
algo.predict(str(196),str(302))
Out:
Prediction(uid='196',iid='301',r_ui=4,est=3.0740854315737174,details={'was_impossible': False})
但是,当我使用其 documentation 和 source code 中的 SVD 方程手动计算 r_hat(r 预测)时:
algo.trainset.global_mean + algo.bi[301] + algo.bu[196] + np.dot(algo.qi[301],algo.pu[196])
Out:
2.817335384596893
预测根本不匹配。我做错了什么或遗漏了什么吗?
解决方法
我设法弄明白了。 raw users/items
和 inner users/items
之间存在差异。前者指的是用户和项目的实际名称(例如,用户 = John 或类似 10 的数字;项目 = 复仇者联盟或类似 20 的数字),而后者我假设是赋予原始用户的标签编码值/项。
trainset 的隐藏属性包含 4 个属性,_inner2raw_id_items
、_inner2raw_id_users
、_raw2inner_id_items
、_raw2inner_id_users
,它们是包含从一个到另一个的转换的字典。
如果我们调用 trainset._raw2inner_id_users
和 trainset._raw2inner_id_items
,我们得到:
_raw2inner_id_users
{'196': 0,'186': 1,'22': 2,...}
_raw2inner_id_items
{'242': 0,'302': 1,'377': 2,...
'301': 404,...}
因此,当我们调用:
algo.predict(str(196),str(302))
Out:
# different from original post as the prediction changes from run to run
Prediction(uid='196',iid='301',r_ui=None,est=3.2072618383879736,details={'was_impossible': False})
我们实际上指的是第 0th 个用户和第 1st 项。因此,当我们根据 SVD 方程使用潜在因子、偏差和全局均值进行手动计算时,我们应该使用这些数字:
algo.trainset.global_mean + algo.bi[404] + algo.bu[0] + np.dot(algo.qi[404],algo.pu[0])
Output:
3.2072618383879736
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。