我有两套用户会话。每组包含两列:
- 在线商店中已查看项目的ID
- 在线商店购买商品的ID
必须使用一组火车(最高产品等级),第二组必须用于测试。
购买商品的所有ID都不同。
我需要做:
1.在测试集上计算已查看和购买的id的频率(一个id可以在viwed项中出现几次)
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。