2016-08-04 93 views
0

我有2类与预先计算的总计在大熊猫数据帧格式的混淆矩阵:计算精度和调出从混淆矩阵在python

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'] 

我新手大熊猫矩阵运算,真正需要你的帮助。

我确定有一种方法可以不预先计算总数。

非常感谢!

回答

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)