《機器學習(周志華)》筆記--模型的評估與選擇(5)--衡量分類任務的性能指標:精准度、召回率與F1 Score計算


五、衡量分類任務的性能指標

  3、精准度與召回率

  精准率(Precision)指的是模型預測為 Positive 時的預測准確度,其計算公式如下:

                       

  召回率(Recall)指的是我們關注的事件發生了,並且模型預測正確了的比值,其計算公式如下:

                        

混淆矩陣:

真實預測 0 1
0 TN FP
1 FN TP

 

舉例:

  假如癌症檢測系統的混淆矩陣如下:

真實預測 0 1
0 9978 12
1 2 8

  (1)該系統的精准率 =8/(8+12)=0.4。

    從計算出的精准率可以看出,如果有 100 個人被預測成患有癌症,那么其中有 40 人是真的患有癌症。也就是說,精准率越高,那么癌症檢測系統預測某人患有癌症的可信度就越高。

  (2)該系統的召回率 =8/(8+2)=0.8。

    從計算出的召回率可以看出,假設有 100 個患有癌症的病人使用這個系統進行癌症檢測,系統能夠檢測出 80 人是患有癌症的。也就是說,召回率越高,那么我們感興趣的對象成為漏網之魚的可能性越低。

   精准率與召回率之間的關系:

    假設有這么一組數據,菱形代表 Positive,圓形代表 Negtive 。

      

     現在需要訓練一個模型對數據進行分類,假如該模型非常簡單,就是在數據上畫一條線作為分類邊界。模型認為邊界的左邊是 Negtive,右邊是 Positive。如果該模型的分類邊界向左或者向右移動的話,模型所對應的精准率和召回率如下圖所示:

           

    從上圖可知,模型的精准率變高,召回率會變低,精准率變低,召回率會變高。

  到底應該使用精准率還是召回率作為性能指標,其實是根據具體業務來決定的。比如我現在想要訓練一個模型來預測我關心的股票是漲( Positive )還是跌( Negtive ),那么我們應該主要使用精准率作為性能指標。因為精准率高的話,則模型預測該股票要漲的可信度就高(很有可能賺錢!)。比如現在需要訓練一個模型來預測人是( Positive )否( Negtive )患有艾滋病,那么我們應該主要使用召回率作為性能指標。因為召回率太低的話,很有可能存在漏網之魚(可能一個人本身患有艾滋病,但預測成了健康),這樣就很可能導致病人錯過了最佳的治療時間,這是非常致命的。

  4、F1 Score

  精准率變高,召回率會變低,精准率變低,召回率會變高。那如果想要同時兼顧精准率和召回率,這個時候就可以使用 F1 Score 來作為性能度量指標了。

  F1 Score 是統計學中用來衡量二分類模型精確度的一種指標。它同時兼顧了分類模型的准確率和召回率。 F1 Score 可以看作是模型准確率和召回率的一種加權平均,它的最大值是 1,最小值是 0。其公式如下:

                                  

舉例:

模型\指標

精准率

召回率

F1

A

0.2

0.7

0.311

B

0.7

0.2

0.311

C

0.8

0.7

0.746

D

0.2

0.3

0.24


  從上述 4 個模型的各種性能可以看出,模型C的精准率和召回率都比較高,因此它的 F1 Score 也比較高。而其他模型的精准率和召回率要么都比較低,要么一個低一個高,所以它們的 F1 Score 比較低。

  這也說明了只有當模型的精准率和召回率都比較高時 F1 Score 才會比較高。這也是 F1 Score 能夠同時兼顧精准率和召回率的原因。

代碼實現:

import numpy as np def precision_score(y_true, y_predict): ''' 計算精准率並返回 :param y_true: 真實類別,類型為ndarray :param y_predict: 預測類別,類型為ndarray :return: 精准率,類型為float '''

    def TN(y_true, y_predict): return np.sum((y_true == 0) & (y_predict == 0)) def FP(y_true, y_predict): return np.sum((y_true == 0) & (y_predict == 1)) def FN(y_true, y_predict): return np.sum((y_true == 1) & (y_predict == 0)) def TP(y_true, y_predict): return np.sum((y_true == 1) & (y_predict == 1)) return TP(y_true, y_predict)/(TP(y_true, y_predict)+FP(y_true, y_predict)) def recall_score(y_true, y_predict): ''' 計算召回率並召回 :param y_true: 真實類別,類型為ndarray :param y_predict: 預測類別,類型為ndarray :return: 召回率,類型為float '''

    def TN(y_true, y_predict): return np.sum((y_true == 0) & (y_predict == 0)) def FP(y_true, y_predict): return np.sum((y_true == 0) & (y_predict == 1)) def FN(y_true, y_predict): return np.sum((y_true == 1) & (y_predict == 0)) def TP(y_true, y_predict): return np.sum((y_true == 1) & (y_predict == 1)) return TP(y_true, y_predict)/(TP(y_true, y_predict)+FN(y_true, y_predict)) def f1_score(precision, recall): ''' 計算f1 score並返回 :param precision: 模型的精准率,類型為float :param recall: 模型的召回率,類型為float :return: 模型的f1 score,類型為float ''' score = (2*precision*recall)/(precision+recall) return score 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM