關於sklearn.metrics.classification的說明,不少博客都是列幾行代碼再說一下precision,recall,F1-score定義就完事兒,實在是難以理解其用法,本文將用例子與算式結合的方式說明
例子
import numpy as np
from sklearn.metrics import classification_report
y_true =np.array([0,1,2,2,2,1])
y_pred = np.array([0,0,1,2,2,1])
print(classification_report(y_true,y_pred))
結果
precision recall f1-score support
0 0.50 1.00 0.67 1
1 0.50 0.50 0.50 2
2 1.00 0.67 0.80 3
micro avg 0.67 0.67 0.67 6
macro avg 0.67 0.72 0.66 6
weighted avg 0.75 0.67 0.68 6
我們一共擁有0,1,2三個類別,所以輸出結果中有0,1,2三行
True Positive (真正, TP)被模型預測爲正的正樣本;
True Negative(真負 , TN)被模型預測爲負的負樣本 ;
False Positive (假正, FP)被模型預測爲正的負樣本;
False Negative(假負 , FN)被模型預測爲負的正樣本;
precision:TP/(TP+FP)
recall:TP/(TP+FN)
f1-score:2*precision*recall/(precision+recall)
行0:
precison:y_pred中有兩個0,對應真實標籤一個0一個1,所以TP=1,FP=1,1/(1+2)=0.5
recall:y_true中有1個在預測中被預測爲0,並且沒有出現本來是0但在預測中被預測爲別的值的情況出現,所以TP爲1FN爲0, 1/(1+0)=1
行1:
precision:y_pred中有兩個1,對應真實標籤一個2一個1,所以TP=1,FP=1,1/(1+2)=0.5
recall:y_true中有1個在預測中被預測爲0,並且沒有出現本來是0但在預測中被預測爲別的值的情況出現,所以TP爲1FN爲0, 1/(1+0)=1
recall:y_true中有2個在預測中被預測爲1,對應真實標籤一個2一個1,所以TP爲1FN爲1, 1/(1+1)=0.5
行2可以由讀者作爲練習進行參考