推荐系统中的MRR指标

MRR(Mean reciprocal rank)

MRR最早是在搜索场景下衡量,返回结果的质量。
其基于一个假设“每一个query Q只有一个与其相关(relevant)的结果A”

指标反应的是我们找到的这些item是否摆在用户更明显的位置,强调位置关系,顺序性。公式如下,N表示推荐次数,1/p表示用户真实访问的item在结果列表中的位置,如果没在结果序列中,则p为无穷大,1/p为0。

推荐系统中的MRR指标_第1张图片
如上图,有N次搜索,p_i是第i次搜索的结果中最相关结果的位置,其倒数就是返回结果的质量。

python实现:

'''reference: https://gist.github.com/bwhite/3726239'''
def mean_reciprocal_rank(rs):
	'''默认rs是根据相关度排好序的,从高到低'''
    """Score is reciprocal of the rank of the first relevant item
    First element is 'rank 1'.  Relevance is binary (nonzero is relevant).
    Example from http://en.wikipedia.org/wiki/Mean_reciprocal_rank
    >>> rs = [[0, 0, 1], [0, 1, 0], [1, 0, 0]]
    >>> mean_reciprocal_rank(rs)
    0.61111111111111105
    >>> rs = np.array([[0, 0, 0], [0, 1, 0], [1, 0, 0]])
    >>> mean_reciprocal_rank(rs)
    0.5
    >>> rs = [[0, 0, 0, 1], [1, 0, 0], [1, 0, 0]]
    >>> mean_reciprocal_rank(rs)
    0.75
    Args:
        rs: Iterator of relevance scores (list or numpy) in rank order
            (first element is the first item)
    Returns:
        Mean reciprocal rank
    """
    rs = (np.asarray(r).nonzero()[0] for r in rs)
    return np.mean([1. / (r[0] + 1) if r.size else 0. for r in rs])

推荐场景与搜索的不一样

现在很多论文中将推荐结果看作一个ranking的结果,所以也用搜索中的排序指标来衡量推荐结果,比如MRR。
一个常见的场景:推荐系统给用户展示一个列表的物品(想象一个六宫格场景),其中可能有多个用户感兴趣的物品,用户可能点击了其中两个item。
搜索中认为与query 相关的文档只有一个,但是在推荐下用户点击过的都认为是有兴趣,所以这里有两个相关的物品,那么mrr如何计算?
对于每一个相关的item都计算一次,然后再取平均值。这是微软举办的MIND比赛中mrr的计算方法。

具体计算方式如下:

def mrr_score(y_true):
    '''y_true是根据推荐模型预测的score从高到低排序后的结果,其中元素为1或0,代表是否点击'''
    rr_score = y_true / (np.arange(len(y_true)) + 1)
    return np.sum(rr_score) / np.sum(y_true)

你可能感兴趣的:(推荐系统,编译器,visual,studio,code,bash)