从python中的混淆矩阵计算精度和回忆

时间:2016-08-04 16:45:40

标签: python pandas matrix

我有2个类的混淆矩阵,其中预先计算的总数采用pandas数据帧格式:

    Actual_class  Predicted_class_0  Predicted_class_1  Total  
0         0              39                 73           112   
1         1              52                561           613          
2        All             91                634           725        

我需要使用循环来计算精度和召回,因为我需要更多类的一般案例解决方案。

0级的精度为39/91,1级的精度为561/634 召回0级将是39/112,而1级则是561/613。

所以我需要按对角线和总计迭代才能得到以下结果

    Actual_class  Predicted_class_0  Predicted_class_1  Total Precision Recall  
0         0              39                 73           112     43%     35%
1         1              52                561           613     88%     92%     
2        All             91                634           725    

总计(所有行和总列)将在词后删除,因此没有必要计算它们。

我尝试了以下代码,但它不是通过对角线而丢失了0类的数据:

cols = [c for c in cross_tab.columns if c.lower()[:4] == 'pred'] 

for c in cols:  
    cross_tab["Precision"] = cross_tab[c]/cross_tab[c].iloc[-1]

for c in cols:  
    cross_tab["Recall"] = cross_tab[c]/cross_tab['Total']

我是pandas矩阵操作的新手,真的需要你的帮助。

我确信有一种方法可以在不预先计算总数的情况下继续进行。

非常感谢!!!

1 个答案:

答案 0 :(得分:0)

我找到了使用numpy对角线的解决方案:

import numpy as np  
cols = [c for c in cross_tab.columns if c.lower()[:4] == 'pred' or c == 'Total'] 

denomPrecision=[]
for c in cols:
    denomPrecision.append(cross_tab[c].iloc[-1])

diag = np.diagonal(cross_tab.values,1)

cross_tab["Precision"] = np.round(diag.astype(float)/denomPrecision*100,1)

cross_tab["Recall"] = np.round(diag.astype(float)/cross_tab.Total*100,1)
相关问题