一、classification_report簡介
def classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False)
print(classification_report(testY, predictions))
該函數就是在進行了分類任務之後通過輸入原始真實數據(y_true)和預測數據(y_pred)而得到的分類報告,常常用來觀察模型的好壞,如利用f1-score進行評判
它的輸出是類似下面這樣的(該輸出結果爲對mnist手寫數字的分類,共有10類):
precision recall f1-score support
0 1.00 1.00 1.00 44
1 0.94 0.98 0.96 48
2 0.98 0.98 0.98 44
3 1.00 0.89 0.94 44
4 0.92 1.00 0.96 56
5 0.93 0.96 0.95 57
6 0.98 0.96 0.97 48
7 1.00 1.00 1.00 42
8 0.94 0.91 0.92 33
9 0.97 0.91 0.94 34
accuracy 0.96 450
macro avg 0.97 0.96 0.96 450
weighted avg 0.96 0.96 0.96 450
二、各分類指標的含義
要想知道這些數據是怎麼算出來的,要先了解一下幾個常見的模型評價術語,現在假設我們的分類目標只有兩類,計爲正例或陽例(positive)和負例或陰例(negtive)分別是:
(1)True positives(TP): 被正確地劃分爲正例的個數,即實際爲正例且被分類器劃分爲正例的實例數(樣本數);
(2)False positives(FP): 被錯誤地劃分爲正例的個數,即實際爲負例但被分類器劃分爲正例的實例數;
(3)False negatives(FN):被錯誤地劃分爲負例的個數,即實際爲正例但被分類器劃分爲負例的實例數;
(4)True negatives(TN): 被正確地劃分爲負例的個數,即實際爲負例且被分類器劃分爲負例的實例數。
實 際 類 別 |
預測類別 | |||
是 | 否 | 總計 | ||
是 | TP | FN | P(實際上爲該類的) | |
否 | FP | TN | N(實際上不是該類的) | |
P‘被分類器分爲屬於該類的 | N’被分類器分爲不屬於該類的 | P+N |
要注意P = TP + FN 而不是 TP+FP
1.精確率(precision)
precision = TP / ( TP + FP )
精確率是精確性的指標,表示被分類器正確分爲正例的個數(TP)佔被分類器分爲正例的樣本(TP+FP)的比重。
2.召回率(recall)
recall = TP / ( TP + FN ) = TP / P
召回率是覆蓋面的度量,也就是被分類器正確分爲正例的個數(TP)佔原始數據中全部正例(TP+FN)的比重。
如果有些難理解,可以看一下下面這張圖:
上面relevant elements 可以理解成屬於該類的,右半部分就是不屬於該類的,其中TP = 5 , FN = 7,FP = 3 ,TN = 7
所以 precision =TP / ( TP + FP ) = 5/(5+3) = 0.625
recall =TP / ( TP + FN )= 5/(5+7) = 0.417
3.F1 score
也稱爲F-beta score
只有當P和R都很高的時候,F1纔會高,所以稱爲調和平均數,F1的取值範圍是0到1
按照前面的數值 F1 = 0.50
4.support
支持度,是指原始的真實數據中屬於該類的個數
5.accuracy
準確率,這個跟精確率只有一字之差,但實際上有很大的不同,它是指正確分類(不管是正確分爲P還是N)的比率
accuray = (TP + TN) / (TP + FP + TN + FN ) = (TP + TN) / (P+N)
事實上從字面上看accuray和f1一樣都可以作爲一個指標評判整個模型,但是accruracy存在一個bug,當數據嚴重不均衡時, accuracy不起作用,比如我們看X光片,真實數據是:99%都是無病的,只有1%是有病的,假設一個分類器只要給它一張X 光片,它就判定是無病的,那麼它的準確率也有99%,乍看很高,然而這個模型根本就不work。
6.宏平均(macro avg)和微平均(micro avg)
比如不同類別對於precision的宏平均是將各類的precision先算好再對它們求算術平均。
而對於precision的微平均是將所有類中中真陽例先加起來,再除以所有類中的(真陽例+假陽例)。下面是一個例子:
第一類
TP1= 12,FP1=9,FN1=3
Then precision (P1) and recall (R1) will be 57.14 and 80
第二類
TP2= 50,FP2=23 ,FN2=9
Then precision (P2) and recall (R2) will be 68.49 and 84.75
宏平均
Macro-average precision = (P1+P2)/2 = (57.14+68.49)/2 = 62.82
Macro-average recall = (R1+R2)/2 = (80+84.75)/2 = 82.25
微平均
Micro-average of precision = (TP1+TP2)/(TP1+TP2+FP1+FP2) = (12+50)/(12+50+9+23) = 65.96
Micro-average of recall = (TP1+TP2)/(TP1+TP2+FN1+FN2) = (12+50)/(12+50+3+9) = 83.78
微平均在classification_report中只有在多標籤分類的時候纔會顯示,多標籤不是指多個類,而是一個樣本可能屬於兩個或以上的類。
7.加權平均(weighted avg)和樣本平均(sample avg)
(1)加權平均(weighted avg):加上每個類的權重,即它的support的大小
精確度P的weighted avg = (P1 * support1 + P2 * support2) / (support1+support2)
(2)樣本平均(sample avg):跟微平均一樣,僅在多標籤分類時顯示
三、其他評判指標
(1)靈敏度(sensitive)
sensitive = TP/P,表示的是所有正例中被分對的比例,衡量了分類器對正例的識別能力,可以看到召回率與靈敏度是一樣的。
(2)特效度(specificity)
specificity = TN/N,表示的是所有負例中被分對的比例,衡量了分類器對負例的識別能力;
參考資料:
https://en.wikipedia.org/wiki/Precision_and_recall
https://en.wikipedia.org/wiki/F1_score