TP(true positive):表示样本的真实类别为正,最后预测得到的结果也为正;
FP(false positive):表示样本的真实类别为负,最后预测得到的结果却为正;
FN(false negative):表示样本的真实类别为正,最后预测得到的结果却为负;
TN(true negative):表示样本的真实类别为负,最后预测得到的结果也为负.
其中,TP与TN表示分类正确的样本。
准确率表示预测正确的样本数占总样本书的比例。
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy = \frac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN
精确率表示预测为正样本的样本中,正确预测为正样本的概率。
P r e c i s i o n = T P T P + F P Precision= \frac{TP}{TP+FP} Precision=TP+FPTP
召回率表示正确预测出正样本占实际正样本的概率。
R e c a l l = T P T P + F N Recall = \frac{TP}{TP+FN} Recall=TP+FNTP
折中了召回率与精确率。
F 1 = 2 ∗ R e c a l l ∗ P r e c i s i o n R e c a l l + P r e c i s i o n F1 = \frac{2*Recall*Precision}{Recall+Precision} F1=Recall+Precision2∗Recall∗Precision
ROC曲线的横轴为假正例率FPR(越小越好),纵轴为真正例率TPR(越大越好)。
F P R = F P T N + F P FPR = \frac{FP}{TN+FP} FPR=TN+FPFP
T P R = T P T P + T N TPR = \frac{TP}{TP+TN} TPR=TP+TNTP
ROC计算过程:
1)首先每个样本都需要有一个label值,并且还需要一个预测的score值(取值0到1);2)然后按这个score对样本由大到小进行排序,假设这些数据位于表格中的一列,从上到下依次降序;3)现在从上到下按照样本点的取值进行划分,位于分界点上面的我们把它归为预测为正样本,位于分界点下面的归为负样本;4)分别计算出此时的TPR和FPR,然后在图中绘制(FPR, TPR)点。
AUC的含义:测试任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score。或者,任意给定一个负样本,所有正样本的score中有多大比例是大于该负类样本的score
在top-K推荐中,HR是一种常用的衡量召回率的指标,计算公式为:
H R @ K = N u m b e r O f H i t s @ K G T HR@K = \frac{NumberOfHits@K}{GT} HR@K=GTNumberOfHits@K
分母是所有的测试集合,分子表示每个用户top-K列表中属于测试集合的个数的总和。
举个简单的例子,三个用户在测试集中的商品个数分别是10,12,8,模型得到的top-10推荐列表中,分别有6个,5个,4个在测试集中,那么此时HR的值是
(6+5+4)/(10+12+8) = 0.5。
def hit(gt_items, pred_items):
count = 0
for item in pred_items:
if item in gt_items:
count += 1
return count
平均准确率AP,假使当我们使用google搜索某个关键词,返回了10个结果。当然最好的情况是这10个结果都是我们想要的相关信息。但是假如只有部分是相关的,比如5个,那么这5个结果如果被显示的比较靠前也是一个相对不错的结果。但是如果这个5个相关信息从第6个返回结果才开始出现,那么这种情况便是比较差的。这便是AP所反映的指标,与recall的概念有些类似,不过是“顺序敏感的recall。
对于用户 u u u,给他推荐一些物品,那么 u u u的平均准确率为:
A P u = 1 Ω u ∑ i ∈ Ω u ∑ j ∈ Ω u h ( p u j < p u i ) + 1 p u i AP_u = \frac{1}{\Omega _u}\sum_{i\in \Omega_u }\frac{\sum_{j\in \Omega_u }h(p_{uj} < p_{ui})+1}{p_{ui}} APu=Ωu1i∈Ωu∑pui∑j∈Ωuh(puj<pui)+1
其中, Ω u \Omega _u Ωu表示ground-truth的结果, p u j p_{uj} puj表示 i i i物品在推荐列表中的位置, p u j < p u i p_{uj} < p_{ui} puj<pui表示 j j j物品在推荐列表中排在 i i i物品之前。
举个例子:
def AP(ranked_list, ground_truth):
"""Compute the average precision (AP) of a list of ranked items
"""
hits = 0
sum_precs = 0
for n in range(len(ranked_list)):
if ranked_list[n] in ground_truth:
hits += 1
sum_precs += hits / (n + 1.0)
if hits > 0:
return sum_precs / len(ground_truth)
else:
return 0
MAP表示所有用户 u u u的AP再取均值,计算公式如下:
M A P = ∑ u ∈ U A P u ∣ U ∣ MAP = \frac{\sum_{u\in U}AP_u}{\left | U \right |} MAP=∣U∣∑u∈UAPu
累积增益CG,推荐系统中CG表示将每个推荐结果相关性的分值累加后作为整个推荐列表的得分:
C G k = ∑ i = 1 k r e l i CG_k = \sum_{i=1} ^{k}rel_i CGk=i=1∑kreli
其中, r e l i rel_i reli表示位置 i i i的推荐结果的相关性, k k k表示推荐列表的大小。
CG没有考虑每个推荐结果处于不同位置对整个推荐结果的影响,例如,我们总是希望相关性大大的结果排在前面,相关性低的排在前面会影响用户体验。
DCG在CG的基础上引入了位置影响因素,计算公式如下:
D C G k = ∑ i = 1 k 2 r e l i − 1 l o g 2 ( i + 1 ) DCG_k = \sum_{i=1}^{k} \frac{2^{rel_i}-1} {log_2(i+1)} DCGk=i=1∑klog2(i+1)2reli−1
从上面的式子可以得出:1)推荐结果的相关性越大,DCG越大。2)相关性好的排在推荐列表前面的话,推荐效果越好,DCG越大。
DCG针对不同的推荐列表之间很难进行横向评估,而我们评估一个推荐系统不可能仅使用一个用户的推荐列表及相应结果进行评估,而是对整个测试集中的用户及其推荐列表结果进行评估。那么,不同用户的推荐列表的评估分数就需要进行归一化,也就是NDCG。
IDCG表示推荐系统某一用户返回的最好推荐结果列表, 即假设返回结果按照相关性排序, 最相关的结果放在最前面, 此序列的DCG为IDCG。因此DCG的值介于 (0,IDCG] ,故NDCG的值介于(0,1],那么用户u的NDCG@K定义为:
N D C G u @ k = D C G u @ k I D C G u NDCG_u@k = \frac{DCG_u@k}{IDCG_u} NDCGu@k=IDCGuDCGu@k
平均NDCG的值为:
N D C G @ k = ∑ u ∈ U N D C G u @ k I D C G u NDCG@k = \frac{\sum_{u \in U}NDCG_u@k}{IDCG_u} NDCG@k=IDCGu∑u∈UNDCGu@k
举个例子:
正确检索结果值在检索结果中的排名来评估检索系统的性能。
M R R = 1 Q ∑ i = 1 ∣ Q ∣ 1 r a n k i MRR = \frac{1}{Q} \sum_{i=1}^{|Q|} \frac{1}{rank_i} MRR=Q1i=1∑∣Q∣ranki1
其中, ∣ Q ∣ |Q| ∣Q∣是用户的个数, r a n k i rank_i ranki是对于第 i i i个用户,推荐列表中第一个在ground-truth结果中的item所在的排列位置。
举个例子:假如检索三次的结果如下,需要的结果(cat,torus,virus)分别排在3,2,1的话,此系统地MRR为(1/3 + 1/2 + 1)/3 = 11/18
如果检索出来的正确结果多于一个时,可以使用MAP(Mean Average Precision)算法。
ILS 衡量推荐列表多样性的指标,计算公式:
I L S ( L ) = ∑ b i ∈ L ∑ b j ∈ L , b j ≠ b i S ( b i , b j ) ∑ b i ∈ L ∑ b j ∈ L , b j ≠ b i 1 ILS(L) = \frac{ \sum_{b_i \in L} \sum_{b_j \in L, b_j \neq b_i} S(b_i, b_j) }{\sum_{b_i \in L }\sum_{b_j \in L, b_j \neq b_i }1} ILS(L)=∑bi∈L∑bj∈L,bj̸=bi1∑bi∈L∑bj∈L,bj̸=biS(bi,bj)
如果, S ( b i , b j ) S(b_i,b_j) S(bi,bj)计算的是 i i i和 j j j两个物品的相似性,如果推荐列表中的物品越不相似,ILS越小,那么推荐结果的多样性越好。
参考:
1、http://blog.sina.com.cn/s/blog_79bc4c470101rp4o.html
2、https://github.com/princewen/tensorflow_practice/blob/master/recommendation/Basic-Evaluation-metrics/NDCG.py
3、https://en.wikipedia.org/wiki/Receiver_operating_characteristic
4、https://en.wikipedia.org/wiki/Discounted_cumulative_gain