推荐系统之位置敏感的评价指标--MAP和NDCG

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=520=0.25recall=\frac{5}{20}=0.25

我们再来考虑一种情况:用户点击的这5条新闻排在推荐列表的前5还是后5表示的推荐效果是不一样的,很明显,排前面比排在后面好,但是使用recall却无法体现位置差异带来的推荐效果差异

3、MAP

MAP(Mean Average Precision)平均精度均值,可以说是位置敏感的recall。说到MAP首先要说AP(Average Precision),在推荐系统中,计算所有用户的AP,然后对AP相加取平均就是MAP。
AP计算过程如下:
假设为用户u1u_1推荐了5条新闻,用户喜欢(点击了)的新闻分别位列第1、3、5位,则标识如下:[1,0,1,0,1],其中0代表用户不喜欢此条新闻,1代表用户喜欢此条新闻。实际上用户不仅点击了推荐给他的新闻,也阅读了其他一些新闻,总共的点击量为20,那么APu1=(1/1+2/3+3/5)/20=0.113AP_{u_1}=(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=i=1nAPuinMAP=\frac{\sum_{i=1}^n {AP_{u_i}}}{n}

4、NDCG(Normalized Discounted Cumulative Gain)

Normalized Discounted cumulative gain 直接翻译为归一化折损累计增益。

4.1 CG(Cumulative Gain)

说到NDCG首先要说到CG.,即累积增益。举个栗子:为用户推荐5个电影[M1,M2,M3,M4,M5][M_1,M_2,M_3,M_4,M_5],用户对这5个电影的评分为:[5,3,1,2,4],
CG=imreli=5+3+1+2+4=15CG=\sum_{i}^mrel_i=5+3+1+2+4=15

relirel_i表示电影与用户的相关性,在这里就是用户对电影的评分。

我们可以看出,CG并没有考虑位置信息,推荐列表
[M1,M2,M3,M4,M5][M_1,M_2,M_3,M_4,M_5]和推荐列表

[M3,M2,M1,M4,M5][M_3,M_2,M_1,M_4,M_5]得到的评价结果是一样的,但我们知道评分高的电影排在推荐列表的前面是比较好的。
所以就有了DCG(Discounted Cumulative Gain)

4.2 DCG(Discounted Cumulative Gain)

discount,即打折的意思,对于同一个电影,如果其在推荐列表中的位置越靠后,它对推荐的贡献就越小。公式如下:

DCG=im2reli1log2(i+1)DCG=\sum_{i}^m\frac{2^{{rel}_i}-1}{log_2(i+1)}

式子乍一看上去有些复杂,我们可以参考一个例子:
当推荐列表为[M1,M2,M3,M4,M5][5,3,1,2,4][M_1,M_2,M_3,M_4,M_5](对应评分[5,3,1,2,4])时:

DCG5=i=152reli1log2(i+1)DCG_5=\sum_{i=1}^5\frac{2^{{rel}_i}-1}{log_2(i+1)}

=251log2(2)+231log2(3)+211log2(4)+221log2(5)+241log2(6)=43.01=\frac{2^5-1}{log_2(2)}+\frac{2^3-1}{log_2(3)}+\frac{2^1-1} {log_2(4)}+\frac{2^2-1}{log_2(5)}+\frac{2^4-1}{log_2(6)}=43.01

当推荐列表为[M3,M2,M1,M4,M5][1,3,5,2,4][M_3,M_2,M_1,M_4,M_5](对应评分为[1,3,5,2,4])时,

DCG5=i=152reli1log2(i+1)DCG_5=\sum_{i=1}^5\frac{2^{{rel}_i}-1}{log_2(i+1)}

=211log2(2)+231log2(3)+251log2(4)+221log2(5)+241log2(6)=28.01=\frac{2^1-1}{log_2(2)}+\frac{2^3-1}{log_2(3)}+\frac{2^5-1} {log_2(4)}+\frac{2^2-1}{log_2(5)}+\frac{2^4-1}{log_2(6)}=28.01

很明显,43.01>28.01,
[M1,M2,M3,M4,M5][M_1,M_2,M_3,M_4,M_5]优于 [M3,M2,M1,M4,M5][M_3,M_2,M_1,M_4,M_5]

而NDCG其实就是对DCG进行归一化.

4.3 NDCG

NDCG=DCGidealDCGNDCG=\frac{DCG}{idealDCG},

idealDCG是理想状态下的DCG,还以电影推荐为
例,[M1,M2,M3,M4,M5][M_1,M_2,M_3,M_4,M_5] 对应的评分为:[5,3,1,2,4],按照评分由大到小的顺序,理想的推荐列表应该为:[M1,M5,M2,M4,M3][M_1,M_5,M_2,M_4,M_3] ,对应评分[5,4,3,2,1]
理想状态下的DCG为:

idealDCG==i=152reli1log2(i+1)idealDCG==\sum_{i=1}^5\frac{2^{{rel}_i}-1}{log_2(i+1)}
=251log2(2)+241log2(3)+231log2(4)+221log2(5)+211log2(6)=45.64=\frac{2^5-1}{log_2(2)}+\frac{2^4-1}{log_2(3)}+\frac{2^3-1} {log_2(4)}+\frac{2^2-1}{log_2(5)}+\frac{2^1-1}{log_2(6)}=45.64

那么,推荐列表[M1,M2,M3,M4,M5][M_1,M_2,M_3,M_4,M_5]的NDCG为:
43.01/45.64=0.94
推荐列表[M3,M2,M1,M4,M5][M_3,M_2,M_1,M_4,M_5]的NDCG为:
28.01/45.64=0.6

NDCG是介于[0,1]之间的值,值越大说明推荐的效果越好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章