一般,咱們在評價classifier的性能時使用的是accuracypython
考慮在多類分類的背景下iphone
accuracy = (分類正確的樣本個數) / (分類的全部樣本個數)性能
這樣作其實看上去也挺不錯的,不過可能會出現一個很嚴重的問題:例如某一個不透明的袋子裏面裝了1000臺手機,其中有600臺iphone6, 300臺galaxy s6, 50臺華爲mate7,50臺mx4(固然,這些信息分類器是不知道的。。。)。若是分類器只是簡單的把全部的手機都預測爲iphone6, 那麼經過上面的公式計算的準確率accuracy爲0.6,看起來還不錯;但是三星,華爲和小米的所有預測錯了。若是再給一個袋子,裏面裝着600臺galaxy s6, 300臺mx4, 50臺華爲mate7,50臺iphone,那這個分類器立馬就爆炸了,連回家帶孩子的要求都達不到.net
因此,僅僅用accuracy來衡量一個分類器的性能是很不科學的。所以要引入其餘的衡量標準。3d
是否是常常看見以下相似的圖?這是二分類的圖,假設只有正類和負類,True和False分別表示對和錯;Positive和Negative分別表示預測爲正類和負類。code
那麼blog
因此precision就表示:被正確預測的Positive樣本 / 被預測爲Positive的樣本總數接口
同理,recall就表示:被正確預測的Positive樣本 / 實際爲Positive的樣本總數ip
F1是調和平均值,精準率和召回率只要有一個比較小的話,F1的值也會被拉下來:ci
其實和二分類狀況很相似,例子以下 這個是Micro , 和二分類相似 (將例子中的precision和recall代入到F1公式中,獲得的就是Micro下的F1值)
而Macro狀況下計算F1須要先計算出每一個類別的F1值,而後求平均值。以下
Macro狀況下上述例子的計算
下面是使用sklearn直接計算多類別F1/P/R的程序,將接口中的average參數配置爲’macro’便可。
from sklearn.metrics import f1_score, precision_score, recall_score y_true=[1,2,3] y_pred=[1,1,3] f1 = f1_score( y_true, y_pred, average='macro' ) p = precision_score(y_true, y_pred, average='macro') r = recall_score(y_true, y_pred, average='macro') print(f1, p, r) # output: 0.555555555556 0.5 0.666666666667
參考連接: