Keras.metrics中的accuracy總結


轉載自:https://zhuanlan.zhihu.com/p/95293440

 

1. 背景

Accuracy(准確率)是機器學習中最簡單的一種評價模型好壞的指標,每一個從事機器學習工作的人一定都使用過這個指標。沒從事過機器學習的人大都也知道這個指標,比如你去向別人推銷一款自己做出來的字符識別軟件,人家一定會問你准確率是多少。准確率聽起來簡單,但不是所有人都能理解得透徹,本文將介紹Keras中accuracy(也適用於Tensorflow)的幾個新“玩法”。

 

2. Keras中的accuracy介紹

Keras.metrics中總共給出了6種accuracy,如下圖所示:

接下來將對這些accuracy進行逐個介紹。

1) accuracy

該accuracy就是大家熟知的最朴素的accuracy。比如我們有6個樣本,其真實標簽y_true為[0, 1, 3, 3, 4, 2],但被一個模型預測為了[0, 1, 3, 4, 4, 4],即y_pred=[0, 1, 3, 4, 4, 4],那么該模型的accuracy=4/6=66.67%。

2) binary_accuracy

binary_accuracy和accuracy最大的不同就是,它適用於2分類的情況。從上圖中可以看到binary_accuracy的計算除了y_true和y_pred外,還有一個threshold參數,該參數默認為0.5。比如有6個樣本,其y_true為[0, 0, 0, 1, 1, 0],y_pred為[0.2, 0.3, 0.6, 0.7, 0.8, 0.1],那么其binary_accuracy=5/6=87.5%。具體計算方法為:1)將y_pred中的每個預測值和threshold對比,大於threshold的設為1,小於等於threshold的設為0,得到y_pred_new=[0, 0, 1, 1, 1, 0];2)將y_true和y_pred_new代入到2.1中計算得到最終的binary_accuracy=87.5%。

3) categorical_accuracy

categorical_accuracy和accuracy也很像。不同的是accuracy針對的是y_true和y_pred都為具體標簽的情況,而categorical_accuracy針對的是y_true為onehot標簽,y_pred為向量的情況。比如有4個樣本,其y_true為[[0, 0, 1], [0, 1, 0], [0, 1, 0], [1, 0, 0]],y_pred為[[0.1, 0.6, 0.3], [0.2, 0.7, 0.1], [0.3, 0.6, 0.1], [0.9, 0, 0.1]],則其categorical_accuracy為75%。具體計算方法為:1)將y_true轉為非onehot的形式,即y_true_new=[2, 1, 1, 0];2)根據y_pred中的每個樣本預測的分數得到y_pred_new=[1, 1, 1, 0];3)將y_true_new和y_pred_new代入到2.1中計算得到最終的categorical_accuracy=75%。

4) sparse_categorical_accuracy

和categorical_accuracy功能一樣,只是其y_true為非onehot的形式。比如有4個樣本,其y_true為[2, 1, 1, 0],y_pred為[[0.1, 0.6, 0.3], [0.2, 0.7, 0.1], [0.3, 0.6, 0.1], [0.9, 0, 0.1]],則其categorical_accuracy為75%。具體計算方法為:1)根據y_pred中的每個樣本預測的分數得到y_pred_new=[1, 1, 1, 0];2)將y_true和y_pred_new代入到2.1中計算得到最終的categorical_accuracy=75%。

5) top_k_categorical_accuracy

在categorical_accuracy的基礎上加上top_k。categorical_accuracy要求樣本在真值類別上的預測分數是在所有類別上預測分數的最大值,才算預測對,而top_k_categorical_accuracy只要求樣本在真值類別上的預測分數排在其在所有類別上的預測分數的前k名就行。比如有4個樣本,其y_true為[[0, 0, 1], [0, 1, 0], [0, 1, 0], [1, 0, 0]],y_pred為[[0.3, 0.6, 0.1], [0.5, 0.4, 0.1], [0.3, 0.6, 0.1], [0.9, 0, 0.1]],根據前面知識我們可以計算得到其categorical_accuracy=50%,但是其top_k_categorical_accuracy是多少呢?答案跟k息息相關。如果k大於或等於3,其top_k_categorical_accuracy毫無疑問是100%,因為總共就3個類別。如果k小於3,那就要計算了,比如k=2,那么top_k_categorical_accuracy=75%。具體計算方法為:1)將y_true轉為非onehot的形式,即y_true_new=[2, 1, 1, 0];2)計算y_pred的top_k的label,比如k=2時,y_pred_new = [[0, 1], [0, 1], [0, 1], [0, 2]];3)根據每個樣本的真實標簽是否在預測標簽的top_k內來統計准確率,上述4個樣本為例,2不在[0, 1]內,1在[0, 1]內,1在[0, 1]內,0在[0, 2]內,4個樣本總共預測對了3個,因此k=2時top_k_categorical_accuracy=75%。說明一下,Keras中計算top_k_categorical_accuracy時默認的k值為5。

6) sparse_top_k_categorical_accuracy

和top_k_categorical_accuracy功能一樣,只是其y_true為非onehot的形式。比如有4個樣本,其y_true為[2, 1, 1, 0],y_pred為[[0.3, 0.6, 0.1], [0.5, 0.4, 0.1], [0.3, 0.6, 0.1], [0.9, 0, 0.1]]。計算sparse_top_k_categorical_accuracy的步驟如下:1)計算y_pred的top_k的label,比如k=2時,y_pred_new = [[0, 1], [0, 1], [0, 1], [0, 2]];2)根據每個樣本的真實標簽是否在預測標簽的top_k內來統計准確率,上述4個樣本為例,2不在[0, 1]內,1在[0, 1]內,1在[0, 1]內,0在[0, 2]內,4個樣本總共預測對了3個,因此k=2時top_k_categorical_accuracy=75%。

 

3. 總結

綜上,keras中的accuracy metric用法很多,大家可以根據自己的實際情況選擇合適的accuracy metric。以下是幾個比較常見的用法:

1) 當你的標簽和預測值都是具體的label index(如y_true=[1, 2, 1], y_pred=[0, 1, 1])時,用keras.metrics.accuracy。

2) 當你的標簽是具體的label index,而prediction是向量形式(如y_true=[1, 2, 1], y_pred=[[0.2, 0.3, 0.5], [0.9, 0.1, 0], [0, 0.4, 0.6]])時,用keras.metrics.sparse_categorical_accuracy。

3)當你的標簽是onehot形式,而prediction是向量形式(如y_true=[[0, 1, 0], [0, 0, 1], [0, 1, 0]], y_pred=[[0.2, 0.3, 0.5], [0.9, 0.1, 0], [0, 0.4, 0.6]])時,用keras.metrics.categorical_accuracy。

當然,還有其他更高級的用法,比如對每個類別的accuracy求平均,或者對每個類別的accuracy進行加權,或者對每個樣本的accuracy進行加權等,不在本文的討論范圍,大家有興趣可以去參考Tensorflow或者Keras的官方文檔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM