分類模型的F1-score、Precision和Recall 計算過程
阿新 • • 發佈:2020-08-03
# 分類模型的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