爲何要用f1-score而不是平均值

作過機器學習項目的同窗大多都用過f1-score, 這是一種均衡精度(precision)和召回率(recall)的綜合評價指標,但爲何不用平均值呢?app

精度和召回率

精度

$$ pre  = \frac{tp}{tp+fp}$$機器學習

tp: true positive 真正例,即預測爲正例真實也爲正例的個數;學習

fp: false positive 假正例,即預測爲正例但實際是反例的個數;lua

precision 評價的是查準率,即給出的預測爲正例中多少是正確的。spa

召回率

$$ recall = \frac{tp}{tp+fn}$$3d

tn: false negative 假反例,即真實是正例,(tp+fn)表示總共的正例個數。code

recall 評價的是查全率,即模型正確召回了多少的正例。對象

 

f1-score 和平均值

$$ mean = \frac{pre+recall}{2} $$blog

$$ f1\_score = \frac{1}{\frac{1}{recall}+{\frac{1}{pre}}} = \frac{2*pre*recall}{pre+recall}$$ci

f1-score的公式能夠看出recall或者pre較小的那個將會決定f1-score結果,即具備短板效應,而均值的方法不具備這樣的效果。例如$recall=1,pre \approx 0$的狀況下$f1\_score \approx 0; mean \approx 0.5$。

總結一下,就是f1-score比均值的方法更能說明一個模型的好壞,由於不少時候都須要recall和pre的均衡,任意一個指標太差都是沒法接受的。

可視化結果

下圖是這兩種指標的可視化結果,x軸和y軸分別表明recall和pre,z軸表明綜合評價指標(evaluation metric),藍色的平面爲均值在不一樣的精度和召回率下(0-1)的結果,變色的曲面表示f1-score在不一樣精度和召回率下(0-1)的結果。

能夠看到在對角線部分二者是重合的,可是靠近兩邊時,f1-score降低很厲害,直至0,而均值並無這樣的效果。

 

代碼:

# 載入模塊
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 建立 3D 圖形對象
fig = plt.figure()
ax = Axes3D(fig)

# 生成數據
X = np.arange(0.0001, 1, 0.01)
Y = np.arange(0.0001, 1, 0.01)
X, Y = np.meshgrid(X, Y)
mean = (X+Y)/2
f1_score = 2*(X*Y)/(X+Y)

ax.set_xlabel('recall')
ax.set_ylabel('precision')
ax.set_zlabel('evaluation metric')

# 繪製曲面圖,並使用 cmap 着色
ax.plot_surface(X, Y, mean, cmap=plt.cm.winter)
ax.plot_surface(X, Y, f1_score, cmap='rainbow')

plt.show()
相關文章
相關標籤/搜索