NDCG归一化折损累积增益

NDCG常用于TOP-K排序的评价指标,不仅体现了预测的TOP-K个结果是否真的相关(有无点击),同时体现这TOP-K个结果的相对排序。

rel 是对item基于预测得分进行倒序排列,由item真实相关性值组成的列表;例如,
item1:预测得分0.9,真实相关性为1(或者在多级相关性中,真实相关性为2)
item2:预测得分0.4,真实相关性为0(或者在多级相关性中,真实相关性为0)
item3:预测得分0.7,真实相关性为0(或者在多级相关性中,真实相关性为1)
则按照预测得分倒序为item1、item3、item2;rel为[1,0,0];或者在多级相关性中,rel为[2,1,0]

累积增益CG:推荐系统中CG表示将每个推荐结果相关性的分值累加后作为整个推荐列表的得分:

C G k = ∑ i = 1 k r e l i ​ CG_k = \sum_{i=1} ^{k}rel_i ​ CGk=i=1kreli

其中, r e l i r e l_ i reli 表示位置 i i i 的预测结果的相关性, k k k 表示推荐列表的大小。

CG没有考虑每个推荐结果处于不同位置对整个推荐结果的影响,例如,我们总是希望相关性大大的结果排在前面,相关性低的排在前面会影响用户体验。

DCG在CG的基础上引入了位置影响因素,计算公式如下:

D C G k = ∑ i = 1 k 2 r e l i − 1 l o g 2 ( i + 1 ) ​ DCG_k = \sum_{i=1}^{k} \frac{2^{rel_i}-1} {log_2(i+1)}​ DCGk=i=1klog2(i+1)2reli1

从上面的式子可以得出:1)推荐结果的相关性越大,DCG越大。2)相关性好的排在推荐列表前面的话,推荐效果越好,DCG越大。

DCG针对不同的推荐列表之间很难进行横向评估,而我们评估一个推荐系统不可能仅使用一个用户的推荐列表及相应结果进行评估,而是对整个测试集中的用户及其推荐列表结果进行评估。那么,不同用户的推荐列表的评估分数就需要进行归一化,也就是NDCG。

IDCG表示推荐系统某一用户返回的最好推荐结果列表, 即假设返回结果按照相关性排序, 最相关的结果放在最前面, 此序列的DCG为IDCG。因此DCG的值介于 (0,IDCG] ,故NDCG的值介于(0,1],那么NDCG@K定义为:

N D C G @ k = D C G @ k / I D C G ​ N D C G @ k = D C G @ k /I D C G​ NDCG@k=DCG@k/IDCG

import numpy as np


def getDCG(scores):
    return np.sum(
        np.divide(np.power(2, scores) - 1, np.log2(np.arange(scores.shape[0], dtype=np.float32) + 2)),
        dtype=np.float32)


relevance_list = [3, 1, 2, 3, 2]
dcg = getDCG(np.array(relevance_list))
idcg = getDCG(np.array(sorted(relevance_list, reverse= True)))
ndcg = dcg / idcg
print(ndcg)
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NDCG(Normalized Discounted Cumulative Gain)是用来衡量推荐法排序效果的一种指标,其值越大说明法排序效果越好。下面是利用NDCG评估AFM法代码实现的详细步骤: 1. 首先,我们需要准备数据集。通常情况下,我们需要将数据集分成训练集和测试集两部分,其训练集用来训练模型,测试集用来评估模型的性能。 2. 在训练集上训练AFM模型,并在测试集上进行预测。预测结果通常是每个用户对所有物品的评分,我们需要根据评分对物品进行排序。 3. 计每个用户的NDCG值。具体来说,对于每个用户,我们需要将其预测评分按照从高到低的顺序排列,并根据真实评分计NDCG值。NDCG的计公式如下: $$ NDCG_k = \frac{DCG_k}{IDCG_k} $$ 其,$k$表示推荐列表的长度,$DCG_k$表示在推荐列表前$k$个物品的折损累加收益,$IDCG_k$表示在所有物品按照真实评分排名前$k$个物品的折损累加收益。具体来说,$DCG_k$和$IDCG_k$的计公式分别为: $$ DCG_k = \sum\limits_{i=1}^k \frac{2^{rel_i}-1}{log_2(i+1)} $$ $$ IDCG_k =\sum\limits_{i=1}^k \frac{2^{rel_i}-1}{log_2(i+1)} $$ 其,$rel_i$表示第$i$个物品的真实评分,$log_2(i+1)$是一个惩罚因子,表示排名越靠后的物品权重越小。 4. 最后,我们需要对所有用户的NDCG值求平均,得到AFM法的平均NDCG值,用于评估模型的性能。 下面是利用Python实现计NDCG的代码示例: ```python import numpy as np def dcg_k(scores, k): # 计DCG值 rel = scores[:k] dcg = np.sum((2 ** rel - 1) / np.log2(np.arange(2, k+2))) return dcg def idcg_k(scores, k): # 计IDCG值 rel = np.sort(scores)[::-1][:k] idcg = np.sum((2 ** rel - 1) / np.log2(np.arange(2, k+2))) return idcg def ndcg_k(scores, k): # 计NDCG值 dcg = dcg_k(scores, k) idcg = idcg_k(scores, k) ndcg = dcg / idcg if idcg > 0 else 0 return ndcg def evaluate_ndcg(model, test_set, k): # 计平均NDCGndcg_list = [] for user in test_set.keys(): items = list(test_set[user].keys()) scores = model.predict(user, items) ranked_scores = np.argsort(-scores) ranked_items = [items[i] for i in ranked_scores] ranked_ratings = [test_set[user][item] for item in ranked_items] ndcg = ndcg_k(ranked_ratings, k) ndcg_list.append(ndcg) return np.mean(ndcg_list) ``` 其,`evaluate_ndcg`函数接收三个参数:`model`表示训练好的AFM模型,`test_set`表示测试集数据,`k`表示推荐列表的长度。函数的返回值是AFM法在测试集上的平均NDCG值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值