MAP和NDCG这两种指标是位置敏感的评价指标,总体来说可以理解为:正确推荐的item在列表中越靠前,其贡献的推荐效果越大,反之,正确推荐的item在列表中越靠后,贡献的推荐效果越小。MAP和NDCG主要的区别在于,MAP考虑的时二元相关性(1和0),NDCG可以有多种相关性的比较,相关性可以按照程度有多种取值,类似于分类与回归的关系。
MAP一般应用的场景是:要么相关要么不相关,即推荐的贡献要么是0(推荐的东西用户不喜欢),要么为1(推荐的东西用户喜欢)。对于评分推荐系统,例如电影推荐系统,我们主要知道的是用户对电影的评分,喜欢还是不喜欢没那么明确地表示出来,这个时候使用NDCG这一指标是比较合适的。
1、前提说明
我们这里讨论的是评价指标,所以是作用在训练集或测试集上的,这里以测试集的结果为例。比如:文中说到“推荐n个item“就是指对测试集进行测试时,推荐n个item,说到”用户喜欢此item或者用户对item的评分“就是指测试集中显示的用户对item喜欢与否或者评分。
2、recall
在topN推荐中,我们为用户推荐N个item,如何来评价此推荐的效果呢?比较常用的是Recall(或者hitratio)也就是计算我们正确推荐的item数量占用户总的浏览的或喜欢的item数量的比重。举个新闻推荐的例子,假设我们为某个用户推荐了10条新闻,假设其中有5条新闻是用户喜欢的,用户点击新闻进行了阅读,但实际上,用户这一时间段共阅读了20条新闻,所以recall=205=0.25。
我们再来考虑一种情况:用户点击的这5条新闻排在推荐列表的前5还是后5表示的推荐效果是不一样的,很明显,排前面比排在后面好,但是使用recall却无法体现位置差异带来的推荐效果差异。
3、MAP
MAP(Mean Average Precision)平均精度均值,可以说是位置敏感的recall。说到MAP首先要说AP(Average Precision),在推荐系统中,计算所有用户的AP,然后对AP相加取平均就是MAP。
AP计算过程如下:
假设为用户u1推荐了5条新闻,用户喜欢(点击了)的新闻分别位列第1、3、5位,则标识如下:[1,0,1,0,1],其中0代表用户不喜欢此条新闻,1代表用户喜欢此条新闻。实际上用户不仅点击了推荐给他的新闻,也阅读了其他一些新闻,总共的点击量为20,那么APu1=(1/1+2/3+3/5)/20=0.113。其中1、3、5代表推荐正确的新闻所在的位置,2=1+1,3=1+1+1,是累计到当前位置总共推荐正确的新闻数目,20是用户阅读的新闻总数。可以参考如下代码理解:
def get_AP(rec_list,read_news):
hit=0
sum_=0
for i in range(len(rec_list)):
if rec_list[i] in read_news:
hit+=1
sum_+=(hit/(i+1))
return sum_/len(read_news
假设共有n个用户,则每个用户的AP求出来后,求个平均就是MAP啦。
MAP=n∑i=1nAPui
4、NDCG(Normalized Discounted Cumulative Gain)
Normalized Discounted cumulative gain 直接翻译为归一化折损累计增益。
4.1 CG(Cumulative Gain)
说到NDCG首先要说到CG.,即累积增益。举个栗子:为用户推荐5个电影[M1,M2,M3,M4,M5],用户对这5个电影的评分为:[5,3,1,2,4],
则CG=∑imreli=5+3+1+2+4=15
reli表示电影与用户的相关性,在这里就是用户对电影的评分。
我们可以看出,CG并没有考虑位置信息,推荐列表
[M1,M2,M3,M4,M5]和推荐列表
[M3,M2,M1,M4,M5]得到的评价结果是一样的,但我们知道评分高的电影排在推荐列表的前面是比较好的。
所以就有了DCG(Discounted Cumulative Gain)
4.2 DCG(Discounted Cumulative Gain)
discount,即打折的意思,对于同一个电影,如果其在推荐列表中的位置越靠后,它对推荐的贡献就越小。公式如下:
DCG=∑imlog2(i+1)2reli−1
式子乍一看上去有些复杂,我们可以参考一个例子:
当推荐列表为[M1,M2,M3,M4,M5](对应评分[5,3,1,2,4])时:
DCG5=∑i=15log2(i+1)2reli−1
=log2(2)25−1+log2(3)23−1+log2(4)21−1+log2(5)22−1+log2(6)24−1=43.01
当推荐列表为[M3,M2,M1,M4,M5](对应评分为[1,3,5,2,4])时,
DCG5=∑i=15log2(i+1)2reli−1
=log2(2)21−1+log2(3)23−1+log2(4)25−1+log2(5)22−1+log2(6)24−1=28.01
很明显,43.01>28.01,
[M1,M2,M3,M4,M5]优于 [M3,M2,M1,M4,M5]
而NDCG其实就是对DCG进行归一化.
4.3 NDCG
NDCG=idealDCGDCG,
idealDCG是理想状态下的DCG,还以电影推荐为
例,[M1,M2,M3,M4,M5] 对应的评分为:[5,3,1,2,4],按照评分由大到小的顺序,理想的推荐列表应该为:[M1,M5,M2,M4,M3] ,对应评分[5,4,3,2,1]
理想状态下的DCG为:
idealDCG==∑i=15log2(i+1)2reli−1
=log2(2)25−1+log2(3)24−1+log2(4)23−1+log2(5)22−1+log2(6)21−1=45.64
那么,推荐列表[M1,M2,M3,M4,M5]的NDCG为:
43.01/45.64=0.94
推荐列表[M3,M2,M1,M4,M5]的NDCG为:
28.01/45.64=0.6
NDCG是介于[0,1]之间的值,值越大说明推荐的效果越好。