推荐系统排序指标详解:CG、DCG、NDCG、Hit Rate


一、CG,累计增益 Cumulative Gain

CG表示对K个item的Gain进行累加,其中Gain表示列表中每一个item的相关性分数,CG即:

二、DCG,折损累计增益 Discounted cumulative gain

DCG提出:如果有效结果在列表中排的较低的话,应该对列表的评分惩罚,惩罚和有效结果的排位有关。所以就加了衰减因子:

还有一个公式广泛在工业界和kaggle比赛中,对应的公式和代码如下:

登录后复制

# 第二种公式的实现import numpy as npdef 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]]))    return1.2.3.4.5.6.

注意:当相关性得分是  ,即

三、NDCG,归一化折损累计增益 Normalized Discounted Cumulative Gain

3.1 NDCG指标

常用作排序模型的指标评估。DCG没有考虑到推荐列表和每个检索中真正有效结果(test items list) 的个数,所以最后引入NDCG,就是标准化后的DCG。比如小A同学搜了一个query,引擎返回一个推荐列表(搜索结果),一般从2个方面衡量列表质量:

  • 和query最相关的放在靠前位置:Gain定义每条item质量,NDCG进行加权求和。
  • 整个列表结果尽可能和query相关:Discounted的设计使得越靠前的item权重越大。


其中  是指ideal DCG,即理想结果下的DCG,对应的公式为:

简单说:NDCG是由各DCG除以当前DCG中最大的值得到的。

  • n:Normalization,不同指标大小不同,需要做normalization
  • D:Position discount,位置越靠前影响越大
  • C:Cumulating,
  • G:Gain,可以是相关性、点击率等指标

【推荐系统排序指标】CG、DCG、NDCG、Hit Rate_ide_10

3.2 电影推荐的一个栗子

基于打分的个性推荐系统可以用CG(cumulative gain), 累计増益。假设我们推荐  个物品,这个推荐列表的  计算 公式如下:

表示第  个物品的相关性。假设我们共推荐  个电影,  可以是用户对第  部电影的评分。
比如豆瓣给用户推荐了五部电影,

该用户对这五部电影的评分分别是
那么这个推荐列表的CG等于

CG没有考虑推荐的次序,在此基础之后我们引入对物品顺序的考虑,就有了DCG(discounted CG), 折扣累积增益。 公式如下:

比如豆瓣给用户推荐了五部电影,

该用户对这五部电影的评分分别是
那么这个推荐列表的DCG等于

3.3 代码实践栗子

这里也贴一个代码的实践例子:

登录后复制

import numpy as npdef ndcg(rel_true, rel_pred, p=None, form="linear"):    """ Returns normalized Discounted Cumulative Gain    Args:        rel_true (1-D Array): relevance lists for particular user, (n_songs,)        rel_pred (1-D Array): predicted relevance lists, (n_pred,)        p (int): particular rank position        form (string): two types of nDCG formula, 'linear' or 'exponential'    Returns:        ndcg (float): normalized discounted cumulative gain score [0, 1]    """    rel_true = np.sort(rel_true)[::-1]    p = min(len(rel_true), min(len(rel_pred), p))    # 因为索引是从0开始的,正常应该加1,但是从0开始,log(0+1)则等于无穷大,所以这里面加的是2,如果索引是从1开始,则加的是1,所以感觉跟上面的公式不一致,其实是一样的。    discount = 1 / (np.log2(np.arange(p) + 2))    if form == "linear":        idcg = np.sum(rel_true[:p] * discount)        dcg = np.sum(rel_pred[:p] * discount)    elif form == "exponential" or form == "exp":        idcg = np.sum([2 ** x - 1 for x in rel_true[:p]] * discount)        dcg = np.sum([2 ** x - 1 for x in rel_pred[:p]] * discount)    else:        raise ValueError("Only supported for two formula, 'linear' or 'exp'")    return dcg / idcgif __name__ == "__main__":    song_index = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8}    user_lists = ["USER1", "USER2", "USER3"]    relevance_true = {        # 每首歌曲i在每个用户下的评分,并且按降序排序,这个顺序对于相应的用户是最完美的。        "USER1": [3, 3, 2, 2, 1, 1, 0, 0, 0],        "USER2": [3, 2, 1, 1, 2, 0, 1, 1, 1],        "USER3": [0, 1, 0, 1, 2, 3, 3, 1, 0]    }    s1_prediction = {        # 模型预测,用户可能点击的顺序        "USER1": ['A', 'E', 'C', 'D', 'F'],        "USER2": ['G', 'E', 'A', 'B', 'D'],        "USER3": ['C', 'G', 'F', 'B', 'E']    }    s2_prediction = {        "USER1": ['A', 'B', 'C', 'G', 'E'],        "USER2": ['B', 'A', 'G', 'E', 'F'],        "USER3": ['E', 'G', 'F', 'B', 'I']    }    for user in user_lists:        print(f'===={user}===')        r_true = relevance_true[user]        for song in s1_prediction[user]:            test = song_index[song]            test2 = r_true[test]        s1_pred = [r_true[song_index[song]] for song in s1_prediction[user]]        s2_pred = [r_true[song_index[song]] for song in s2_prediction[user]]        print(f'S1 nDCG@5 (linear): {ndcg(r_true, s1_pred, 5, "linear")}')        print(f'S2 nDCG@5 (linear): {ndcg(r_true, s2_pred, 5, "linear")}')        # 一般我们使用下面指数的形式        print(f'S1 nDCG@5 (exponential): {ndcg(r_true, s1_pred, 5, "exp")}')        print(f'S2 nDCG@5 (exponential): {ndcg(r_true, s2_pred, 5, "exp")}')1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.

结果如下,三个用户对应的NDCG指标:

登录后复制

====USER1===S1 nDCG@5 (linear): 0.8232936061974518S2 nDCG@5 (linear): 0.8793791209851007S1 nDCG@5 (exponential): 0.7406319169800546S2 nDCG@5 (exponential): 0.911476869939315====USER2===S1 nDCG@5 (linear): 0.8241067540896558S2 nDCG@5 (linear): 0.864255024163802S1 nDCG@5 (exponential): 0.7200216168193889S2 nDCG@5 (exponential): 0.821434096248145====USER3===S1 nDCG@5 (linear): 0.6850898875992608S2 nDCG@5 (linear): 0.867837452040598S1 nDCG@5 (exponential): 0.6922758990315323S2 nDCG@5 (exponential): 0.8262089510932061.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

四、Hit Rate

hr指标在top N推荐中经常使用:

更多参考:

1)https://www.zhihu.com/question/370888712/answer/1637871159

五、推荐系统评测指标

【推荐系统排序指标】CG、DCG、NDCG、Hit Rate_推荐算法_27




免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空