1. 程式人生 > >分類模型的F1-score、Precision和Recall 計算過程

分類模型的F1-score、Precision和Recall 計算過程

# 分類模型的F1分值、Precision和Recall 計算過程 ## 引入 通常,我們在評價classifier的效能時使用的是accuracy 考慮在多類分類的背景下 accuracy = (分類正確的樣本個數) / (分類的所有樣本個數) 這樣做其實看上去也挺不錯的,不過可能會出現一個很嚴重的問題:例如某一個不透明的袋子裡面裝了1000臺手機,其中有600臺iphone6, 300臺galaxy s6, 50臺華為mate7,50臺mx4(當然,這些資訊分類器是不知道的。。。)。如果分類器只是簡單的把所有的手機都預測為iphone6, 那麼通過上面的公式計算的準確率accuracy為0.6,看起來還不錯;可是三星,華為和小米的全部預測錯了。如果再給一個袋子,裡面裝著600臺galaxy s6, 300臺mx4, 50臺華為mate7,50臺iphone,那這個分類器立馬就爆炸了,連回家帶孩子的要求都達不到 所以,僅僅用accuracy來衡量一個分類器的效能是很不科學的。因此要引入其他的衡量標準。 ## 二分類 是不是經常看見如下類似的圖?這是二分類的圖,假設只有正類和負類,True和False分別表示對和錯;Positive和Negative分別表示預測為正類和負類。 ![](https://img2020.cnblogs.com/blog/1870574/202008/1870574-20200803193544230-2124907920.png) 那麼 - TP:預測為Positive並且對了(樣本為正類且預測為正類) - TN:預測為Negative並且對了(樣本為負類且預測為負類) - FP:預測為Positive但錯了(樣本為負類但預測為正類) - FN:預測為Negative但錯了(樣本為正類但預測為負類) - TP+FP:預測為Positive並且對了+預測為Positive但錯了=預測為Positive的樣本總數 - TP+FN:預測為Positive並且對了+預測為Negative但錯了=實際為Positive的樣本總數 所以precision就表示:被正確預測的Positive樣本 / 被預測為Positive的樣本總數 ![](https://img2020.cnblogs.com/blog/1870574/202008/1870574-20200803193556155-1287554316.png) 同理,recall就表示:被正確預測的Positive樣本 / 實際為Positive的樣本總數 ![](https://img2020.cnblogs.com/blog/1870574/202008/1870574-20200803193605524-1283692081.png) F1是調和平均值,精準率和召回率只要有一個比較小的話,F1的值也會被拉下來: ![](https://img2020.cnblogs.com/blog/1870574/202008/1870574-20200803193616432-311430024.png) ## 多分類情況 其實和二分類情況很類似,例子如下 這個是Micro , 和二分類類似 (將例子中的precision和recall代入到F1公式中,得到的就是Micro下的F1值) ![](https://img2020.cnblogs.com/blog/1870574/202008/1870574-20200803193625759-1052976644.png) 而Macro情況下計算F1需要先計算出每個類別的F1值,然後求平均值。如下 ![](https://img2020.cnblogs.com/blog/1870574/202008/1870574-20200803193634667-1620398640.png) Macro情況下上述例子的計算 ![](https://img2020.cnblogs.com/blog/1870574/202008/1870574-20200803193643958-333585526.png) ## sklearn計算程式(macro) 下面是使用sklearn直接計算多類別F1/P/R的程式,將介面中的average引數配置為’macro’即可。 ```python 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 ``` 參考連結: https://blog.csdn.net/ybdesire/article/details/96507733 https://www.jianshu.com/p/14b26