推荐系统常用评测指标
预测准确度(Precision)
评分预测准确度一般通过均方根误差(RMSE)和平方根误差(MAE)计算。对于测试集中的一个用户u和物品i,令
评分预测:(测试集的一个用户u和物品i,令 rui 是用户u对物品的实际评分,而 r^ui 是推荐算法给出的预测评分。
假设我们用一个列表records存放用户评分数据,令records[i] = [u,i,rui,pui],其中rui是用户u对物品i的实际评分,pui是算法预测出来的用户u对物品i的评分。
那么RMSE的定义为:
RMSE=∑u,i∈T(rui−r^ui)2|T|−−−−−−−−−−−−−−−⎷
def RMSE(records):
return math.sqrt(sum([(rui-pui)*(rui-pui) for u,i,rui-pui in records]) / float(len(records)))
MAE采用绝对值计算预测误差,它的定义为:
MAE=∑u,i∈T|rui−r^ui||T|
def MAE(records):
return sum([abs(sum([(rui-pui) for u,i,rui-pui in records]) / float(len(records))
TopN推荐:
网站在提供推荐服务时,一般给用户一个个性化的推荐列表,这种推荐叫做topN推荐。TopN推荐的预测准确度一般通过准确率(Precision)/召回率(recall)度量。
R(u) :根据用户训练集上的行为给用户做出的推荐列表
T(u) :用户在测试集上的行为。
召回率定义为:
Recall=∑u∈U|R(u)∩T(u)|∑u∈U|T(u)|
准确率定义为:
Precision=∑u∈U|R(u)∩T(u)|∑u∈U|R(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 / (1.0 * n_recall), hit / (1.0 * n_precision)]
覆蓋率(Coverage):
(Coverage)覆蓋率描述一个推荐系统对物品长尾的发掘能力。
定义:推荐出来的物品占总物品集合的比例。假设系统的用户集合为U,物品列表为I,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆蓋率可以通过下面公式计算:
Coverage=|Uu∈UR(u)||I|
※通俗的讲:Coverage就是推荐的物品集合占总物品的比例。覆蓋率为100%的系统可以有无数的物品流行度分布。为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。
多样性
多样性:描述了推荐列表中物品两两之间的不相似性。假设s(i,j)∈[0,1]定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
Diversity(R(u))=1−∑i,j∈R(u),i≠js(i,j)12|R(u)|(|R(u)|−1)
而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
Diversity=1|U|∑u∈UDiversity(R(u))
新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。
离线实验 | 用户调查 | 在线实验 |
---|---|---|
用户满意度 | × | √ |
预测准确度 | √ | √ |
覆蓋率 | √ | √ |
多样性 | ○ | √ |
新颖性 | ○ | √ |
惊喜度 | × | √ |
信任度 | ||
实时性 | ||
健壮性 |