数据样例
一个数据库有500个文档,其中有50个文档符合定义。系统检索到75个文档,但是实际只有45个符合定义。
\ | 相关 | 不相关 |
---|---|---|
检索到 | 45(A) | 30(B) |
未检索到 | 5(C) | 420(D) |
召回率计算
召回率R:用实际检索到相关文档数作为分子,所有相关文档总数作为分母,即
R
=
A
/
(
A
+
C
)
R = A / ( A + C )
R=A/(A+C)
召回率 R = 45/50 = 90%
精确率计算
精度P:用实际检索到相关文档数作为分子,所有检索到的文档总数作为分母,即
P
=
A
/
(
A
+
B
)
P = A / ( A + B )
P=A/(A+B)
精度 P = 45/75 = 60%
F1值计算
我们希望检索结果Precision越高越好,同时Recall也越高越好,但当检索数据库中所有信息时,
精度:P = 50 / (50 + 450) = 10%
召回率:R = 50 / 50 = 100%
此时,P和R指标出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure(又称为F-Score),即
F
=
2
∗
P
∗
R
/
(
P
+
R
)
F = 2*P*R / (P + R)
F=2∗P∗R/(P+R)
F = 2*0.9*0.6 / (0.9 + 0.6) = 72%
代码:
A = 45
B = 30
C = 5
D = 420
R = A / (A + C)
P = A / (A + B)
F = A*B*2 / (A + B)
print(f"R_VAL: {R} P_VAL: {P} F_VAL: {F}")
总结
希望检索结果Precision越高越好,同时Recall也越高越好,但事实上这两者在某些情况下有矛盾的。比如极端情况下,我们只搜索出了一个结果,且是准确的,那么Precision就是100%,但是Recall就很低;而如果我们把所有结果都返回,那么比如Recall是100%,但是Precision就会很低。因此在不同的场合中需要自己判断希望Precision比较高或是Recall比较高。