我有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矩阵操作的新手,真的需要你的帮助。
我确信有一种方法可以在不预先计算总数的情况下继续进行。
非常感谢!!!
答案 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)