推荐系统中的评价指标

按照推荐任务的不同,最常用的推荐质量度量方法可以划分为三类:
(1)对预测的评分进行评估,适用于评分预测任务。
(2)对预测的item集合进行评估,适用于Top-N推荐任务。
(3)按排名列表对推荐效果加权进行评估,既可以适用于评分预测任务也可以用于Top-N推荐任务。。

对用户 u 推荐了N个物品 R(u),用户在测试集上喜欢的物品集合为T(u)

1、准确率 Precision
推荐给用户的物品中,属于测试集的比例:

P=R(u)T(u)R(u)

2、召回率 Recall
测试集中有多少在用户的推荐列表中。描述有多少比例的用户-物品评分记录包含在最终的推荐列表中

R=R(u)T(u)T(u)

3、F1值
P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们。准确率和召回率的加权调和平均

F1=2PRP+R

4、排序分数 Ranking Score
在评估推荐列表时引用排序指标很有用。推荐系统通常预测排名列表,然而用户不太可能浏览所有的项目。因此,排序指标在测量实用性和排名信息时可能很有趣。排序靠前的项目更重要。

R=1|EU|uiϵEUpuiMku

其中,EU 表示测试集中所有的边的集合,如果ui在测试集中,则Eui=1pui表示商品i在用户u的推荐列表中的位置,分母Mku表示用户u的所有商品数组中除了该用户已经购买过的商品外的所有商品。
Rank Score 越小,说明测试集中的商品越靠前。

5、命中率 Hit ratio

HR@K=NumberofHits@K|GT|

top-N推荐中流行的评价指标。
分母为所有的测试集合,分子表示每个用户top-k推荐列表中属于测试集合的个数的总和。
例如:三个用户在测试集中的商品个数分别是10,12,8,模型得到的top-10推荐列表中,分别有6个,5个,4个在测试集中,那么此时HR的值是
(6+5+4)/(10+12+8) = 0.5。

# 计算某个用户的hit数
def hit(test_items,pred_items):
    count = 0 
    for item in pred_items:
        if item in test_items:
            count += 1
    return count

二、NDCG

在排序学习(Learning to rank)中,目标是构建一个排序模型用于对列表进行排序。排序学习的典型应用包括搜索列表、推荐列表和广告列表等等。
列表排序的目标是对多个条目进行排序,这就意味着它的目标值是有结构的。与单值回归和单值分类相比,结构化目标要求解决两个被广泛提起的概念:
列表评价指标
列表训练算法

列表评价指标
以关键词搜索返回文章列表为例,这里先分析一下列表评价指标要解决什么挑战。

第一个挑战就是定义文章与关键词之间的相关度,这决定了一篇文章在列表中的位置,相关度越高排序就应该越靠前。
第二个挑战是当列表中某些文章没有排在正确的位置时候,如何给整个列表打分。举个例子来说,假如对于某个关键词,按照相关性的高低正确排序,文档1、2、3、4、5应该依次排在前5位。现在的挑战就是,如何评估“2,1,3,4,5”和“1,2,5,4,3”这两个列表的优劣呢?

举个列子来说,对于某个请求关键词,有200篇文章实际相关。某个排序算法只认为100篇文章是相关的,而这100篇文章里面,真正相关的文章只有80篇。按照以上定义:
准确率: 80100=0.8
召回率=80200=0.4

6、折扣累计收益 DCG (Discounted Cumulative Gain)
主要思想是用户喜欢的物品被排在推荐列表前面比后面会更大程度增加用户体验。
解决了准确率和召回率的两个缺点:
1、所有文章只被分为相关和不相关两档,分类显然太粗糙
2、没有考虑位置因素

对于一个关键词,所有的文档可以分为多个相关性级别,这里以r1r2来表示。文章相关性对整个列表评价指标的贡献随着位置的增加而对数衰减,位置越靠后,衰减越严重。基于DCG评价指标,列表前k个文档的评价指标定义如下:

DCG@k=i=1K2ri1log2(i+1)

