相关文献:
learning to rank : https://en.wikipedia.org/wiki/Learning_to_rank#cite_note-13
MRR: https://en.wikipedia.org/wiki/Mean_reciprocal_rank
Precision and Recall: https://en.wikipedia.org/wiki/Precision_and_recall
chales‘blog : http://charleshm.github.io/2016/03/Model-Performance/
一 查准率与查全率
Precision(P)
是指检索得到的文档中相关文档所占的比例,公式如下:
Recall: (R)
查全率率是指所有相关文档中被召回到的比例,公式如下:
即使仅仅观察查全率为100% 也没多大意义, 虽然相关的文档 被全部召回了, 但是往往代价是伴随着更多的不相关文档被召回,导致查准率下降, 所以应该同时考虑两个指标,尽可能的都要高。
F-measure
一种同时考虑准确率和召回率的指标。公式如下:
F = 2 × p r e c i s i o n × r e c a l l ( p r e c i s i o n + r e c a l l ) F = \frac{2 \times precision \times recall}{(precision+recall)} F=(precision+recall)2×precision×recall
可以看出F的取值范围从0到1。另外还有一种F的变体如下所示:
常用的两种设置是 F 2 F2 F2和 F 0.5 F0.5 F0.5,前者中recall重要程度是precision的两倍,后者则相反,precision重要程度是recall的两倍。
二 Mean average precision(MAP)
准确率和召回率都只能衡量检索性能的一个方面,最理想的情况肯定是准确率和召回率都比较高。当我们想提高召回率的时候,肯定会影响准确率,所以可以把准确率看做是召回率的函数,即: P = f ( R ) P=f(R) P=f(R),也就是随着召回率从0到1,准确率的变化情况。那么就可以对函数 P = f ( R ) P=f(R) P=f(R)在R上进行积分,可以求P的期望均值。公式如下:
微分:
其中k是召回文档中的某doc rank位置, n是所有召回文档数, P ( k ) P(k) P(k)为cut-off k k k in the list准确率, Δ r ( k ) \Delta r(k) Δr(k)为 k − 1 k-1 k−1 到 k k k的召回率变化量
等价于下面的公式:
$ rel(k)$ 值为0或1,如果doc k是相关文档, r e l ( k ) rel(k) rel(k)为1,否则为0,
AvePAveP的计算方式可以简单的认为是:
A
v
e
P
=
1
R
×
∑
r
=
1
R
r
p
o
s
i
t
i
o
n
(
r
)
AveP=\frac{1}{R}\times\sum_{r=1}^R \frac{r}{position(r)}
AveP=R1×r=1∑Rposition(r)r
其中
R
R
R表示相关文档的总个数,
p
o
s
i
t
i
o
n
(
r
)
position(r)
position(r)表示,结果列表从前往后看,第rr个相关文档在列表中的位置。比如,有三个相关文档,位置分别为1、3、6,那么
A
v
e
P
=
1
3
×
(
1
1
+
2
3
+
3
6
)
AveP=\frac{1}{3}\times (\frac{1}{1}+\frac{2}{3}+\frac{3}{6})
AveP=31×(11+32+63)。在编程的时候需要注意,位置和第i个相关文档,都是从1开始的,不是从0开始的。
A
v
e
P
AveP
AveP意义是在召回率从0到1逐步提高的同时,对每个R位置上的P进行相加,也即要保证准确率比较高,才能使最后的
A
v
e
P
AveP
AveP比较大。
最后~,MAP计算所有Query的平均准确率分数:
M
A
P
=
∑
q
=
1
Q
A
v
e
P
(
q
)
Q
MAP=\frac{\sum_{q=1}^Q AveP(q)}{Q}
MAP=Q∑q=1QAveP(q)
Q为query数目总量。
三 Mean reciprocal rank(MRR)
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=∣Q∣1i=1∑∣Q∣ranki1
where
r
a
n
k
i
rank_i
rankirefers to the rank position of the first relevant document for the i-th query.
第一个正确答案的排名的倒数。MRR是指多个查询语句的排名倒数的均值
四 Expected reciprocal rank (ERR)
一种考虑是,一个文档是否被用户点击和排在它前面的文档有很大的关系,比如排在前面的文档都是不相关文档,那么它被点击的概率就高,如果排它前面的文档都是非常相关的文档,那么它被点击的概率就很低。Cascade Models假设用户从排名由高到底依次查看文档,一旦文档满足了用户的需求,则停止查看后续的文档。用RiRi表示用户只看在位置ii上的文档后就不在需要查看其它文档的概率,显然文档的相关度越高, R i R_i Ri越大。那么用户在位置i停止的概率公式如下:
P P r = ∏ i = 1 r − 1 ( 1 − R i ) R r PP_r=\prod_{i=1}^{r-1}(1-R_i)R_r PPr=i=1∏r−1(1−Ri)Rr
ERR表示用户的需求被满足时停止的位置的倒数的期望。首先是计算用户在位置rr停止的概率 P P r PP_r PPr,如下所示:
P P r = ∏ i = 1 r − 1 ( 1 − R i ) R r PP_r=\prod_{i=1}^{r-1}(1-R_i)R_r PPr=i=1∏r−1(1−Ri)Rr
其中 R i R_i Ri是关于文档相关度等级的函数,可以选取如下的函数:
那么ERR的计算公式如下:
更通用一点,ERR不一定计算用户需求满足时停止的位置的倒数的期望,可以是其它基于位置的函数
φ
(
r
)
φ(r)
φ(r),只要满足
φ
(
0
)
=
1
φ(0)=1
φ(0)=1,且
φ
(
r
)
→
0
φ(r)→0
φ(r)→0随着
r
→
∞
r→∞
r→∞。比如DCG中的
φ
(
r
)
=
1
l
o
g
2
(
r
+
1
)
\varphi(r)=\frac{1}{log_2 (r+1)}
φ(r)=log2(r+1)1
ERR论文: https://web.archive.org/web/20120224053008/http://research.yahoo.com/files/err.pdf
五 Discounted cumulative gain (DCG)
在MAP计算公式中,文档只有相关不相关两种,而在nDCG中,文档的相关度可以分多个等级进行打分。
Cumulative Gain (CG)
计算DCG之前先进行计算CG, 公式如下:
C
G
=
∑
i
=
1
p
r
e
l
i
CG=\sum_{i=1}^p rel_i
CG=i=1∑preli
r
e
l
i
rel_i
reli是位置i处的相关性,上述公式计算了前p个结果的相关性总和
注意到召回结果的doc间任意排序,对CG函数值是无影响的,比如: 召回的三个文档rank依次是doc1,doc2,doc3,相关性依次是 3,2,0,而如果
rank顺序为doc3,doc2,doc1,其CG值依然为5. 而前者排序是最合理的,但CG值相同。
Discounted Cumulative Gain(DCG)
所以要引入对位置信息的度量计算,既要考虑文档的相关度等级,也要考虑它所在的位置信息。假设每个位置按照从小到大的排序,
它们的价值依次递减,意味着,相关度越高的如果排序越靠后,那么分数就应该受到惩罚,
可以假设第i个位置的价值是
1
l
o
g
2
(
i
+
1
)
\frac{1}{log_2(i+1)}
log2(i+1)1,那么排在第i个位置的文档所产生的效益就是
r
e
l
i
×
1
l
o
g
2
(
i
+
1
)
=
r
e
l
i
l
o
g
2
(
i
+
1
)
rel_i \times\frac{1}{log_2 (i+1)}=\frac{rel_i}{log_2 (i+1)}
reli×log2(i+1)1=log2(i+1)reli,公式如下:
另一种比较常用的,用来增加相关度影响比重的DCG计算方式是:
Normalized DCG (NDCG)
由于每个查询语句所能检索到的结果文档集合长度不一,p值的不同会对DCG的计算有较大的影响。所以不能对不同查询语句的DCG
进行求平均,需要进行归一化处理。nDCG就是用IDCG进行归一化处理,表示当前DCG比IDCG还差多大的距离。公式如下:
n
D
C
G
p
=
D
C
G
p
I
D
C
G
p
nDCG_p = \frac{DCG_p}{IDCG_p}
nDCGp=IDCGpDCGp
IDCG为理想情况下最大的DCG值
I
D
C
G
p
=
∑
i
=
1
∣
R
E
L
∣
2
r
e
l
i
−
1
l
o
g
2
(
i
+
1
)
IDCG_p =\sum_{i=1}^{|REL|} \frac{2^{rel_i} -1}{log_2 (i+1)}
IDCGp=i=1∑∣REL∣log2(i+1)2reli−1
其中 ∣ R E L ∣ |REL| ∣REL∣表示,文档按照相关性从大到小的顺序排序,取前p个文档组成的集合。也就是按照最优的方式对文档进行排序。
如何计算
假如一个query召回的文档前6个为
D
=
{
d
1
,
d
2
,
d
3
,
d
4
,
d
5
,
d
6
}
D=\{d_1, d_2, d_3,d_4,d_5, d_6\}
D={d1,d2,d3,d4,d5,d6}
相关性分值依次为
3
,
2
,
3
,
0
,
1
,
2
3,2,3,0,1,2
3,2,3,0,1,2
意味着
d
1
d_1
d1 的相关性分值为3,
d
2
d_2
d2相关性分值为2,以此类推。
C
G
CG
CG值为:
可以看到只是简单的对召回对前6个文档分数简单的加和,并没有考虑doc所在的位置对排序结果的评分影响。而
D
C
G
DCG
DCG的思想是对 越高相关性的doc越往后排会给予一定的更大惩罚项。
D
C
G
DCG
DCG的计算如下
因为每个query召回文档数目不同,DCG间无法统一比较,所以需要归一化。
先计算IDCG,我们假设实际上此query召回了八个doc,除了上面6个doc,还有
d
o
c
7
doc_7
doc7 分值为3,
d
o
o
c
8
dooc_8
dooc8分值为0,理想rank情况下的相关分数顺序为:
3
,
3
,
3
,
2
,
2
,
1
,
0
3,3,3,2,2,1,0
3,3,3,2,2,1,0
计算
I
D
C
G
@
6
IDCG@6
IDCG@6:
I
D
C
G
6
=
8.740
IDCG_6= 8.740
IDCG6=8.740
n
I
D
C
G
6
=
D
C
G
6
I
D
C
G
6
=
6.861
8.740
=
0.785
nIDCG_6=\frac{DCG_6}{IDCG_6}=\frac{6.861}{8.740}=0.785
nIDCG6=IDCG6DCG6=8.7406.861=0.785
局限性
- nDCG不能惩罚“坏”文档,比如两个query返回了两列结果,分值分别为 1 , 1 , 1 1,1,1 1,1,1, 1 , 1 , 10 1,1,10 1,1,10 那么两者的nDCG是一样的。注意把 E x c e l l e n t Excellent Excellent, F a i r Fair Fair, B a d Bad Bad映射为分值数字最好为 1 , 0 , − 1 1,0, -1 1,0,−1,而不是类似于 2 , 1 , 0 2,1,0 2,1,0
- nDCG不能惩罚“缺失” 的doc,比如两个query返回了两列结果,分值分别为 1 , 1 , 1 1,1,1 1,1,1, 1 , 1 , 1 , 1 , 1 1,1,1,1,1 1,1,1,1,1.前者计算 D C G @ 3 DCG@3 DCG@3,后者计算 D C G @ 5 DCG@5 DCG@5 的话,两个doc都可以被认为是好的。解决方法是应该采取固定的topk大小来计算 D C G @ k DCG@k DCG@k,并在doc不足的query召回结果后面补上“最小权重分值”,如 1 , 1 , 1 , 0 , 0 1,1,1,0,0 1,1,1,0,0, 1 , 1 , 1 , 1 , 1 1,1,1,1,1 1,1,1,1,1 两者均计算 n D C G @ 5 nDCG@5 nDCG@5
六 分类模型上 Precision 和 Recall的含义
混淆矩阵
True Positive(真正, TP):将正类预测为正类数.
True Negative(真负 , TN):将负类预测为负类数.
False Positive(假正, FP):将负类预测为正类数 →→ 误报 (Type I error).
False Negative(假负 , FN):将正类预测为负类数 →→ 漏报 (Type II error).
精确率(precision)定义为:
P
=
T
P
T
P
+
F
P
(1)
P = \frac{TP}{TP+FP} \tag{1}
P=TP+FPTP(1)
需要注意的是精确率(precision)和准确率(accuracy)是不一样的,
A
C
C
=
T
P
+
T
N
T
P
+
T
N
+
F
P
+
F
N
ACC = \frac{TP + TN}{TP+TN+FP+FN}
ACC=TP+TN+FP+FNTP+TN
在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。比如在互联网广告里面,点击的数量是很少的,一般只有千分之几,如果用acc,即使全部预测成负类(不点击)acc 也有 99% 以上,没有意义。
召回率(recall,sensitivity,true positive rate)定义为:
R
=
T
P
T
P
+
F
N
(2)
R = \frac{TP}{TP+FN} \tag{2}
R=TP+FNTP(2)
此外,还有 F1F1 值,是精确率和召回率的调和均值,
2
F
1
=
1
P
+
1
R
\frac{2}{F_1} = \frac{1}{P} + \frac{1}{R}
F12=P1+R1
F
1
=
2
T
P
2
T
P
+
F
P
+
F
N
(3)
F_1 = \frac{2TP}{2TP + FP + FN} \tag{3}
F1=2TP+FP+FN2TP(3)
精确率和准确率都高的情况下,F1F1 值也会高。
通俗版本
实际上非常简单,精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是对的。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP)。
而召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。