1.用户满意度
用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标。但是,用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
2.预测准确度
预测准确度可以用评分预测和TopN表示。
评分预测:评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。对于测试集中一个用户u 和 物品 i,令 rui 是用户u对i 的实际评分,而^rui 是推荐算法给出的预测评分。那么 RMSE 的定义为:
MAE 采用绝对值计算预测误差,它的定义为:
假设用列表 records 存放用户评分数据,令 records[i] = [u,i,rui,pui],其中 rui 是用户u对i的真实评分,pui 是算法预测出来的评分,那么下面的代码分别展示了 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))
TopN方法:网站在提供服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做 TopN 推荐。TopN 推荐的预测准确率一般是通过 准确率(precision)/召回率(recall) 度量。
令R(u)是根据用户在训练集上的行为给用户做出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率:
推荐结果的准确率定义为:
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 / n_recall, hit / n_precision]
有的时候,为了全面评测TopN推荐的准确率和召回率,一般会选取不同的推荐列表长度 N ,计算出一组准确率 / 召回率曲线。
3.覆盖率
定义物品的流行度为 p(i), I 为全部的物品集,假设物品是按照流行度p从小到大排列的。则我们定义基尼系数(Gini Index)如下
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)
关于基尼系数,不得不提到马太效应:强者更强,弱者更弱的效应。如果一个系统会增大热门物品和非热门物品的流行度差距,让热门的物品更热门,不热门的物品更加不热门,那么这个系统就有马太效应。
推荐系统的初衷就是消除马太效应,使得各种物品都能被展示给对它们感兴趣的某一类人群。但是很多研究表明现在的主流推荐算法(比如协同过滤)是具有马太效应的。评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。如果G1 是从初始用户行为中计算出的物品流行度的基尼系数,G2 是从推荐列表中计算出的物品流行度的基尼系数,那么如果 G2 > G1,就说明推荐算法具有马太效应。
4.多样性
用户的兴趣是广泛的,比如用户既可能喜欢动画片,也喜欢动作片。为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域。
5.新颖性
用户喜欢周星驰的电影,如果推荐给用户周星驰演过的但是用户自己从来没听过的电影,叫新颖性。
6.惊喜性
用户喜欢周星驰的电影,但是莫名其妙推荐了跟用户兴趣完全无关的成龙的电影。用户看完后表示很喜欢,这叫惊喜度。
7.信任度
用户对推荐系统的结果本身的认可感。
8.实时性
当用户买苹果手机的时候,立即推荐苹果耳机等配件。而不是等到第二天收集了用户购买行为,再离线计算推荐算法,第二天推荐苹果耳机。这就叫实时性。
9.健壮性
防止攻击的性能。假如我是商户,我可以叫大量人来阅览点击我的商品,那么推荐系统极有可能会增加推荐我的商品的概率。这就是恶意攻击。因为推荐系统本身是通过收集用户行为而推荐的。针对这种情况,除了选择健壮性较高的算法之外,还可以
设计推荐系统时尽量使用代价比较高的行为。比如,在购买行为和浏览行为中主要使用购买行为。
在使用数据前,进行攻击检测,从而对数据进行清理。