理解三个指标:Recall、NDCG、RMSE

您所在的位置:网站首页 项目评估归一化公式 理解三个指标:Recall、NDCG、RMSE

理解三个指标:Recall、NDCG、RMSE

2023-09-01 23:20| 来源: 网络整理| 查看: 265

一、Recall 1.1 传统recall

Recall是召回率或者说是查全率。查全率就是说用户真正感兴趣的信息有多少被我们预测到了

首先要定义以下几点: TP(True Positive) : 表示样本的真实类别为正,最后预测得到的结果也为正 FP(False Positive): 表示样本的真实类别为负,最后预测得到的结果为正 TN(True Negative): 表示样本的真实类别为负,最后预测得到的结果也为负 FN(False Nositive): 表示样本的真实类别为正,最后预测得到的结果为负

可能这样会记不住。。下面我们通过一个表格来记住。

那么Recall的公式如下: 同时我们还可以计算precision(精准率——检索出的信息中有多少是用户真正感兴趣的):

可以通过skleaen模块把recall和precision计算出来。 代码及例子如下:

from sklearn.metrics import precision_score, recall_score, f1_score import numpy as np y_true = np.array([[0, 1, 1], [0, 1, 0]]) y_pred = np.array([[1, 1, 1], [0, 0, 1]]) y_true = np.reshape(y_true, [-1]) y_pred = np.reshape(y_pred, [-1]) p = precision_score(y_true, y_pred, average='binary') r = recall_score(y_true, y_pred, average='binary') f1score = f1_score(y_true, y_pred, average='binary') 1.2 推荐系统中的Recall

其实原理是一样的,我们看下面的公式:

精准率为: 其中R(u)表示根据用户在训练集上的行为给用户做出的Top-n推荐列表,T(u)表示系统向用户推荐物品后,用户实际选择的物品集。

代码如下:

def Precision_Recall(train,test,N): hit = 0 n_recall = 0 n_precision = 0 for user in train.keys(): tu = test[user] rank = Recommend(user,N) for item ,pui in rank: if item in tu: hit += 1 n_recall += len(tu) n_precision += N recall = hit / (1.0 * n_recall) precision = hit / (1.0 * n_precision) return [precision, recall]

参考链接:https://blog.csdn.net/HowardEmily/article/details/104674901/ https://blog.csdn.net/qq_38575545/article/details/84771268

二、NDCG

NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益)。

其实我第一次看这个名字。。。。折损累计增益。。。我是一脸懵逼的。。折损让我第一想到的是金融方面的信息哈哈哈。。。。下面让我们来好好地挖挖这个折损值哈哈哈。

一个推荐系统返回一些item并形成一个列表,我们想要计算这个列表有多好,每一项都有一个相关的评分值,通常这些评分值是一个非负数,这就是gain(增益).此外对于这些没有用户反馈的项我们通常设置起增益为0。

2.1 CG

我们将这些增益相加就是Cumulative Gain(累计增益,CG),CG就是将每个推荐结果相关性的分支(分数)累加后作为整个推荐列表的得分.

这里reli表示处于位置i的推荐结果的相关性(分数),k表示要考察的推荐列表的大小.

2.2 DCG

CG的一个缺点是没有考虑每个推荐结果处于不同位置对整个推荐效果的影响,例如我们总是希望相关性高的结果应该排在前面.显然,如果相关性低的结果排在靠前的位置会严重影响用户的体验,所以在CG的基础上引入位置影响因素,即DCG(Discounted Cumulative Gain),这里指的是对于排名靠后推荐结果的推荐效果进行“打折处理”:

从上面的式子可以得到两个结论: 1.推荐结果的相关性越大,DCG越大 2.相关性好的排在推荐列表前面的话,推荐效果越好,DCG越大.

2.3 NDCG

DCG仍然有不足之处,即不同的推荐的推荐列表之间,很难进行横向的评估,而我们评估一个推荐系统不可能仅使用一个用户的推荐列表及相应结果进行评估,而是对整个测试集中的用户及其推荐列表结果进行评估.那么不同的用户的推荐列表的评估分数就需要进行归一化,也即NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益)。

在介绍NDCG之前还需要知道另一个概念,IDCG(Ideal DCG),指推荐系统为某一用户返回的最好推荐结果列表,即假设返回结果按照相关性排序,最相关的结果放在前面,此序列的DCG为IDCG.因此DCG的值介于(0,IDCG],故NDCG的值介于(0,1],那么用户u的NDCG@K定义为:

因此平均NDCG@K计算为: image.png

应该大概都懂了吧,我们先求CG(累计增益)——累加推荐列表的相关性得分,然后求DCG(折损CG)——对CG进行排序,并对得分低的相关性做折扣处理,最后就是求NDCG(归一化DCG)——归一化不同的用户的推荐列表的评估分数。

2.4 参考代码如下

改造自github的代码, 输入即是 label, qid, score----样本,查询id,分数。实现的功能是计算多个query的平均ncdg。

import sys, math topK = int(sys.argv[1]) def DCG(label_list): dcgsum = 0 for i in range(len(label_list)): dcg = (2**label_list[i] - 1)/math.log(i+2, 2) dcgsum += dcg return dcgsum def NDCG(label_list): global topK dcg = DCG(label_list[0:topK]) ideal_list = sorted(label_list, reverse=True) ideal_dcg = DCG(ideal_list[0:topK]) if ideal_dcg == 0: return 0 return dcg/ideal_dcg def queryNDCG(label_qid_score): tmp = sorted(label_qid_score, key = lambda x:-x[2]) label_list = [] for label,q,s in tmp: label_list.append(label) return NDCG(label_list) last_qid = "" l_q_s = [] ndcg = 0 cnt = 0 for line in sys.stdin: label, qid, score = line.rstrip().split(" ") if last_qid != "" and qid != last_qid: ndcg += queryNDCG(l_q_s) cnt += 1 l_q_s= [] last_qid = qid l_q_s.append([int(label),qid, float(score)]) if last_qid != "": ndcg += queryNDCG(l_q_s) cnt += 1 #print cnt print ndcg/cnt

参考链接: https://blog.csdn.net/Al_xin/article/details/98263396

RMSE

RMSE(Root Mean Square Error,均方根误差)。均方根误差是用来衡量观测值同真实值之间的偏差,RMSE越小越好。

代码如下:

target = [1.5, 2.1, 3.3, -4.7, -2.3, 0.75] prediction = [0.5, 1.5, 2.1, -2.2, 0.1, -0.5] error = [] for i in range(len(target)): error.append(target[i] - prediction[i]) squaredError = [] absError = [] for val in error: squaredError.append(val * val)#target-prediction之差平方 absError.append(abs(val))#误差绝对值 from math import sqrt print("RMSE = ", sqrt(sum(squaredError) / len(squaredError)))#均方根误差RMSE

参考: https://blog.csdn.net/fsfsfsdfsdfdr/article/details/85014830 https://blog.csdn.net/FrankieHello/article/details/82024526/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3