NDCG 评价标准

评价标准

性能良好的评分模型,应该能够给予那些引起msg或click的候选会员更高的评分(排序靠前),从而推荐给指定会员。本次竞赛的主要排名标准为Normalized Discounted Cumulative Gain(NDCG),定义如下:

这里。其中n为候选会员集合中的总人数,表示模型给出的排序中,排名为的候选会员的实际ACTION值(msg=2,click=1,rec=0)。对每一位获得推荐建议的会员A,都需要计算一个相应的NDCG@10。所有获得推荐建议的会员对应的NDCG@10的平均值,作为排名的主要依据。

表示计算NDCG时仅采用排序至多前10的候选会员的ACTION进行计算,因此将尽可能多的msg或click排在前面至关重要。指数变换是为了增大ACTION间的差异以凸显msg和click的重要性。折扣因子用来强调越能将msg会员排名靠前的算法越好。例如,两种不同的推荐算法给出的排序对应的真实ACTION如下表所示,由于RANK 1算出的NDCG为0.8045,而RANK 2算出的NDCG仅有0.7579,我们认为RANK 1对应的算法更好。

RANK 1
click
msg
rec
click
rec
RANK 2
click
click
msg
rec
rec

这里给出一个计算NDCG的例子。假设某统计评分模型对5位会员进行了评分,以确定哪位会员更可能获得会员A的青睐(评分越高表示兴趣越大):

USER_ID_B
1
2
3
4
5
模型评分
1.2
0.7
-2.5
0.2
4.0
按评分排序
2
3
5
4
1
ACTION (y)
msg (y2=2)
click (y3=1)
rec (y5=0)
rec (y4=0)
rec (y1=0)

因此对于会员A,

如果能够获得的评分足够理想,从而能够完美地预测出会员A关于5位会员的兴趣排序,则此时相应的DCG称为Ideal DCG:

从而对会员A,

### Hit Ratio (HR) Hit Ratio 是一种用于评估推荐系统的二元评价指标,主要用于衡量模型预测的准确性。具体来说,在给定测试集中的项目是否出现在推荐列表内。如果至少有一个真实目标项被成功命中,则记为一次 hit;否则不计分。 对于单个用户的 HR 定义如下: - 如果任意一个实际喜欢的商品位于 top-N 推荐商品之中,则返回 1; - 若无任何一个匹配则返回 0。 最终整个数据集上的整体性能通过求解所有用户得分均值得到[^1]。 ```python def hit_ratio(recommended_items, actual_item): """ Calculate the hit ratio. :param recommended_items: List of item IDs that were recommended to a user :param actual_item: The true positive item ID for this user :return: Binary value indicating whether there was at least one match between recommendations and truth """ return int(actual_item in recommended_items[:top_n]) ``` ### Normalized Discounted Cumulative Gain (NDCG) NDCG 考虑到了不同位置上正确项目的权重差异,并且能够处理多个相关度不同的正样本情况。它基于 DCG 的概念而构建,但是进行了标准化处理使得不同长度的结果可以相互比较。 #### 计公式 \[ \text{NDCG}_k = \frac{\text{DCG}_k}{\text{IDCG}_k} \] 其中, - \( \text{DCG}_k \) 表示折扣累积增益,反映了前 k 个项目的相关性总和。 对于第 i 位的相关分数 rel_i ,其贡献按照对数衰减: \[ \text{DCG}_k = \sum_{i=1}^{k}\frac{2^{\text{rel}_{i}} - 1}{\log_2(i+1)} \] - \( \text{IDCG}_k \) 则是在理想情况下所能获得的最大可能 DCG 值,即当所有相关物品都按最高优先级排列时所对应的 DCG 数值。 因此,\( \text{NDCG}_k \in [0, 1]\),越接近 1 表现越好[^2]。 ```python import math def dcg_at_k(r, k): """Compute Discounted Cumulative Gain.""" r = np.asfarray(r)[:k] if r.size: return r[0] + sum((r[1:] / np.log2(np.arange(2., r.size + 1)))) return 0. def ndcg_at_k(r, k): """Compute Normalized Discounted Cumulative Gain.""" idcg = dcg_at_k(sorted(r, reverse=True), k) if not idcg: return 0. return dcg_at_k(r, k) / idcg ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值