文本分類評價指標F1原理解析
背景:
就是最近接觸的項目是多標簽文本分類類型,然后用bert做的,但是bert的評價標准只有准確率,然后組里大佬說光看准確率是不行的,准確率不能反應數據方面的東西,所以借此機會仔細研究一下F1評價指標。
基本了解
准確率(Accuracy)
准確率,顧名思義求法就是采用預測正確樣本/全部測試樣本,但是這樣有一個缺點:數據不平衡時,無法很好的衡量分類器的好壞。故,我們研究接下來的評價指標F1。
精確率(Precision)
精確率名字與准確率類似,但是二者不同,不同之處也恰巧體現在了“精“
這一字。既然是“精”,則有精益求精的意思,所以他的求法就是被預測為正類的測試樣本中真正是正類的測試樣本(也就是預測正確的正類測試樣本)/ 所有被預測為正類的測試樣本。這就是精確率的求法,個人感覺精確率是衡量預測的好壞。
召回率(Recall)
剛才說精確率是衡量預測的好壞的話,那么召回率就是針對樣本數據而言的。話不多說直接看召回率的求法:被預測為正類的測試樣本中真正是正類的測試樣本(也就是預測正確的正類測試樣本)/ 所有真正的正類測試樣本。就是從所有正類樣本中找回通過分類器之后仍是正類的樣本。
F1-score
Precision和Recall是一對矛盾的度量,一般來說,Precision高時,Recall值往往偏低;而Precision值低時,Recall值往往偏高。當分類置信度高時,Precision偏高;分類置信度低時,Recall偏高。為了能夠綜合考慮這兩個指標,F-measure被提出(Precision和Recall的加權調和平均),即:
F1的核心思想在於,在盡可能的提高Precision和Recall的同時,也希望兩者之間的差異盡可能小。F1-score適用於二分類問題,對於多分類問題,將二分類的F1-score推廣,有Micro-F1和Macro-F1兩種度量。
進階了解
雖然剛才介紹了如何求精確率、召回率、F1-score,但是可能對於如何求還真不知道如何做。所以這里繼續介紹,方便我們更容易求解。
基本概念:
在這里先介紹幾個基本概念
- TP:真正類
- FP:假正類(預測為正,其實為負)
- TN:真負類
- FN:假負類(預測為負,其實為正)
有了這幾個概念就可以將我們剛才介紹的公式更新為:
混淆矩陣:
雖然我們添加了基本概念但是TP、FP、FN 這幾個數值並不好求,但是混淆矩陣恰好可以將這些很好的展示出來。
混淆矩陣是機器學習中總結分類模型預測結果的情形分析表,以矩陣形式將數據集中的記錄按照真實的類別與分類模型預測的類別判斷兩個標准進行匯總。其中矩陣的行表示真實值,矩陣的列表示預測值。
以上這個圖是一個二分類的混淆矩陣,很簡單,TP、FN、FP很容易就看見了。但是要是多分類的話
要是不了解規律就不能直接發現每個類別的TP、FN、FP。
這里在告訴大家如何快速找出我們需要的TP、FN、FP之前,先說一下混淆矩陣的特點:
混淆矩陣的每一列代表了預測類別,每一列的總數表示預測為該類別的數據的數目。
混淆矩陣的每一行代表了數據的真實歸屬類別,每一行的總數表示為該類別的數據實例的數目。
然后說一下我自己總結的規律,這里主要針對多分類而言,二分類顯而易見就不說了:
混淆矩陣的對角線就是TP。
混淆矩陣的每一列之和減去各列在對角線上的數值就是FP。
混淆矩陣的每一行之和減去各行在對角線上的數值就是FN。
以上的經驗就是可以幫助我們快速從混淆矩陣中找到TP、FP、FN。所以接下來獲得混淆矩陣就是我們接下來的關鍵。
這里由於本人太菜,本來想自己實現,但是只實現了二分類的,多分類沒成功,然后成功加入調包俠陣營,真香啊hhh。
sklearn.metrics 適用於F1評價指標介紹
這里主要是針對多標簽和多分類來講
data
# 多分類
y_true = [0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2]
y_pred = [0, 1, 0, 1, 0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2]
# 多標簽
y_true =np.array([[1,1,1,0,0],
[1,0,0,1,1],
[1,0,1,0,1],
[1,1,0,1,1]])
y_pred =np.array([[0,1,1,1,0],
[1,0,0,1,1],
[1,1,0,0,0],
[1,0,1,0,1]])
sklearn.metrics.accuracy_score
功能:計算准確率
多分類:
多標簽:
sklearn.metrics.classification_report
功能:建立一個顯示主要分類指標的文本報告。
多分類:
多標簽:
sklearn.metrics.confusion_matrix
功能:計算混淆矩陣以評估分類的准確性。(只針對多分類和二分類,不包括多標簽)
多分類:
sklearn.metrics.multilabel_confusion_matrix
功能:為每個類別或樣本計算一個混淆矩陣。(特別適合多標簽)
多標簽:
sklearn.metrics.ConfusionMatrixDisplay
功能:混淆矩陣可視化。(多標簽可視化不了)
多分類:
總結
原理這回是明白了,可能還要再想想多標簽的混淆矩陣是個什么原理。然后還是要嘗試一下自己用python去實現一下多分類和多標簽的f1評價指標以及他們的混淆矩陣。