使用keras實(shí)現(xiàn)Precise, Recall, F1-socre方式
實(shí)現(xiàn)過程
from keras import backend as K def Precision(y_true, y_pred): """精確率""" tp= K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) # true positives pp= K.sum(K.round(K.clip(y_pred, 0, 1))) # predicted positives precision = tp/ (pp+ K.epsilon()) return precision def Recall(y_true, y_pred): """召回率""" tp = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) # true positives pp = K.sum(K.round(K.clip(y_true, 0, 1))) # possible positives recall = tp / (pp + K.epsilon()) return recall def F1(y_true, y_pred): """F1-score""" precision = Precision(y_true, y_pred) recall = Recall(y_true, y_pred) f1 = 2 * ((precision * recall) / (precision + recall + K.epsilon())) return f1
補(bǔ)充知識:分類問題的幾個(gè)評價(jià)指標(biāo)(Precision、Recall、F1-Score、Micro-F1、Macro-F1)
四個(gè)基本概念
TP、True Positive 真陽性:預(yù)測為正,實(shí)際也為正
FP、False Positive 假陽性:預(yù)測為正,實(shí)際為負(fù)
FN、False Negative 假陰性:預(yù)測與負(fù)、實(shí)際為正
TN、True Negative 真陰性:預(yù)測為負(fù)、實(shí)際也為負(fù)。
【一致判真假,預(yù)測判陰陽?!?/p>
以分類問題為例:(word公式為什么粘不過來??頭疼。)
首先看真陽性:真陽性的定義是“預(yù)測為正,實(shí)際也是正”,這個(gè)最好理解,就是指預(yù)測正確,是哪個(gè)類就被分到哪個(gè)類。對類A而言,TP的個(gè)位數(shù)為2,對類B而言,TP的個(gè)數(shù)為2,對類C而言,TP的個(gè)數(shù)為1。
然后看假陽性,假陽性的定義是“預(yù)測為正,實(shí)際為負(fù)”,就是預(yù)測為某個(gè)類,但是實(shí)際不是。對類A而言,F(xiàn)P個(gè)數(shù)為0,我們預(yù)測之后,把1和2分給了A,這兩個(gè)都是正確的,并不存在把不是A類的值分給A的情況。類B的FP是2,"3"和"8"都不是B類,但卻分給了B,所以為假陽性。類C的假陽性個(gè)數(shù)為2。
最后看一下假陰性,假陰性的定義是“預(yù)測為負(fù),實(shí)際為正”,對類A而言,F(xiàn)N為2,"3"和"4"分別預(yù)測為B和C,但是實(shí)際是A,也就是預(yù)測為負(fù),實(shí)際為正。對類B而言,F(xiàn)N為1,對類C而言,F(xiàn)N為1。
具體情況看如下表格:
A |
B |
C |
總計(jì) |
|
TP |
2 |
2 |
1 |
5 |
FP |
0 |
2 |
2 |
4 |
FN |
2 |
1 |
1 |
4 |
感謝這兩位的指正
精確率和召回率
計(jì)算我們預(yù)測出來的某類樣本中,有多少是被正確預(yù)測的。針對預(yù)測樣本而言。
針對原先實(shí)際樣本而言,有多少樣本被正確的預(yù)測出來了。
套用網(wǎng)上的一個(gè)例子:
某池塘有1400條鯉魚,300只蝦,300只鱉?,F(xiàn)在以捕鯉魚為目的。撒一大網(wǎng),逮著了700條鯉魚,200只蝦,100只鱉。那么,這些指標(biāo)分別如下:
精確率 = 700 / (700 +200 + 100) = 70%
召回率 = 700 / 1400 =50%
可以吧上述的例子看成分類預(yù)測問題,對于“鯉魚來說”,TP真陽性為700,F(xiàn)P假陽性為300,F(xiàn)N假陰性為700。
Precison=TP/(TP+FP)=700(700+300)=70%
Recall=TP/(TP+FN)=700/(700+700)=50%
將上述例子,改變一下:把池子里的所有的鯉魚、蝦和鱉都一網(wǎng)打盡,觀察這些指標(biāo)的變化。
精確率 = 1400 / (1400 +300 + 300) = 70%
召回率 = 1400 / 1400 =100%
TP為1400:有1400條鯉魚被預(yù)測出來;FP為600:有600個(gè)生物不是鯉魚類,卻被歸類到鯉魚;FN為0,鯉魚都被歸類到鯉魚類去了,并沒有歸到其他類。
Precision=TP/(TP+FP)=1400/(1400+600)=70%
Recall=TP/(TP+FN)=1400/(1400)=100%
其實(shí)就是分母不同,一個(gè)分母是預(yù)測為正的樣本數(shù),另一個(gè)是原來樣本中所有的正樣本數(shù)。
作為預(yù)測者,我們當(dāng)然是希望,Precision和Recall都保持一個(gè)較高的水準(zhǔn),但事實(shí)上這兩者在某些情況下有矛盾的。比如極端情況下,我們只搜索出了一個(gè)結(jié)果,且是正確的,那么Precision就是100%,但是Recall就很低;而如果我們把所有結(jié)果都返回,那么比如Recall是100%,但是Precision就會很低。因此在不同的場合中需要自己判斷希望Precision比較高或是Recall比較高,此時(shí)我們可以引出另一個(gè)評價(jià)指標(biāo)—F1-Score(F-Measure)。
F1-Score
F1分?jǐn)?shù)(F1 Score),是統(tǒng)計(jì)學(xué)中用來衡量二分類模型精確度的一種指標(biāo)。它同時(shí)兼顧了分類模型的精確率和召回率。F1分?jǐn)?shù)可以看作是模型精確率和召回率的一種加權(quán)平均,它的最大值是1,最小值是0。(出自百度百科)
數(shù)學(xué)定義:F1分?jǐn)?shù)(F1-Score),又稱為平衡F分?jǐn)?shù)(BalancedScore),它被定義為精確率和召回率的調(diào)和平均數(shù)。
更一般的,我們定義Fβ分?jǐn)?shù)為:
除了F1分?jǐn)?shù)之外,F(xiàn)0.5分?jǐn)?shù)和F2分?jǐn)?shù),在統(tǒng)計(jì)學(xué)中也得到了大量應(yīng)用,其中,F(xiàn)2分?jǐn)?shù)中,召回率的權(quán)重高于精確率,而F0.5分?jǐn)?shù)中,精確率的權(quán)重高于召回率。
Micro-F1和Macro-F1
最后看Micro-F1和Macro-F1。在第一個(gè)多標(biāo)簽分類任務(wù)中,可以對每個(gè)“類”,計(jì)算F1,顯然我們需要把所有類的F1合并起來考慮。
這里有兩種合并方式:
第一種計(jì)算出所有類別總的Precision和Recall,然后計(jì)算F1。
例如依照最上面的表格來計(jì)算:Precison=5/(5+4)=0.556,Recall=5/(5+4)=0.556,然后帶入F1的公式求出F1,這種方式被稱為Micro-F1微平均。
第二種方式是計(jì)算出每一個(gè)類的Precison和Recall后計(jì)算F1,最后將F1平均。
例如上式A類:P=2/(2+0)=1.0,R=2/(2+2)=0.5,F(xiàn)1=(2*1*0.5)/1+0.5=0.667。同理求出B類C類的F1,最后求平均值,這種范式叫做Macro-F1宏平均。
本篇完,如有錯(cuò)誤,還望指正。 以上這篇使用keras實(shí)現(xiàn)Precise, Recall, F1-socre方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python如何統(tǒng)計(jì)字符串中字符的個(gè)數(shù)
這篇文章主要給大家介紹了關(guān)于python如何統(tǒng)計(jì)字符串中字符的個(gè)數(shù)的相關(guān)資料,如果在一個(gè)字符串中,需要統(tǒng)計(jì)某個(gè)字符或字符串出現(xiàn)的次數(shù),可以使用count方法,需要的朋友可以參考下2023-10-10python FastApi實(shí)現(xiàn)數(shù)據(jù)表遷移流程詳解
今天我們來聊一聊在FastApi里面,數(shù)據(jù)遷移工作,F(xiàn)astAPI是一個(gè)現(xiàn)代的,快速(高性能)python web框架。本文將利用fastapi實(shí)現(xiàn)數(shù)據(jù)表遷移功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-08-08使用Tensorflow將自己的數(shù)據(jù)分割成batch訓(xùn)練實(shí)例
今天小編就為大家分享一篇使用Tensorflow將自己的數(shù)據(jù)分割成batch訓(xùn)練實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python opencv實(shí)現(xiàn)圖片旋轉(zhuǎn)矩形分割
這篇文章主要為大家詳細(xì)介紹了python opencv實(shí)現(xiàn)圖片旋轉(zhuǎn)矩形分割,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Python基礎(chǔ)學(xué)習(xí)之基本數(shù)據(jù)結(jié)構(gòu)詳解【數(shù)字、字符串、列表、元組、集合、字典】
這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)之基本數(shù)據(jù)結(jié)構(gòu),結(jié)合實(shí)例形式分析了Python數(shù)字、字符串、列表、元組、集合、字典等基本數(shù)據(jù)類型功能、原理及相關(guān)使用技巧,需要的朋友可以參考下2019-06-06基于Matplotlib?調(diào)用?pyplot?模塊中?figure()?函數(shù)處理?figure圖形對象
這篇文章主要介紹了基于Matplotlib?調(diào)用?pyplot?模塊中?figure()?函數(shù)處理?figure圖形對象,matplotlib.pyplot模塊能夠快速地生成圖像,但如果使用面向?qū)ο蟮木幊趟枷耄覀兙涂梢愿玫乜刂坪妥远x圖像,下面就來詳細(xì)介紹其內(nèi)容,需要的朋友可以參考下2022-02-02