社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

推荐系统遇上深度学习(十六)--详解推荐系统中的常用评测指标

ApacheCN_飞龙 • 7 年前 • 650 次点击  

最近阅读论文的过程中,发现推荐系统中的评价指标真的是五花八门,今天我们就来系统的总结一下,这些指标有的适用于二分类问题,有的适用于对推荐列表topk的评价。

1、精确率、召回率、F1值

我们首先来看一下混淆矩阵,对于二分类问题,真实的样本标签有两类,我们学习器预测的类别有两类,那么根据二者的类别组合可以划分为四组,如下表所示:

上表即为混淆矩阵,其中,行表示预测的label值,列表示真实label值。TP,FP,FN,TN分别表示如下意思:

TP(true positive):表示样本的真实类别为正,最后预测得到的结果也为正;
FP(false positive):表示样本的真实类别为负,最后预测得到的结果却为正;
FN(false negative):表示样本的真实类别为正,最后预测得到的结果却为负;
TN(true negative):表示样本的真实类别为负,最后预测得到的结果也为负.

可以看到,TP和TN是我们预测准确的样本,而FP和FN为我们预测错误的样本。

基于混淆矩阵,我们可以得到如下的评测指标:

准确率

准确率表示的是分类正确的样本数占样本总数的比例,假设我们预测了10条样本,有8条的预测正确,那么准确率即为80%。

用混淆矩阵计算的话,准确率可以表示为:

精确率/召回率

精确率表示预测结果中,预测为正样本的样本中,正确预测为正样本的概率;
召回率表示在原始样本的正样本中,最后被正确预测为正样本的概率;

二者用混淆矩阵计算如下:

F1值

为了折中精确率和召回率的结果,我们又引入了F-1 Score,计算公式如下:

2、AUC

AUC定义为ROC曲线下方的面积:

ROC曲线的横轴为“假正例率”(True Positive Rate,TPR),又称为“假阳率”;纵轴为“真正例率”(False Positive Rate,FPR),又称为“真阳率”,

假阳率,简单通俗来理解就是预测为正样本但是预测错了的可能性,显然,我们不希望该指标太高。

真阳率,则是代表预测为正样本但是预测对了的可能性,当然,我们希望真阳率越高越好。

下图就是我们绘制的一张ROC曲线图,曲线下方的面积即为AUC的值:

AUC还有另一种解释,就是测试任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score

3、Hit Ratio(HR)

在top-K推荐中,HR是一种常用的衡量召回率的指标,其计算公式如下:

分母是所有的测试集合,分子式每个用户top-K推荐列表中属于测试集合的个数的总和。举个简单的例子,三个用户在测试集中的商品个数分别是10,12,8,模型得到的top-10推荐列表中,分别有6个,5个,4个在测试集中,那么此时HR的值是 (6+5+4)/(10+12+8) = 0.5。

4、Mean Average Precision(MAP)

在了解MAP(Mean Average Precision)之前,先来看一下AP(Average Precision), 即为平均准确率。

对于AP可以用这种方式理解: 假使当我们使用google搜索某个关键词,返回了10个结果。当然最好的情况是这10个结果都是我们想要的相关信息。但是假如只有部分是相关的,比如5个,那么这5个结果如果被显示的比较靠前也是一个相对不错的结果。但是如果这个5个相关信息从第6个返回结果才开始出现,那么这种情况便是比较差的。这便是AP所反映的指标,与recall的概念有些类似,不过是“顺序敏感的recall”。

比如对于用户 u, 我们给他推荐一些物品,那么 u 的平均准确率定义为:

用一个例子来解释AP的计算过程:

因此该user的AP为(1 + 0.66 + 0.5) / 3 = 0.72

那么对于MAP(Mean Average Precision),就很容易知道即为所有用户 u 的AP再取均值(mean)而已。那么计算公式如下:

5、Normalized Discounted Cummulative Gain(NDCG)

对于NDCG,我们需要一步步揭开其神秘的面纱,先从CG说起:
CG
我们先从CG(Cummulative Gain)说起, 直接翻译的话叫做“累计增益”。 在推荐系统中,CG即将每个推荐结果相关性(relevance)的分值累加后作为整个推荐列表(list)的得分。即

这里, rel-i 表示处于位置 i 的推荐结果的相关性,k 表示所要考察的推荐列表的大小。

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

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

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

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

因此,平均NDCG计算为:

NDCG的完整案例
看了上面的介绍,是不是感觉还是一头雾水,不要紧张,我们通过一个案例来具体介绍一下。

假设在Baidu搜索到一个词,得到5个结果。我们对这些结果进行3个等级的分区,对应的分值分别是3、2、1,等级越高,表示相关性越高。假设这5个结果的分值分别是3、1、2、3、2。

因此CG的计算结果为3+1+2+3+2 = 11。DCG的值为6.69,具体见下表:

理想状况下,我们的IDCG排序结果的相关性应该是3,3,2,2,1,因此IDCG为7.14(具体过程不再给出),因此NDCG结果为6.69/7.14 = 0.94。

6、Mean Reciprocal Rank (MRR)

MRR计算公式如下:

其中|Q|是用户的个数,ranki是对于第i个用户,推荐列表中第一个在ground-truth结果中的item所在的排列位置。

举个例子,有三个用户,推荐列表中正例的最小rank值分别为3,2,1,那么MRR=(1 + 0.5 + 0.33) / 3 = 0.61

7、ILS

ILS是衡量推荐列表多样性的指标,计算公式如下:

如果S(bi,bj)计算的是i和j两个物品的相似性,如果推荐列表中物品越不相似,ILS越小,那么推荐结果的多样性越好。

8、代码实践

本文实践了部分上面提到的评价指标,git地址为:github.com/princewen/t…

参考目录为:

参考文献

1、blog.csdn.net/simple_the_…
2、blog.csdn.net/u010670689/…
3、www.cnblogs.com/wzyj/p/8976…
4、blog.csdn.net/u014313009/…

欢迎关注个人公众号:小小挖掘机

添加微信sxw2251,可以拉你进入小小挖掘机技术交流群哟!


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/WWgDeMgX4Y
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/19456
 
650 次点击