DCG缺点:对于排序引擎而言,不同请求的结果列表长度往往不相同。当比较不同排序引擎的综合排序性能时,不同长度请求之间的DCG指标的可比性不高。

7、归一化折扣累计增益 NDCG
https://blog.csdn.net/qq_34333481/article/details/102623753
由于在用户与用户之间,DCGs没有直接的可比性,所以我们要对它们进行归一化处理。最糟糕的情况是,当使用非负相关评分时DCG为0。为了得到最好的,我们把测试集中所有的条目置放在理想的次序下,采取的是前K项并计算它们的DCG。然后将原DCG除以理想状态下的DCG就可以得到NDCG,它是一个0到1之间的数。

IDCG@k=i=1|REL|2ri1log2(i+1)

|REL|代表按照相关性排序好的最多到位置k的结果列表。

NDCG@k=DCG@kIDCG@k

# 当 测试集为(用户ID,物品ID)
# 得到的排序之后的候选推荐列表ranklist,列表元素内容为[0,1]之间的数值
#此时的NDCG 为 真正的物品ID出现在推荐列表中的位置 的 log值
def getNDCG(ranklist, gtItem):
    for i in range(len(ranklist)):
        item = ranklist[i]
        if item == gtItem:
            return np.log(2) / np.log(i+2)
    return 0

8、均方误差MAE
对打分数据集进行评估。表示所有测试集中的预测打分和实际打分的差异。

MAE=(u,i)ϵEU|yuiy^ui||EU|

9、均方根误差RMSE

RMSE=(u,i)ϵEU(yuiy^ui)2|EU|

10、MAP
对于AP可以用这种方式理解: 假使当我们使用google搜索某个关键词,返回了10个结果。当然最好的情况是这10个结果都是我们想要的相关信息。但是假如只有部分是相关的,比如5个,那么这5个结果如果被显示的比较靠前也是一个相对不错的结果。但是如果这个5个相关信息从第6个返回结果才开始出现,那么这种情况便是比较差的。这便是AP所反映的指标,与recall的概念有些类似,不过是“顺序敏感的recall”。

AP:平均准确率

APu=1|Iute|iIutejIuteδ(pujpui)+1pui

其中,pui表示推荐列表中物品i的排序位置。pujpui表示物品j的排序位置在物品i的前面.

def AP(ranked_list, ground_truth):
    """Compute the average precision (AP) of a list of ranked items

    """
    hits = 0
    sum_precs = 0
    for n in range(len(ranked_list)):
        if ranked_list[n] in ground_truth:
            hits += 1
            sum_precs += hits / (n + 1.0)
    if hits > 0:
        return sum_precs / len(ground_truth)
    else:
        return 0

MAP即为所有用户的AP的均值

MAP=i=1NAPi

三、非准确率指标

1、Hmming distance. 汉明距离。通信原理中的汉明码 https://blog.csdn.net/Yonggie/article/details/83186280

H=1N(N1)(i,j)ϵN,ij(1c(i,j)K)

其中,c(i,j)表示用户i,j前k个推荐结果中相同结果的个数,N表示所有用户数。
汉明距离能够有效衡量两个用户推荐列表的差异,该值越大越说明用户之间的推荐结果越不相同,差异性越大。

2、Intrasimilarity 内部相关性
对于用户u的推荐列表,如果物品与物品之间的相似度越大,说明推荐给用户的商品比较单一,推荐算法越发现不了新的物品;反之,如果该值越小,则推荐的物品越丰富,越有利于对用户的兴趣进行扩展。

I=1NuϵU(1K(K1)αβsαβ)

其中,sαβ表示物品αβ的相似度,常用余弦相似度。

3、Popularity 流行度

N=1NαϵORudαK

其中,ORu 表示用户u的前k个推荐物品列表,dα表示α 被多少个用户购买过,代表该物品的热度。
流行度越大,说明推荐算法倾向于推荐“热度”越大、越流行的商品;反之,则越倾向于推荐比较冷门的物品,越能反映出用户的兴趣。

posted @   木叶流云  阅读(4111)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示