模型评价-F1度量-F_beta度量

F1

F1度量是基于Precision和recall的调和平均定义的:

定义

1
2
3
4
5
def f1_score(precision, recall):
try:
return 2 * precision * recall/(precision+recall)
except:
return 0.0

对于一个训练好的模型,用于测试样本上得到测试样本的预测值,和真实值一起,计算出P&R。代入F1定义,得这个模型的F1值:

代入不同的P&R组合,看看对应F1:

1
2
3
4
print(f1_score(0.9, 0.8))    # 0.8470588235294118
print(f1_score(0.9, 0.1)) # 0.18000000000000002
print(f1_score(0.5, 0.5)) # 0.5
print(f1_score(0.1, 0.1)) # 0.10000000000000002

根据这些结果可以看出调和平均值的特点:当P&R值都较大时,对应F1也较大。当P&R一大一小差别很大时,对应F1接近较小值。当P&R值很平均时,F1接近两者的平均值

F1是综合考虑了P值和R值,一般地,F1值越大表示模型性能越好。但是,如上一篇笔记所述,不同的实际应用场景对于P和R的重视程度是不同的。如,在推荐系统中,为了尽可能精准推荐,P就相对重要;逃犯系统中,为了不漏掉任何一个罪犯,哪怕一个很可疑但无辜的嫌疑人,先认为他是罪犯,抓起来再说。此时R相对重要。对于冤枉的,进一步审问就好了;而对于实际是罪犯,但被模型漏掉了,此情况代价是很高的。
所以对于具体问题,使用F-beta度量

F-beta

F-beta是F1的更一般形式,它表达出对P&R的不同偏好

定义

把训练好的样本用于测试集y_test后,得到的预测值y_predict,代入F-beta定义:

1
2
3
4
5
6
7
from sklearn.metrics import fbeta_score

print(f1_score(y_test, y_predict)) # 0.867469879518
print(fbeta_score(y_test, y_predict, 1)) # 0.867469879518 when beta=1,
print(fbeta_score(y_test, y_predict, 0.2)) # 0.940703517588 when beta=0.2,
print(fbeta_score(y_test, y_predict, 0.8)) # 0.883832335329 when beta=0.8,
print(fbeta_score(y_test, y_predict, 1.8)) # 0.830467899891 when beta=1.8,

beta>0为前提条件。beta为1时,退化为F1。beta<1,P影响大,beta>1,R影响大。
不同的beta值代表不同的应用场景,一个训练好的模型有它实用的场景