CG-DCG-NDCG 排序系统评价指标

2022-01-24  本文已影响0人  臻甄

NDCG:Normalized Discounted cumulative gain,归一化折损累计增益

CG 累计增益

CG只考虑到相关性的关联程度,没有考虑到位置的因素。它是一个搜索相关性分数的综合。指定位置p上CG为
CG_p=\sum_{i=1}^{p}rel_i
rel_i代表i这个位置上的相关度

假设搜索"篮球"结果,最理想的结果是:B1、B2、B3;而出现的结果是B3、B1、B2的话,CG的值是没有变化的,因此需要下面的DCG

DCG 折损

DCG就是在每一个CG的结果上除以一个折损值,目的就是让排名越靠前的结果能影响到最后的结果。

# 第二种公式的实现
import numpy as np
def dcg_at_n(rel, n):
    rel = np.asfarray(rel)[:n]
    dcg = np.sum(np.divide(np.power(2, rel) - 1, log2_table[:rel.shape[0]]))
    return dcg

早前,对数衰减因子的使用,除了衰减比较平滑外,在理论上并没有其他合理的解释。后来,Wang等人在NDCG对使用对数衰减因子提供了理论解释。作者表明,对于每一对本质上不同的排序函数,NDCG在决定拿一个更好上具有一致性

NDCG 归一化折损累计增益(NDCG)

nDCG_p=\frac{DCG_p}{IDCG_p}

可对所有 Query 的 nDCG 值取平均,以此来获得搜索引擎 Ranking 算法的平均性能。

import numpy as np

def ndcg(golden, current, n = -1):
    log2_table = np.log2(np.arange(2, 102))

    def dcg_at_n(rel, n):
        rel = np.asfarray(rel)[:n]
        dcg = np.sum(np.divide(np.power(2, rel) - 1, log2_table[:rel.shape[0]]))
        return dcg

    ndcgs = []
    for i in range(len(current)):
        k = len(current[i]) if n == -1 else n
        idcg = dcg_at_n(sorted(golden[i], reverse=True), n=k)
        dcg = dcg_at_n(current[i], n=k)
        tmp_ndcg = 0 if idcg == 0 else dcg / idcg
        ndcgs.append(tmp_ndcg)
    return 0. if len(ndcgs) == 0 else sum(ndcgs) / (len(ndcgs))

举例子

假设搜索到5个结果:相关性分数分别是: 3、2、3、0、1、2
CG=3+2+3+0+1+2
可以看到只是对相关的分数进行了一个关联的打分,并没有召回所在位置对排序结果评分的影响。
DCG
irel_i/log_2(i+1)
1:3
2:1.26
3:1.5
4:0
5:0.38
6:0.71
DCG=3+1.26+1.5+0+0.38+0.71=6.86

接下来做归一化,需要先计算IDCG。
假设我们一共召回了8个文档,除了上面6个3、2、3、0、1、2,还有两个结果的相关性为3、0
理想情况下的相关性分数排序应该是:3、3、3、2、2、1、0、0
IDCG
irel_i/log_2(i+1)
1:3
2:1.89
3:1.5
4:0.86
5:0.77
6:0.35
IDCG=3+1.89+1.5+0.86+0.77+0.35=8.37

参考

上一篇 下一篇

猜你喜欢

热点阅读