2015-12-17 30 views
5

Bu alanda nispeten yeni biriyim, bu yüzden yardımın için minnettarım. Ben mnist veri kümesinde oynuyorum. Kodu http://g.sweyla.com/blog/2012/mnist-numpy/'dan aldım ama 2 boyutlu olacak şekilde "görüntüler" değiştirdim, böylece her görüntü bir özellik vektörü olacak. Daha sonra veriler üzerinde PCA ve ardından SVM'yi çalıştırdım ve skoru kontrol ettim. Her şey iyi çalışıyor gibi görünüyor, ancak aşağıdaki uyarıyı alıyorum ve neden emin değilim.Neden veri dönüştürme uyarısı alıyorum?

"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()." 

Bazı şeyleri denedim ama bu uyarıdan kurtulacak gibi görünmüyor. Baska öneri? İşte tam kodu (burada kod kopyalama berbat biraz var gibi eksik çentikler görmezden görünüyor): Yardım için

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 

Teşekkür!

cevap

3

Sanırım scikit-learn, y-D dizisi olmasını bekler. Sizin labels değişkeniniz 2-D-labels.shape'dur (N, 1). Uyarı, labels'u 1-D dizisine dönüştürecek olan labels.ravel()'u kullanacağınızı bildirir (N,). Ben yakaladım burada Numpy içinde, bir 1-D dizisi 2 D farklı olduğunu sanırım labels=labels.squeeze()

: labels=labels.reshape((N,))
düşünmek gel, bu nedenle sıkmak çağırarak olacaktır:
Yeniden Şekillendirilmesi da çalışacak Boyutları 1 ile eşit dizi.

+0

Teşekkürler! Bazı nedenlerden dolayı sorunun "görüntüler" dizisiyle olduğundan emin oldum. Bunu düşünmemiştim bile. Aptal ben. Her neyse, daha fazla uyarı yok. Tekrar teşekkürler :) – shmibloo

İlgili konular