2015-05-15 8 views
3

Я классифицирую набор изображений, хранящихся как кортежи в файле csv. Правильная матрица путаницы, которую я получаю на терминальном дисплее. Но когда я пишу то же самое conf. матрица в файл, он создает недопустимые символы (32 бит). Вот код-Печать матрицы замешательства в файл создает незаконные символы

from sklearn.metrics import confusion_matrix 
import numpy as np 
import os 
import csv 
from sklearn import svm 
from sklearn import cross_validation 
from sklearn import linear_model 
from sklearn.neighbors import KNeighborsClassifier 
import matplotlib.pyplot as plt 
from sklearn import metrics 
import cPickle 

def prec(num): 
    return "%0.5f"%num 

outfile = open("output/linear_svm_output.txt","a") 

for dim in [20,30,40]: 
    images=[] 
    labels=[] 
    name = str(dim)+"x"+str(dim)+".csv" 
    with open(name,'r') as file: 
     reader = csv.reader(file,delimiter=',') 
     for line in file: 
      labels.append(line[0]) 
      line=line[2:] # Remove the label 
      image=[int(pixel) for pixel in line.split(',')] 
      images.append(np.array(image)) 

    clf = svm.LinearSVC() 

    print clf 
    kf = cross_validation.KFold(len(images),n_folds=10,indices=True, shuffle=True, random_state=4) 
    print "\nDividing dataset using `Kfold()` -:\n\nThe training dataset has been divided into " + str(len(kf)) + " parts\n" 
    for train, test in kf: 
     training_images=[] 
     training_labels=[] 
     for i in train: 
      training_images.append(images[i]) 
      training_labels.append(labels[i]) 
     testing_images=[] 
     testing_labels=[] 
     for i in test: 
      testing_images.append(images[i]) 
      testing_labels.append(labels[i]) 

     clf.fit(training_images,training_labels) 
     predicted = clf.predict(testing_images) 
     print prec(clf.score(testing_images, testing_labels)) 
     outfile.write(prec(clf.score(testing_images, testing_labels))) 
     outfile.write(str(clf)) 
     outfile.write(confusion_matrix(testing_labels, predicted)) 
     print confusion_matrix(testing_labels, predicted) 
#  outfile.write(metrics.classification_report(testing_labels, predicted)) 

    print "\nDividing dataset using `train_test_split()` -:\n" 
    training_images, testing_images, training_labels, testing_labels = cross_validation.train_test_split(images,labels, test_size=0.2, random_state=0) 
    clf = clf.fit(training_images,training_labels) 
    score = clf.score(testing_images,testing_labels) 
    predicted = clf.predict(testing_images) 
    print prec(score) 
    outfile.write(str(clf)) 
    outfile.write(confusion_matrix(testing_labels, predicted)) 
    print confusion_matrix(testing_labels, predicted) 
# outfile.write(metrics.classification_report(testing_labels, predicted)) 

Выход в

file-
302e 3939 3338 374c 696e 6561 7253 5643 
2843 3d31 2e30 2c20 636c 6173 735f 7765 
... 

ответ

2

Использование в следующие распечатать матрицу в файл правильно:

with open(filename, 'w') as f: 
      f.write(np.array2string(confusion_matrix(y_test, pred), separator=', ')) 
+0

Кажется, это более понятная реализация. Так что принимаю :) – goelakash

2

Поскольку outfile.write(confusion_matrix(testing_labels, predicted)) запишет матрицу в формате двоичного. Если вы хотите записать его в читаемый текст человека, попробуйте это, если вы используете Python 2.x

print >> outfile, confusion_matrix(testing_labels, predicted) 

Это просто перенаправить stdout к outfile

+0

Любая идея, что мне нужно делать в случае python3.X –

+0

@PranavWaila Я думаю, что это ответ на ваш вопрос о перенаправлении: http://stackoverflow.com/questions/4675728/redirect-stdout-to-a -file-in-python – goelakash

+0

@PranavWaila I thi nk это должно работать в Python 3: 'print (confusion_matrix (test_labels, предсказано), file = outfile)' – nanoix9