2016-01-26 6 views
3

Я пытаюсь рассчитать True Positive rate ect. бинарной матрицы путаницы и вывод результатов в файл csv.Данные печатаются, но не записываются в dataframe

результатов
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) 

отпечаток показывают, что основные статистики спутанности матрицы вычисляются следующим образом:

210483 
153902 
32845 
10788 

Выхода CSV создает заголовки, но результаты являются пустыми. Что я делаю неправильно?

Update:

print(stats) 

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

просто 'печати (статистика)', чтобы увидеть, что внутри. –

+0

делает 'stats.to_csv (r'C: /out/BinaryStats.csv ', header = True)' work? – EdChum

+0

stats.to_csv (r'C: /out/BinaryStats.csv 'header = True) дает те же результаты. Спасибо за предложение. Я печатал статистику, как предположил Джордж, и информационный кадр пуст. Я не понимаю, почему значение «TP» печатает, но не записывается в dataframe. – kharn

ответ

3

Проблема здесь состоит в том, что вы не можете добавить к ЦФ, как это просто присвоив скалярное значение для нового столбца:

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

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

Вам нужно для построения df с требуемыми значениями в ctor:

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 

ИЛИ добавьте фиктивную строку, а затем код будет работать:

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 

Вы можете уронить фиктивная колонка вызова drop:

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

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

Так почему ваша попытка не удалась, потому что это ваша начальная ДФ была пуста, вы присваиваете новый столбец с скаляр value, скалярное значение будет устанавливать для всех строк для нового столбца это значение. Поскольку у вашего df нет строк, это не удается, поэтому у вас есть пустой df.

Другим способом было бы создать ДХ с одной строки (здесь я ставлю 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

Это работает! Благодаря! – kharn