推荐系统常用的评价指标:HR、NDCG、MRR
0、应用背景介绍
我们用一张表格展示推荐系统向用户推荐的列表与用户真实的访问项目,如下:
用户 | 真实值 | 推荐列表 |
---|---|---|
A | 12 | 3,10,15,12,17 |
B | 3 | 20,15,18,14,30 |
C | 5 | 2,5,7,8,15 |
D | 14 | 56,14,25,12,19 |
E | 20 | 21,24,36,54,45 |
1、评价指标的知识来源
评价指标的来源是根据TKDE-2019中的一篇论文使用的方法
2、命中率HR(Hits Ratio)
意义:关心用户想要的,我有没有推荐到,强调预测的“准确性”
参数说明:
N:用户的总数量
hits(i):第i个用户访问的值是否在推荐列表中,是则为1,否则为0
3、归一化折损累计增益(Normalized Discounted Cumulative Gain,NDCG
意义:关心找到的这些项目,是否放在用户更显眼的位置里,即强调“顺序性“
参数说明:
N:用户的总数量
pi:第i个用户的真实访问值在推荐列表的位置,若推荐列表不存在该值,则pi-->无穷大
4、平均倒数排名(Mean Reciprocal Rank,MRR)
意义:关心找到的这些项目,是否放在用户更显眼的位置里,即强调“顺序性“
参数说明:
N:用户的总数量
pi:第i个用户的真实访问值在推荐列表的位置,若推荐列表不存在该值,则pi-->无穷大
5、实例
用户 | 真实值 | 推荐列表 |
---|---|---|
A | 12 | 3,10,15,12,17 |
B | 3 | 20,15,18,14,30 |
C | 5 | 2,5,7,8,15 |
D | 14 | 56,14,25,12,19 |
E | 20 | 21,24,36,54,45 |
import math
# 推荐列表
R = [[3, 10, 15, 12, 17], [20, 15, 18, 14, 30], [2, 5, 7, 8, 15], [56, 14, 25, 12, 19], [21,24,36,54,45]]
# 用户访问列表
T=[[12],[3],[5],[14],[20]]
def indicators_5(rankedList, testList):
Hits_i = 0
Len_R = 0
Len_T = len(testList)
MRR_i = 0
HR_i = 0
NDCG_i = 0
for i in range(len(rankedList)):
for j in range(len(rankedList[i])):
if testList[i][0]==rankedList[i][j]:
Hits_i+=1
HR_i+=1
# 注意j的取值从0开始
MRR_i+=1/(j+1)
NDCG_i+=1/(math.log2(1+j+1))
break
HR_i/=Len_T
MRR_i/=Len_T
NDCG_i/=Len_T
print(Hits_i)
print(f'HR@5={HR_i}')
print(f'MRR@5={MRR_i}')
print(f'NDCG@5={NDCG_i}')
if __name__ == '__main__':
indicators_5(R, T)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步