排名指标 两个最受欢迎的排名指标是MAP和NDCG。我们在前段时间已经使用了平均精度均值(MAP)。NDCG表示归一化折损累积增益。 两者之间的主要区别是,MAP认为是二元相关性(一个项是感兴趣的或者不感兴趣的),而NDCG允许以实数形式进行相关性打分。这种关系类似分类和回归的关系。 实际当中,很难直接地优化MAP或NDCG指标,因为他们是不连续的,所以不可微。幸运的是,排名学习中的排名指标和损失函数表明,用于排名学习的一对损失函数近似于这些指标。 NDCG NDCG这个名字可能有点吓人,但其背后的思想却很简单。一个推荐系统返回一些项并形成一个列表,我们想要计算这个列表有多好。每一项都有一个相关的评分值,通常这些评分值是一个非负数。 然后将原DCG除以理想状态下的DCG并得到NDCG@K,它是一个0到1之间的数。 你可能已经注意到,我们使用K表示推荐列表的长度。这个数由专业人员指定。
本文主要和大家分享推荐系统中的常用评价指标,包括NDCG,Recall,AUC,GAUC等。 混淆矩阵用于反映预测和真实的对应样本数,例如TP反映预测为真的样本也是正样本的样本数。 1.2 NDCG 这个评价指标名为Normalized Discounted cumulative gain直接翻译为归一化折损累计增益。 它有一些前辈,我们先来介绍一下他的前辈们,然后再来介绍NDCG。 1.2.1 CG cumulative gain(CG)可翻译为累积增益,该评价指标只考虑相关性而没有考虑位置的影响。 而上面的CG和DCG他们只是单纯的进行求和,无法进行不用用户之间的对比,因此需要对其进行标准化,从而诞生了NDCG。 标准化后得到的NDCG是一个相对值,从而使得即使不同的用户之间可以进行比较。IDCG表示的是召回的集合中的item用户都喜欢的最理想情况。所以IDCG中的分子部分其实都是1。 2.
今天我用最接地气的方式,聊聊三个核心指标:Recall@K、MRR 和 NDCG。 别被名字吓到!一句话总结: Recall@K 看“找没找到”, MRR 和 NDCG 看“排得好不好”。 NDCG 是什么?(最全面的“整体排序质量”) NDCG = Normalized Discounted Cumulative Gain(归一化折扣累积增益)。 它同时考虑三点: 1. (只关心第一个) • NDCG:多个相关结果整体排得好不好?还能区分“有多相关”(最全面) 下面这张图直接并列 MRR 和 NDCG 的公式,一眼看懂区别: 5. 很高 糟糕排序:噪声 → Doc C → 噪声 → Doc B → Doc A → Recall@5=1,但 MRR=0.5,NDCG明显更低 这就说明:Recall@K 高,不代表排序好! 推荐至少一起看:Recall@K(有没有漏) + MRR 或 NDCG(排得够不够好)。 常见坑:Recall@10 很高,但 MRR 很低 → 说明“能找到,但总排不靠前”。
2: HR=0.4525, NDCG=0.2531 @2020-05-25 12:33:00.099730 Epoch 3: HR=0.4526, NDCG=0.2532 Epoch 246: HR=0.7222, NDCG=0.4459 @2020-05-26 15:33:36.437923 Epoch 247: HR=0.7235, NDCG Epoch 249: HR=0.7247, NDCG=0.4468 @2020-05-26 15:56:16.026673 Epoch 250: HR=0.7230, NDCG Epoch 252: HR=0.7212, NDCG=0.4463 @2020-05-26 16:18:30.149317 Epoch 253: HR=0.7228, NDCG Epoch 236: HR=0.7280, NDCG=0.4509 @2020-05-26 08:16:56.141805 Epoch 237: HR=0.7285, NDCG
def ndcg_score(user_pred, k): """compute NDCG Args: user_pred: dict, computed by get_user_topk k: int, the number of topk metric_type: string, choice the metric, it can be lowercase 'ndcg ' or uppercase 'NDCG' or 'Ndcg' and so on Return: the score of topk metric """ assert len ) == len(users) user_pred = get_user_topk(y_true, y_pred, users, k) if metric_type.lower() == 'ndcg ', gauc_score(y_true, y_pred, users_id)) print('log_loss: ', log_loss(y_true, y_pred)) for mt in ['ndcg
数据描述 评估指标 使用NDCG@10进行评估,项目的分数为每个用户排序,前10个项目被考虑进行评估。 test_run.loc[test_run.result_itemIds.isnull(), 'hot_itemIds'] return valid_run, test_run nDCG relevance) idcg = 1 dcg = getDCG(rank_scores) if dcg == 0.0: return 0.0 ndcg 分数 NDCG = 0 for items in valid_recom_df[['result_itemIds','itemId']].values: l1 = items[0][:10] l2 = [items[1]] NDCG += getNDCG(l1, l2) NDCG = NDCG/len(valid_run_t1) print('NDCG : ', NDCG)
现状 主流的排序算法中,不管是pointwise还是pairwise都不能直接优化排序度量指标,如NDCG等。 作者还推导了NDCG的LambdaLoss,由于NDCG是gain-based function,故先转成Loss: 其中, ,对于给定的文档列表, 是个常数 (和排序无关, 公式中分子只和标签 最后可以推导出NDCG第二种形式的损失(「关键」): 上式的好处在于,可以通过重新定义 和 来扩展出很多NDCG-like metrics的LambdaLoss。 lambdaRank有没有潜在的损失函数以及是如何和评价指标NDCG关联上的?lambdaRank的loss本质上是优化ndcg的一个较为粗糙的上界。 如果纯从逼近优化ndcg的目标,文中也推导出了ndcg-loss1和ndcg-loss2的表达式,其作为NDCG度量指标误差的上界,能够比lambdaRank更紧。
具体metrics指标考察 推荐问题常用的metrics指标包含有: 准确率 & 召回率 击中率 map ndcg 1. 为此,我们又发展出了NDCG指标。 4. NDCG 下面,我们来考察一下NDCG指标的定义。 NDCG全称为Normalized Discounted Cumulative Gain,中文就不翻了,好像也没什么人用中文来说这个指标,直接称呼NDCG就行了。 @5 NDCG@5的结果,那么,我们只需要考察其中前5条返回结果的相关度。 因此,在实际的使用中,事实上感觉用的一直都是NDCG指标,而没怎么见过剩下几个指标被使用过。 4.
= ndcg_score(y_train, lr.predict_proba(X_train), k = k_ndcg) cv_ndcg_score = ndcg_score(y_test, = ndcg_score(y_train, lr.predict_proba(X_train), k = k_ndcg) cv_ndcg_score = ndcg_score(y_test = ndcg_score(y_train, lr.predict_proba(X_train), k = k_ndcg) cv_ndcg_score = ndcg_score(y_test = ndcg_score(y_train, clf.decision_function(X_train), k = k_ndcg) cv_ndcg_score = ndcg_score = ndcg_score(y_train, y_pred_train , k = k_ndcg) cv_ndcg_score = ndcg_score(y_test, y_pred, k=k_ndcg
指标:NDCG和Personalization NDCG 如前所述,我们将使用两个指标来评估我们的模型。第一个将是NDCG,它衡量质量和我们的推荐项目的顺序。我们首先需要定义DCG。DCG越高越好。 结果 「NDCG@100:」 0.011 「Personalization:」 0.958 NDCG非常低,这是因为每个样本的特征数量非常有限。 结果 「NDCG@100:」 0.155 「Personalization:」 0.959 下图是验证集上随着epochs增加的NDCG@100 ? 结果 「NDCG@100:」 0.382 「Personalization:」 0.154 下面惯例(验证集上随着epochs增加的NDCG@100)。 NDCG@100最好的模型看是VAE。对于个性化索引,它是RBM。 ? 结论 在NDCG度量上,VAE、AE或深度协同等新方法的性能优于NMF等经典方法。
度量方式 在详细描述算法之前,介绍信息检索中常用的四个评测指标:RR, nDCG, RBP, AP,定义如下: 根据RBP的定义, 是一个常数, 越大说明用户更愿意挖掘排序列表中排名靠后的物品 对于RR, AP和nDCG的 优化,参考方法 [2],而使用LambdaRank优化RBP的方法之前从未有过,因此本文中详细介绍。 因此,RR,nDCG,AP,RBP改写为: 由于对数函数的单调性, 再根据Jensen不等式得到上述的下界: 由于 , 为负数,因此极大化上述公式等价于极小化 。 和AP性能无异,2)在listwise方法上,在CiteULike数据集上,nRBP性能远远优化nDCG和AP,但是在其他数据集上差不多。 1)在pairwise方法上,当有大量的活跃用户可用于训练时,优化nDCG和AP比优化nRBP.95更有优势,2)在listwise方法上,相比于nDCG和AP,在CiteULike数据集上优化nRBP
NDCG 指标分析 Normalized Discounted Cumulative Gain,即 NDCG,常用作搜索排序的评价指标,理想情况下排序越靠前的搜索结果,点击概率越大,即得分越高 (gain 首先我们计算理想 DCG(称之为 IDCG), 再根据用户点击结果, 计算真实的 DCG, NDCG = DCG / IDCG,值越接近 1, 则代表搜索结果越好。DCG 计算公式如下: ? 计算得出 IDCG = 1, DCG = 0.5,NDCG = DCG / IDCG = 0.5 , 最终通过对每次搜索计算 NDCG 得分,用来作为判断搜索结果好坏的一个评价指标。 NDCG 计算方案设计 通过统计搜索行为时间跨度,86% 的搜索行为在 5 分钟内完成、90% 的在 10 分钟内完成(从搜索开始到最后一次点击结果列表时间间隔),通过分析比较, NDCG 实时计算时间范围设定在 每次计算,只对在区间[15 分钟前, 10 分钟前]发起的搜索行为进行 NDCG 计算,这样就不会造成重复计算。 ?
由于我们使用nDCG@10,该分数仅在重排器将检索列表中较低位置的文档放入前10名时受到影响。在这种情况下,如果文档相关,它可以增加nDCG@10;如果它将相关文档移除,则会减少nDCG@10。 我们感兴趣的是nDCG增益的演变(深度k处的nDCG分数减去BM25的nDCG分数),并选择两个数据点进行进一步分析: 最大增益深度,即nDCG增益最大化的重排深度,和 90%深度,对应于首次达到最大增益的 为了支持这一结论,我们绘制了“oracle”的nDCG曲线。众所周知,nDCG指标受a)相关文档的召回率和b)它们在结果列表中的位置影响。 图11:Climate-FEVER的nDCG@10随延迟变化的图 图12:DBPedia的nDCG@10随延迟变化的图 图13:FiQA的nDCG@10随延迟变化的图 图14:HotpotQA的nDCG T恤尺寸 小 中 大 数据集 深度 nDCG增加 (%) 深度 nDCG增加 (%) 深度 nDCG增加 (%) DBPedia 70 37.6 210 42.43 400 45.7 Climate-FEVER
那么计算公式如下: Normalized Discounted Cummulative(NDCG) 对于NDCG,我们需要一步步揭开其神秘的面纱,先从CG说起: CG 我们先从CG(Cummulative NDCG DCG仍然有其局限之处,即不同的推荐列表之间,很难进行横向的评估。 那么不同用户的推荐列表的评估分数就需要进行归一化,也即NDCG(Normalized Discounted Cummulative Gain)。 在介绍NDCG之前,还需要了解一个概念:IDCG. 因此DCG的值介于 (0,IDCG] ,故NDCG的值介于(0,1],那么用户u的NDCG@K定义为: 因此,平均NDCG计算为: NDCG的完整案例 看了上面的介绍,是不是感觉还是一头雾水,不要紧张 DCG的值为6.69,具体见下表: 理想状况下,我们的IDCG排序结果的相关性应该是3,3,2,2,1,因此IDCG为7.14(具体过程不再给出),因此NDCG结果为6.69/7.14 = 0.94。
使用 nDCG 时,相关标签与正分数相关联,不相关标签与零分相关联,“禁止标签”与负分相关联。 然而,在存在负分数标签的情况下,nDCG 是无界的,因此不可靠。例如,无界性可能导致某些查询的极端高估或低估,对平均指标分数产生不成比例的影响。 nDCGmin 指标是 nDCG 的一个修改版本,由 Gienapp 等人在 CIKM‘20 提出,它解决了负分数标签情况下的这种无界性问题。 下图显示了 nDCG、nDCGmin 和 nDCGf 在 2010-2014 年文本检索会议网络轨道信息检索挑战赛发布的数据集上的可靠性。 对于所有年份,nDCG 和 nDCGmin 的可靠性都显著低于 nDCGf,这是由于当允许负标签和部分检索时,它们的不恰当归一化所致。
指标 NDCG 评价标准,用来评价一个排序的列表,其公式如下所示,第 m 个位置的 NDCG 是: ? 表示一个理想排序的得分,对于正样本, 是 1,负样本是 0; NDCG 的最优数值是 1; Mean NDCG 是 NDCG@m (m=1,....M,表示排序的长度)的均值; 最终采用的指标: mean NDCG:所有用户的 mean NDCG@m,也就是先计算不同m数值的NDCG,然后求平均,再除以用户数量; average of NDCG @m:所有用户的NDCG@m,不同m值的均值(仅除以用户数量
默认目标rank:ndcg使用从ndcg指标导出的替代梯度。为了训练XGBoost模型,需要一个额外的排序数组,称为qid,用于指定输入样本的查询组。 例如,scikit-learn 中的 auc_score 和 ndcg_score 没有考虑查询组信息也没有考虑成对损失。 NDCG 归一化折扣累积增益(Normalized Discounted Cumulative Gain NDCG)可用于二进制相关性和多级相关性。目标的名称是 rank:ndcg。 Pairwise LambdaMART算法使用学习排名度量(如NDCG)来缩放逻辑损失,以期将排名信息包含到损失函数中。 与 rank:map 和 rank:ndcg 不同,不进行缩放( |\Delta Z_{ij}| = 1 )。
5、Normalized Discounted Cummulative Gain(NDCG) 对于NDCG,我们需要一步步揭开其神秘的面纱,先从CG说起: CG 我们先从CG(Cummulative Gain NDCG DCG仍然有其局限之处,即不同的推荐列表之间,很难进行横向的评估。 那么不同用户的推荐列表的评估分数就需要进行归一化,也即NDCG(Normalized Discounted Cummulative Gain)。 在介绍NDCG之前,还需要了解一个概念:IDCG. 因此DCG的值介于 (0,IDCG] ,故NDCG的值介于(0,1],那么用户u的NDCG@K定义为: ? 因此,平均NDCG计算为: ? NDCG的完整案例 看了上面的介绍,是不是感觉还是一头雾水,不要紧张,我们通过一个案例来具体介绍一下。 假设在Baidu搜索到一个词,得到5个结果。
Hit rate@10(推荐10门课程的命中率)和NDCG@10(推荐10门课程的归一化折损累计增益)是我们对模型的评价指标。 Hit rate是指训练集是否在推荐的10门课程里,NDCG则是更关注推荐的课程在10门课程当中的具体位置,越是靠前,NDCG越大。 计算并绘制命中率与推荐课程数量的关系 计算并绘制 NDCG 与推荐课程数量的关系 plt.ylabel("NDCG") plt.show() 贝叶斯个性化排序推荐模型 在这个算法中,我们将任意学生所选的课进行标记 训练过程如下图所示 在这个项目中,无论是从hit rate还是NDCG,基于自注意力序列推荐模型的表现最好。 在hit rate的比较上,非个性化推荐和贝叶斯个性化排序推荐表现类似,但贝叶斯个性化排序推荐在NDCG这个指标上表现更好一点。
_1": 0.71803, "ndcg_at_10": 0.77357, "ndcg_at_100": 0.83634, "ndcg_at_1000": 0.83907, "ndcg_at_3": 0.72048, "ndcg_at_5": 0.73003, "precision_at_1": 0.71803, "precision_at_10": mrr_at_100": 0.6737, "mrr_at_1000": 0.67386, "mrr_at_3": 0.65495, "mrr_at_5": 0.66559, "ndcg_at _1": 0.56794, "ndcg_at_10": 0.56275, "ndcg_at_100": 0.62991, "ndcg_at_1000": 0.64939, "ndcg_at_3": 0.55564, "ndcg_at_5": 0.54815, "precision_at_1": 0.56794, "precision_at_10":