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的實現以及概念