假設標籤:a,b,c,d,e
對於標籤a:正=a,負=其他(b,c,d,e)
TP:實際=正,預測=正(true positives)
(預測=a 且 實際=a 的個數;a被判定爲a)
FP:實際=負,預測=正
(預測=a 情況下,實際=b, c, d, e 的個數;其他被判定爲a)
FN:實際=正,預測=負(false negatives)
(實際=a 情況下,預測=b, c, d, e 的個數;a被判定爲其他))
TN:實際=負,預測=負
(其他被判定爲其他,且正確,如b判定爲b)
有14個數據需要預測
序號 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
實際 y_real | b | b | b | b | b | c | c | c | c | d | d | d | e | e |
預測 y_pred | b | b | b | a | a | c | c | d | d | d | e | d | e | d |
計算:
數量 | a | b | c | d | e | sum |
---|---|---|---|---|---|---|
TP | 0 | 3 | 2 | 2 | 1 | 8 |
FP | 2 | 0 | 0 | 3 | 1 | 6 |
FN | 0 | 2 | 2 | 1 | 1 | 6 |
TN | ? | ? | ? | ? | ? | ? |
注:
- PN(a)= b判定爲b + c判定爲c +…= 8(除了a)
- ? FN(a) + TP(a) = 實際a的個數 (y_real)
? TN(a) + FP(a) =實際其他的個數 (y_real),除了a
? FN(a) + TP(a) + TN(a) + FP(a)= 數據總個數 = 14
Precision = TP / (TP + FP) = 8/(8+6)
Recall = TP / (TP + FN) = 8/(8+6)
F1 = 2*(P*R)/(P+R) = …
擴展:
tensorflow 中的混淆矩陣:confusion_matrix,矩陣cm
實際 \ 預測 (數量) | a | b | c | d | e |
---|---|---|---|---|---|
a | 0 | 0 | 0 | 0 | 0 |
b | 2 | 3 | 0 | 0 | 0 |
c | 0 | 0 | 2 | 2 | 0 |
d | 0 | 0 | 0 | 2 | 1 |
e | 0 | 0 | 0 | 1 | 1 |
注:
4. cm[0][0] : 實際=a,預測=a的個數
5. cm表格中的總數 = 數據個數 = 14
6. TP = 對角線之和
FP = 第一列(除了[a][a])之和+ 第二列(除了[b][b])之和+… = 2+0+0+3+1=6
FN = 第一行(除了[a][a])之和+第二行(除了[b][b])之和+… = 0+2+2+1+1=6
https://www.cnblogs.com/techengin/p/8962024.html
#coding:utf-8
from sklearn.metrics import confusion_matrix
import numpy
# 0,1,2,3,4
# a,b,c,d,e
# b b b b b c c c c d d d e e
y_true = [1,1,1,1,1, 2,2,2,2,3, 3,3,4,4]
# b b b a a c c d d d e d e d
y_pred = [1,1,1,0,0, 2,2,3,3,3, 4,3,4,3]
cm = confusion_matrix(y_true, y_pred,labels=[0,1,2,3,4])
print(cm)
# print(type(cm)) # <class 'numpy.ndarray'>
# if cm = 2*2,即二分類
# TP = cm[0][0]
# FP = cm[0][1]
# FN = cm[1][0]
# TN = cm[1][1]
# tn, fp, fn, tp = cm.ravel()