我有两组用户会话。每组包含两列:
- 在线商店中查看商品的
ID - 在线商店中购买商品的 ID
一组必须用于火车(顶级产品评级),第二组必须用于测试。
所有购买的物品的 id 都是不同的。
我需要做:
1. 在测试集上计算查看和购买 id 的频率(一个 id 可以在查看的项目中出现多次)
2. 实现两种推荐算法:
- 按受欢迎程度对查看的 id 排序(查看的项目中出现的频率)
- 通过购买对查看的 id 进行排序(购买项目中出现的频率)
3. 使用此算法我需要计算AverageRecall@1、AveragePrecision@1、AverageRecall@5、AveragePrecision@5
重要:
- 用户没有购买任何东西的会话,质量评估规则。
- 如果在训练集中没有找到该物品,则其受欢迎程度为0。
- 需要推荐不同的物品。并且它的数量应该不超过不同用户查看项目的数量。
- 推荐永远不会大于两个数字的最小值:查看项目的数量和召回率@k/精度@k中的k。
我使用 OrderedDict 执行的第一项任务(计算频率)。对于第二个任务,我使用函数:
def apk(viwed, bought, k=1):
if len(predicted)>k:
predicted = predicted[:k]
score = 0.0
num_hits = 0.0
for i,p in enumerate(bought):
if p in actual and p not in bought[:i]:
num_hits += 1.0
score += num_hits / (i+1.0)
if not viewed:
return 0.0
return score / min(len(viewed), k)
def mapk(actual, predicted, k=10):
return np.mean([apk(a,p,k) for a,p in zip(actual, predicted)])
但我不知道如何计算第三个任务(每个 k 的平均召回率等)以及如何处理 OrderedDict。