因為一直忘記Precision以及Recall兩個參數的定義以及應用,筆記一下。

(圖片取自維基)

如圖所示,大的圈圈代表著判斷的結果。Positives表示判定為是,Negatives表示否;True表示結果為真,False表示結果為否。

此處用(n:m)表示結果,n表示判定結果,m表示真實結果。

TP(True Positives)表示判斷為是,結果為真(1:1);FP表示判斷為是,結果為否(1:0);FN表示判斷為否,結果為真(0:1);TN表示判斷為否,結果為否(0:0)。

目標情況是希望TP與TN最大化,FP以及FN最小化,也就是False越少越好。

因此定義準確度(Accuracy)為

$$Accuracy=\frac{TP+TN}{TP+TN+FP+FN}=\frac{T}{T+F}$$

也就是所有結果中,判斷正確的結果比例。

在一些Learning的使用情況下,不一定追求Accuracy的正確性而已,有的時候也會注重其他兩個參數:適合度(Precision)以及再現度(Recall),定義為

$$Precision=\frac{TP}{TP+FP}$$

$$Recall=\frac{TP}{TP+FN}$$

Precision的意義為:判斷為正的結果中,正確率為多少?

也就是在一群蘋果中,挑選出爛掉的蘋果,真的爛掉的蘋果有多少?挑選出的爛蘋果中,好蘋果越少,Precision越高。

Recall的意義則為:應當判斷為正的結果中,有多少判斷為正?

也就是在一群蘋果中,在挑選出的爛蘋果外,還有多少爛蘋果沒被找到?越少沒被找到的爛蘋果,Recall就越高。

假設這一箱蘋果是要給小朋友吃的水果,爛掉的蘋果非常危險,絕對不能讓小朋友吃到,這時Recall就非常重要。提升Recall的意義就是「寧可錯殺100也不放過一個」。

然而對於蘋果果農而言,果農不希望好的蘋果都被挑掉,越多蘋果出貨,錢就越多。此時Precision就非常重要,選錯了太多好的蘋果當作爛掉的蘋果賣,是會虧錢的。

Precision以及Recall並非相輔相成,這時也有函數能代表著綜合標準(利用Harmonic Mean, 調和平均數來代表),也就是F1 score

$$F=2*\frac{precision\times recall}{precision+recall}$$

雖然F1 score不見得能作為最終的判斷標準,但作為一個指標也夠了。

sklearn中調用參數

在python中,學術module - sklearn已經有寫好可以作為分數指標的函式。

1
2
3
4
from sklearn import metrics
metrics.precision_score(real_number, predict_number)
metrics.recall_score(real_number, predict_number)
metrics.f1_score(real_number, predict_number)

在tensorflow中也有類似用法。本文使用Tensorflow 2.0作為範例,在1.14下無法運作。

1
2
3
4
5
6
7
8
from tensorflow.keras.metrics import Recall, Precision
rc = Recall()
rc.update_state([0, 1, 1, 1], [1, 0, 1, 1])
print('Final result: ', rc.result().numpy())

pc = Precision()
pc.update_state([0, 1, 1, 1], [1, 0, 1, 1])
print('Final result: ', pc.result().numpy())

Reference

  1. https://en.wikipedia.org/wiki/Precision_and_recall
  2. https://www.tensorflow.org/api_docs/python/tf/keras/metrics/Recall