从混淆矩阵中计算每一类的分类精度,Recall或Sensitivity,Positive predictive value (PPV),speciall----python实现

五迷三道 提交于 2019-12-18 04:05:11

**在两类情况下的混淆矩阵,摘自维基百科**
我们接下来使用sklearn.metrics 提供的混淆矩阵的计算

from sklearn.metrics import confusion_matrix #引用方式
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
confusion_matrix(y_true, y_pred)#官方提供的示例代码

然后就得到了多类别的混淆矩阵,其实多类别和二类别的混淆矩阵只是在计算一些变量的时候复杂
多类别混淆矩阵计算方式,引用【1】
实现代码如下,分别计算 Recall或Sensitivity,Positive predictive value (PPV),speciall,其实这个是改变自https://blog.csdn.net/u012193416/article/details/79454351,但是他错了,导致我前几次都算错了,所以我才写了这一篇更正一下,我也提醒了这位博主。

confusion = confusion_matrix(y_true, y_pred)
print(confusion)
list_diag = np.diag(confusion)
print('list_diag=', list_diag)
list_raw_sum = np.sum(confusion, axis=1)
print('list_raw_sum=', list_raw_sum)
each_sensitivity = (np.nan_to_num(list_diag.astype('Float32') / list_raw_sum.astype('Float32'))) * 100
 each_sensitivity = np.around(each_acc, decimals=2)
 print('each_sensitivity=', each_sensitivity)
 ave_acc = np.mean(each_sensitivity)
 print('each_sensitivity=', each_sensitivity)

    #cofus.append(each_acc)
    # cofus.append('\n')
list_col_sum = np.sum(confusion, axis=0)
    # print('list_raw_sum=',list_raw_sum)
    each_ppv = (np.nan_to_num(list_diag.astype('Float32') / list_col_sum.astype('Float32'))) * 100
    each_ppv = np.around(each_se, decimals=2)
    print('each_ppv=', each_ppv)
    # ave_acc=np.mean(each_acc)
    # print('ave_acc=',ave_acc)

    #cofus.append(each_se)
    # cofus.append('\n')

    list_fp = list_raw_sum - list_diag
    print("list_fp", list_fp)
    for i in range(len(list_fp)):
        print(i)
        new_a = np.delete(list_diag, i)
        print(np.sum(new_a))
        m = (np.nan_to_num(np.sum(new_a) / (np.sum(new_a) + list_fp[i]))) * 100
        m = np.around(m, decimals=2)
        print("special", m)

然后计算每一类的精度,这个要和二类分开,此处的精度等于Positive predictive value,而是要单独计算
计算每一类精度的示意图【2】
我们从上面图得到信息有accracy的计算方式,而对于每一类的acc计算我们只需这样算。

  1. TP+TN是对角线的数相加,这个在每一类都不会变,就是计算每一类的分子都不会变
  2. 每一类的精度不同的是每一类的分母,我们可以把计算的那个类当做正类,其余都是负类,这样我们就回到了二分类的问题上
  3. 假如我们计算的是S类,那么它的TP是2526,TN=89944=6941+723+14(就是除了TP之外的对角线数相加),FP我们从第一张图得知它对应位置和含义是本来是负类却被预测为正类,所以就是S类除了对角线哪一行FP=250+4+1=255,FN同理=68+2+1+0=71。
  4. 这样根据accracy的计算方式得出S类的精度为100148/100474=0.9968

【1】 De Chazal, Philip, Maria O’Dwyer, and Richard B. Reilly. “Automatic classification of heartbeats using ECG morphology and heartbeat interval features.” IEEE transactions on biomedical engineering 51.7 (2004): 1196-1206.
【2】Sellami, Ali, and Heasoo Hwang. “A robust deep convolutional neural network with batch-weighted loss for heartbeat classification.” Expert Systems with Applications 122 (2019): 75-84

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!