1、AP
A P = ∑ i = 1 n r e l ( i ) p i AP = \sum_{i=1}^{n}\frac{rel(i)}{p_i} AP=i=1∑npirel(i)
其中 n 表示候选序列长度, p i p_i pi表示第 i 个 item 的位置
2、MAP:先计算每个用户的AP,然后再求平均值。
M A P = 1 m ∑ i = 1 m A P i MAP = \frac {1}{m} \sum_{i=1}^{m}AP_i MAP=m1i=1∑mAPi
其中m表示用户数目,先计算每个用户的AP,然后再求平均值。
NDCG的全称是:Normalized Discounted Cumulative Gain(归一化折损累计增益)
在搜索和推荐任务中,系统常返回一个item列表。如何衡量这个返回的列表是否优秀呢?
例如,当我们检索【推荐排序】,网页返回了与推荐排序相关的链接列表。列表
可能会是:[A,B,C,G,D,E,F]
也可能是:[C,F,A,E,D]
现在问题来了,当系统返回这些列表时,怎么评价哪个列表更好?
没错,NDCG就是用来评估排序结果的。搜索和推荐任务中比较常见。
G->CG->DCG->NDCG
1、Gain: 一个列表中所有item的相关性分数,rel(i)表示item(i)相关性得分。
G a i n = r e l ( i ) Gain=rel(i) Gain=rel(i)
2、Cumulative Gain: 表示对K个item的Gain进行累加。
G G k = ∑ i = 1 k r e l ( i ) GG_k = \sum_{i=1}^{k}rel(i) GGk=i=1∑krel(i)
CG只是单纯累加相关性,不考虑位置信息。
假设A,B,C,D,E对应的rel(i)分别为0.5(A), 0.9(B), 0.3, 0.6(D), 0.1(E),那么
如果返回一个list_1=[A,B,C,D,E],那list_1的CG为0.5+0.9+0.3+0.6+0.1=2.4
如果返回一个list_2=[D,A,E,C,B],那list_2的CG为0.6+0.5+0.1+0.3+0.9=2.4
所以,顺序不影响CG得分。如果我们想评估不同顺序的影响,就需要使用另一个指标DCG来评估。
3、 Discounted Cumulative Gain: 考虑排序顺序的因素,使得排名靠前的item增益更高,对排名靠后的item进行折损(展示越靠前,收益越高)
CG与顺序无关,而DCG评估了顺序的影响。
DCG的思想是:list中item的顺序很重要,不同位置的贡献不同,一般来说,排在前面的item影响更大,排在后面的item影响较小。(例如一个返回的网页,肯定是排在前面的item会有更多人点击)。所以,相对CG来说,DCG使排在前面的item增加其影响,排在后面的item减弱其影响。
D C G k = ∑ i = 1 k r e l ( i ) l o g 2 ( i + 1 ) ( 1 ) DCG_k = \sum_{i=1}^{k} \frac{rel(i)}{log_2(i+1)} (1) DCGk=i=1∑klog2(i+1)rel(i)(1)
怎么实现这个思想呢?DCG在CG的基础上,给每个item的相关性比上log2(i+1),i越大,log2(i+1)的值越大,相当于给每个item的相关性打个折扣,item越靠后,折扣越大(真数大于1,保证折扣力度也就是log2(i+1)取值大于0)。
如果相关性分数r(i)只有(0,1)两种取值时,DGC有另一种表达。其实就是如果算法返回的排序列表中的item出现在真实交互列表中时,分子加1,否则跳过。
还是上面那个例子:
那么
r e l ( i ) = 2 r ( i ) − 1 = { 2 0 − 1 = 0 , i f l a b e l = 0 2 1 − 1 = 1 , i f l a b e l = 1 ( 2 ) rel(i)=2^{r(i)} - 1 = \left\{\begin{matrix} 2^0 - 1 = 0, \ \ if \ label = 0 & \\ 2^1 - 1 = 1, \ \ if \ label = 1 & \end{matrix}\right.(2) rel(i)=2r(i)−1={20−1=0, if label=021−1=1, if label=1(2)
将(2)带入(1),则有
D C G k = ∑ i = 1 k 2 r ( i ) − 1 l o g 2 ( i + 1 ) DCG_k = \sum_{i=1}^{k} \frac{2^{r(i)} - 1}{log_2(i+1)} DCGk=i=1∑klog2(i+1)2r(i)−1
list_1=[A,B,C,D,E], 其对应计算如下:
list_1的 DCG_1= 0.5+0.57+0.15+0.26+0.04=1.52
list_2=[D,A,E,C,B],其对应计算如下:
list_2的 DCG_2= 0.6+0.31+0.05+0.13+0.35=1.44
DCG_1 > DCG_2, 所以在这个例子里list_1优于list_2。
到这里,我们可以知道,使用DCG方法就可以对不同的list进行评估,那为什么后面还有一个NDCG呢?
4. NDCG(Normalized DCG): 归一化折损累计增益
在NDCG之前,先了解一些IDGC(ideal DCG)–理想的DCG,IDCG的依据是:是根据rel(i)降序排列,即排列到最好状态。算出最好排列的DCG,就是IDCG。
IDCG=最好排列的DCG
对于上述的例子,按照rel(i)进行降序排列的最好状态为list_best=[B,D,A,C,E]
IDCG = list_best的DCG_best = 0.9+0.38+0.25+0.13+0.04=1.7 (理所当然,IDCG>DCG_1和DCG_2)
N D C G = D C G I D C G NDCG=\frac{DCG}{IDCG} NDCG=IDCGDCG
因为不同query的搜索结果有多有少,所以不同query的DCG值就没有办法来做对比。所以提出NDCG。
Q:为什么打折是比上log2(i + 1)而不是(i + 1)?
A:为了惩罚排在后面的文档。你也可以用 i + 1自己弄个指标, 但惩罚率更高了
Q:rel(i) 是怎么计算的?
A:rel(i)从label(i)计算而来。rel(i)=2^label(i) - 1,也就是
r e l ( i ) = { 2 0 − 1 = 0 , i f l a b e l = 0 2 1 − 1 = 1 , i f l a b e l = 1 rel(i)=\left\{\begin{matrix} 2^0 - 1 = 0, \ \ if \ label = 0 & \\ 2^1 - 1 = 1, \ \ if \ label = 1 & \end{matrix}\right. rel(i)={20−1=0, if label=021−1=1, if label=1
[1].NDCG排序评估指标
[2].NDCG及实现