2016-08-04 96 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)