2016-08-04 40 views
0

I eine Konfusionsmatrix für 2 Klassen mit vorher berechneten Summen in einem pandas Datenrahmen-Format haben:Berechnung Präzision und Recall aus Konfusionsmatrix in 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   

Ich benötige Genauigkeit zu berechnen, und erinnern an eine Schleife als I unter Verwendung von benötigen eine allgemeine Falllösung für mehr Klassen.

Präzision für Klasse 0 wäre 39/91 und für Klasse 1 wäre 561/634.
Rückruf für Klasse 0 wäre 39/112 und für Klasse 1 wäre 561/613.

Also muss ich durch diagonale und Summen zu durchlaufen die folgenden Ergebnisse

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  

Totals (Alle Zeile und Spalte Gesamt) erhalten wird anschliessend entfernt werden, so gibt es keinen Grund, sie zu berechnen.

Ich habe versucht, den folgenden Code, aber es geht nicht durch diagonale und verliert Daten für die Klasse 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'] 

Ich bin Anfänger zu Pandas Matrix-Operationen und brauchen Ihre Hilfe wirklich.

Ich bin mir sicher, dass es eine Möglichkeit gibt, fortzufahren, ohne vorher Summen zu berechnen.

Vielen Dank !!!

Antwort

0

fand ich eine Lösung mit numpy Diagonale:

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)