2016-01-26 4 views
3

J'essaie de calculer l'ect du taux positif vrai. d'une matrice de confusion binaire et affiche les résultats dans un fichier csv.Les données sont imprimées, mais n'écrivent pas dans la trame

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import csv 
from sklearn.metrics import confusion_matrix 



AllBinary = pd.read_csv('BinaryData.csv') 


y_test = AllBinary['Binary_ac'] 
y_pred = AllBinary['Binary_pred'] 

cm = confusion_matrix(y_test, y_pred) 

stats = pd.DataFrame() 

TP = cm[0][0] 
FP = cm[0][1] 
FN = cm[1][0] 
TN = cm[1][1] 

stats['TruePositive'] = TP 
stats['TrueNegative'] = TN 
stats['FalsePositive'] = FP 
stats['FalseNegative'] = FN 

print(TP) 
print(TN) 
print(FP) 
print(FN) 

stats.to_csv('C:/out/' + 'BinaryStats' + '.csv', header = True) 

Les résultats d'impression montrent que les statistiques de la matrice de confusion de base sont calculés comme suit:

210483 
153902 
32845 
10788 

La sortie csv crée les titres, mais les résultats sont vides. Que fais-je incorrectement?

Mise à jour:

print(stats) 

Empty DataFrame 
Columns: [TruePositive, TrueNegative, Falsepositive, FalseNegative] 
+0

Juste 'impression (statistiques)' pour voir ce qui est à l'intérieur. –

+0

fait 'stats.to_csv (r'C: /out/BinaryStats.csv ', header = True)' travail? – EdChum

+0

stats.to_csv (r'C: /out/BinaryStats.csv 'en-tête = True) donne les mêmes résultats. Merci pour la suggestion. J'ai imprimé les statistiques comme George a suggéré, et le dataframe est vide. Je ne comprends pas pourquoi la valeur 'TP' s'imprime, mais n'écrit pas dans la base de données. – kharn

Répondre

3

Le problème ici est que vous ne pouvez pas ajouter à un df comme celui-ci en attribuant simplement une valeur scalaire à une nouvelle colonne:

In [55]: 
stats = pd.DataFrame() 
stats['TruePositive'] = 210483 
stats 

Out[55]: 
Empty DataFrame 
Columns: [TruePositive] 
Index: [] 

Vous aurez besoin pour construire la df avec les valeurs souhaitées dans le cteur:

In [62]: 
TP = 210483 
FP = 153902 
FN = 32845 
TN = 10788 
stats = pd.DataFrame({'TruePositive':[TP], 'TrueNegative':[TN], 'FalsePositive':[FP], 'FalseNegative':[FN]}) 
stats 

Out[62]: 
    FalseNegative FalsePositive TrueNegative TruePositive 
0   32845   153902   10788  210483 

OU ajouter une ligne fictive, puis votre code travaillera:

In [71]: 
stats = pd.DataFrame() 
stats = stats.append(pd.Series('dummy'), ignore_index=True) 
stats['TruePositive'] = TP 
stats['TrueNegative'] = TN 
stats['FalsePositive'] = FP 
stats['FalseNegative'] = FN 
stats 

Out[71]: 
     0 TruePositive TrueNegative FalsePositive FalseNegative 
0 dummy  210483   10788   153902   32845 

Vous pouvez alors déposer la colonne factice appelant drop:

In [72]: 
stats.drop(0, axis=1) 

Out[72]: 
    TruePositive TrueNegative FalsePositive FalseNegative 
0  210483   10788   153902   32845 

Alors pourquoi votre tentative a échoué parce que votre df initiale était vide, vous assignez une nouvelle colonne avec un scalaire valeur, la valeur scalaire définit toutes les lignes de la nouvelle colonne sur cette valeur. Comme votre df n'a pas de lignes, cela échoue, c'est pourquoi vous avez une df vide.

Une autre façon serait de créer la df avec une seule ligne (ici je mets NaN):

In [77]: 
stats = pd.DataFrame([np.NaN]) 
stats['TruePositive'] = TP 
stats['TrueNegative'] = TN 
stats['FalsePositive'] = FP 
stats['FalseNegative'] = FN 
stats.dropna(axis=1) 

Out[77]: 
    TruePositive TrueNegative FalsePositive FalseNegative 
0  210483   10788   153902   32845 
+0

Cela fonctionne! Merci! – kharn