我在使用Scikit-learn,需要从如下混淆矩阵中计算真阳性(TP)、假阳性(FP)、真负性(TN)和假负性(FN):
[[2 0 3 4] [0 4 5 1] [1 0 3 2] [5 0 0 4]]
我知道如何计算TP、FP和FN,但不知道如何计算TN。谁能告诉我?
回答:
我认为你应该以一对多的方式处理这个多类分类问题(因此,每个2×2表i
测量的是一个二元分类问题的表现,即每个观测值是否属于标签i
)。因此,你可以为每个单独的标签计算TP、FP、FN、TN。
import numpy as npconfusion_matrix = np.array([[2,0,3,4], [0,4,5,1], [1,0,3,2], [5,0,0,4]])def process_cm(confusion_mat, i=0, to_print=True): # i表示选择哪个类别进行一对多计算 # 行表示实际观测值,列表示预测值 TP = confusion_mat[i,i] # 正确标记为i FP = confusion_mat[:,i].sum() - TP # 错误标记为i FN = confusion_mat[i,:].sum() - TP # 错误标记为非i TN = confusion_mat.sum().sum() - TP - FP - FN if to_print: print('TP: {}'.format(TP)) print('FP: {}'.format(FP)) print('FN: {}'.format(FN)) print('TN: {}'.format(TN)) return TP, FP, FN, TNfor i in range(4): print('计算标签{}的2x2列联表'.format(i)) process_cm(confusion_matrix, i, to_print=True)计算标签0的2x2列联表TP: 2FP: 6FN: 7TN: 19计算标签1的2x2列联表TP: 4FP: 0FN: 6TN: 24计算标签2的2x2列联表TP: 3FP: 8FN: 3TN: 20计算标签3的2x2列联表TP: 4FP: 7FN: 5TN: 18