预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐 系统离线评测指标,从推荐系统诞生的那一天起,几乎99%与推荐相关的论文都在讨论这个指标。 这主要是因为该指标可以通过离线实验计算,方便了很多学术界的研究人员研究推荐算法。 在计算该指标时需要有一个离线的数据集,该数据集包含用户的历史行为记录。然后,将该 数据集通过时间分成训练集和测试集。最后,通过在训练集上建立用户的行为和兴趣模型预测用 户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。 由于离线的推荐算法有不同的研究方向,因此下面将针对不同的研究方向介绍它们的预测准确度指标。

评分预测

很多提供推荐服务的网站都有一个让用户给物品打分的功能,如果 知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个 他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。

ESMM预测值 预测值准确度_机器学习

假设我们用一个列表records存放用户评分数据,令records[i] = [u,i,rui,pui],其 中rui是用户u对物品i的实际评分,pui是算法预测出来的用户u对物品i的评分,那么下面的代 码分别实现了RMSE和MAE的计算过程 

def RMSE(records): 
 return math.sqrt(\ 
 sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records])\ 
 / float(len(records))) 
def MAE(records): 
 return sum([abs(rui-pui) for u,i,rui,pui in records])\ 
 / float(len(records))

关于RMSE和MAE这两个指标的优缺点, Netflix认为RMSE加大了对预测不准的用户物品评 分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。研究表明,如果评分系统是基于整数 建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差①。

TopN推荐

网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。
TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行 为列表。那么,推荐结果的召回率定义为

ESMM预测值 预测值准确度_机器学习_02

推荐结果的准确率定义为:

ESMM预测值 预测值准确度_ESMM预测值_03


下面的 Python 代码同时计算出了一个推荐算法的准确率和召回率:


def PrecisionRecall(test, N): 
 hit = 0 
 n_recall = 0 
 n_precision = 0 
 for user, items in test.items(): 
 rank = Recommend(user, N) 
 hit += len(rank & items) 
 n_recall += len(items) 
 n_precision += N 
 return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]

有的时候,为了全面评测TopN推荐的准确率和召回率,一般会选取不同的推荐列表长度N, 计算出一组准确率/召回率,然后画出准确率/召回率曲线(precision/recall curve)

覆盖率

覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法, 最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为U, 推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的 公式计算:

ESMM预测值 预测值准确度_python_04

从上面的定义可以看到,覆盖率是一个内容提供商会关心的指标。以图书推荐为例,出版社 可能会很关心他们的书有没有被推荐给用户。覆盖率为100%的推荐系统可以将每个物品都推荐 给至少一个用户。此外,从上面的定义也可以看到,热门排行榜的推荐覆盖率是很低的,它只会 推荐那些热门的物品,这些物品在总物品中占的比例很小。一个好的推荐系统不仅需要有比较高 的用户满意度,也要有较高的覆盖率。
但是上面的定义过于粗略。覆盖率为100%的系统可以有无数的物品流行度分布。为了更细 致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的 物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此, 可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比 较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。
在信息论和经济学中有两个著名的指标可以用来定义覆盖率。第一个是信息熵:

ESMM预测值 预测值准确度_ESMM预测值_05



这里 p ( i ) 是物品 i 的流行度除以所有物品流行度之和。



第二个指标是基尼系数( Gini Index ):




ESMM预测值 预测值准确度_机器学习_06


这里, i j 是按照物品流行度 p () 从小到大排序的物品列表中第 j 个物品。下面的代码可以用来计


算给定物品流行度分布后的基尼系数:


def GiniIndex(p): 
 j = 1 
 n = len(p) 
 G = 0 
 for item, weight in sorted(p.items(), key=itemgetter(1)): 
 G += (2 * j - n - 1) * weight 
 return G / float(n - 1)


ESMM预测值 预测值准确度_机器学习_07


 社会学领域有一个著名的马太效应,即所谓强者更强,弱者更弱的效应。如果一个系统会增 大热门物品和非热门物品的流行度差距,让热门的物品更加热门,不热门的物品更加不热门,那 么这个系统就有马太效应。比如,首页的热门排行榜就有马太效应。进入排行榜的都是热门的物 品,但它们因为被放在首页的排行榜展示有了更多的曝光机会,所以会更加热门。相反,没有进 入排行榜的物品得不到展示,就会更不热门。搜索引擎的PageRank算法也具有一定的马太效应, 如果一个网页的某个热门关键词排名很高,并因此被展示在搜索结果的第一条,那么它就会获得 更多的关注,从而获得更多的外链,PageRank排名也越高。

那么,推荐系统是否有马太效应呢?推荐系统的初衷是希望消除马太效应,使得各种物品都 能被展示给对它们感兴趣的某一类人群。但是,很多研究表明现在主流的推荐算法(比如协同过 滤算法)是具有马太效应的。评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。如 果G1是从初始用户行为中计算出的物品流行度的基尼系数,G2是从推荐列表中计算出的物品流 行度的基尼系数,那么如果G2 > G1,就说明推荐算法具有马太效应。

 

多样性

用户的兴趣是广泛的,在一个视频网站中,用户可能既喜欢看《猫和老鼠》一类的动画片, 也喜欢看成龙的动作片。那么,为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴 趣领域,即推荐结果需要具有多样性。多样性推荐列表的好处用一句俗话表述就是“不在一棵树 上吊死”。尽管用户的兴趣在较长的时间跨度中是一样的,但具体到用户访问推荐系统的某一刻, 其兴趣往往是单一的,那么如果推荐列表只能覆盖用户的一个兴趣点,而这个兴趣点不是用户这 个时刻的兴趣点,推荐列表就不会让用户满意。反之,如果推荐列表比较多样,覆盖了用户绝大 多数的兴趣点,那么就会增加用户找到感兴趣物品的概率。因此给用户的推荐列表也需要满足用 户广泛的兴趣,即具有多样性。 多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设

ESMM预测值 预测值准确度_推荐系统_08

 定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:

ESMM预测值 预测值准确度_python_09

而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:

ESMM预测值 预测值准确度_机器学习_10

从上面的定义可以看到,不同的物品相似度度量函数s(i, j)可以定义不同的多样性。如果用内 容相似度描述物品间的相似度,我们就可以得到内容多样性函数,如果用协同过滤的相似度函数 描述物品间的相似度,就可以得到协同过滤的多样性函数。 关于推荐系统多样性最好达到什么程度,可以通过一个简单的例子说明。假设用户喜欢动作 片和动画片,且用户80%的时间在看动作片,20%的时间在看动画片。那么,可以提供4种不同的 推荐列表:A列表中有10部动作片,没有动画片;B列表中有10部动画片,没有动作片;C列表中 有8部动作片和2部动画片;D列表有5部动作片和5部动画片。在这个例子中,一般认为C列表是 最好的,因为它具有一定的多样性,但又考虑到了用户的主要兴趣。A满足了用户的主要兴趣, 但缺少多样性,D列表过于多样,没有考虑到用户的主要兴趣。B列表即没有考虑用户的主要兴 趣,也没有多样性,因此是最差的。