2015-12-17 17 views
5

Sono un neo novellino in questo settore, quindi gradirei il vostro aiuto. Sto giocando con il set di dati di mnist. Ho preso il codice da http://g.sweyla.com/blog/2012/mnist-numpy/ ma ho cambiato "immagini" per essere bidimensionale in modo che ogni immagine fosse un vettore di funzionalità. Poi ho eseguito PCA sui dati e poi SVM e controllato il punteggio. Tutto sembra funzionare bene, ma sto ricevendo il seguente avviso e non sono sicuro del perché.Perché ricevo un avviso di conversione dati?

"DataConversionWarning: A column-vector y was passed when a 1d array was expected.\ 
Please change the shape of y to (n_samples,), for example using ravel()." 

Ho provato diverse cose ma non riesco a liberarmi di questo avviso. Eventuali suggerimenti? Ecco il codice completo (ignorare le rientranze mancanti, sembra hanno ottenuto un po 'incasinato copiare il codice qui):

import os, struct 
from array import array as pyarray 
from numpy import append, array, int8, uint8, zeros, arange 
from sklearn import svm, decomposition 
#from pylab import * 
#from matplotlib import pyplot as plt 

def load_mnist(dataset="training", digits=arange(10), path="."): 
""" 
Loads MNIST files into 3D numpy arrays 

Adapted from: http://abel.ee.ucla.edu/cvxopt/_downloads/mnist.py 
""" 

    if dataset == "training": 
     fname_img = os.path.join(path, 'train-images.idx3-ubyte') 
     fname_lbl = os.path.join(path, 'train-labels.idx1-ubyte') 
    elif dataset == "testing": 
     fname_img = os.path.join(path, 't10k-images.idx3-ubyte') 
     fname_lbl = os.path.join(path, 't10k-labels.idx1-ubyte') 
    else: 
     raise ValueError("dataset must be 'testing' or 'training'") 

    flbl = open(fname_lbl, 'rb') 
    magic_nr, size = struct.unpack(">II", flbl.read(8)) 
    lbl = pyarray("b", flbl.read()) 
    flbl.close() 

    fimg = open(fname_img, 'rb') 
    magic_nr, size, rows, cols = struct.unpack(">IIII", fimg.read(16)) 
    img = pyarray("B", fimg.read()) 
    fimg.close() 

    ind = [ k for k in range(size) if lbl[k] in digits ] 
    N = len(ind) 

    images = zeros((N, rows*cols), dtype=uint8) 
    labels = zeros((N, 1), dtype=int8) 
    for i in range(len(ind)): 
     images[i] = array(img[ ind[i]*rows*cols : (ind[i]+1)*rows*cols ]) 
     labels[i] = lbl[ind[i]] 

    return images, labels 

if __name__ == "__main__": 
    images, labels = load_mnist('training', arange(10),"path...") 
    pca = decomposition.PCA() 
    pca.fit(images) 
    pca.n_components = 200 
    images_reduced = pca.fit_transform(images) 
    lin_classifier = svm.LinearSVC() 
    lin_classifier.fit(images_reduced, labels) 
    images2, labels2 = load_mnist('testing', arange(10),"path...") 
    images2_reduced = pca.transform(images2) 
    score = lin_classifier.score(images2_reduced,labels2) 
    print score 

Grazie per l'aiuto!

risposta

3

Penso che scikit-learn si aspetta che sia un array 1-D. La variabile labels è 2-D - labels.shape è (N, 1). L'avviso indica di utilizzare labels.ravel(), che trasformerà labels in un array 1-D, con una forma di (N,).
Rimodellare lavorerà anche: labels=labels.reshape((N,))
Vieni a pensarci bene, così si chiama squeeze: labels=labels.squeeze()

Credo che la Gotcha qui è che in NumPy, una matrice 1-D è diverso da un 2-D array con una delle sue dimensioni pari a 1.

+0

Grazie! Per qualche ragione ero sicuro che il problema fosse con la matrice "images". Non ci ho nemmeno pensato. Silly me. Comunque, niente più avvertimenti. Grazie ancora :) – shmibloo

Problemi correlati