【筆記】F1 score


F1 score

關於精准率和召回率

精准率和召回率可以很好的評價對於數據極度偏斜的二分類問題的算法,有個問題,畢竟是兩個指標,有的時候這兩個指標也會產生差異,對於不同的算法,精准率可能高一些,召回率可能低一些,反之一樣,真正使用的時候應該根據具體的使用場景來去解讀這兩個指標

想要得到這兩個指標之間的平衡,希望能同時照顧到精准率和召回率,這樣就可以使用新的指標,F1 score

F1 score的目的就是兼顧這兩個指標,描述的是精准率和召回率的調和平均值,公式可以寫成

這種的好處就是,如果說一個值特別低,另外一個值特別高,最終得到的F1 score的值也會很低,只有兩個值都很高,得到的值才會非常高

可以將式子進行化簡通分變形,最后可以得到

具體實現

(在notebook中)

首先實現一個F1 score,根據上式即可寫出,設置如果分母為0,直接返回0即可

  import numpy as np

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

如果精准率為0.5,召回率為0.5,求出對應的F1 score

  precision = 0.5
  recall = 0.5
  f1_score(precision,recall)

結果如下

如果精准率為0.1,召回率為0.9,求出對應的F1 score

  precision = 0.1
  recall = 0.9
  f1_score(precision,recall)

結果如下

如果精准率為0.0,召回率為1.0,求出對應的F1 score

  precision = 0.0
  recall = 1.0
  f1_score(precision,recall)

結果如下

使用手寫識別數據集,相應的設置為極度偏斜的數據情況,然后對數據集進行分割

  from sklearn import datasets

  digits = datasets.load_digits()
  X = digits.data
  y = digits.target.copy()

  y[digits.target==9] = 1
  y[digits.target!=9] = 0

  from sklearn.model_selection import train_test_split
  X_train,X_test,y_train,y_test =  train_test_split(X,y,random_state=666)

使用sklearn中的邏輯回歸后,計算准確度

  from sklearn.linear_model import LogisticRegression

  log_reg = LogisticRegression()
  log_reg.fit(X_train,y_train)
  log_reg.score(X_test,y_test)

結果如下

對訓練的結果進行預測,使用混淆矩陣得出

  y_predict = log_reg.predict(X_test)

  from sklearn.metrics import confusion_matrix

  confusion_matrix(y_test,y_predict)

結果如下

計算准確率

  from sklearn.metrics import precision_score

  precision_score(y_test,y_predict)

結果如下

計算召回率

  from sklearn.metrics import recall_score

  recall_score(y_test,y_predict)

結果如下

使用sklearn中的f1_score計算F1 score,傳入真實值和預測值

  from sklearn.metrics import f1_score

  f1_score(y_test,y_predict)

結果如下

以上就是F1 score的實現以及概念


免責聲明!

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



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