2012-04-12 10 views
5

mam jakiś działający kod, który poprawnie wczytuje dane z pliku csv do PyBrain Dataset:PyBrain: Ładowanie danych za pomocą numpy.loadtxt?

def old_get_dataset(): 

    reader = csv.reader(open('test.csv', 'rb')) 

    header = reader.next() 
    fields = dict(zip(header, range(len(header)))) 
    print header 

    # assume last field in csv is single target variable 
    # and all other fields are input variables 
    dataset = SupervisedDataSet(len(fields) - 1, 1) 

    for row in reader: 
     #print row[:-1] 
     #print row[-1] 
     dataset.addSample(row[:-1], row[-1]) 

    return dataset 

Teraz próbuję przepisać ten kod, aby zamiast użyć funkcji loadtxt NumPy użytkownika. Wierzę, że addSample może pobierać numpy tablic zamiast dodawać dane po jednym wierszu naraz.

Zakładając, że moja załadowana tablica numpy ma wymiar m x n, jak przekazać pierwszy zbiór danych m x (n-1) jako pierwszy parametr, a ostatnia kolumna danych jako drugi parametr? To jest to, co usiłuję:

def get_dataset(): 

    array = numpy.loadtxt('test.csv', delimiter=',', skiprows=1) 

    # assume last field in csv is single target variable 
    # and all other fields are input variables 
    number_of_columns = array.shape[1] 
    dataset = SupervisedDataSet(number_of_columns - 1, 1) 

    #print array[0] 
    #print array[:,:-1] 
    #print array[:,-1] 
    dataset.addSample(array[:,:-1], array[:,-1]) 

    return dataset 

Ale ja otrzymuję następujący błąd:

Traceback (most recent call last): 
    File "C:\test.py", line 109, in <module> 
    (d, n, t) = main() 
    File "C:\test.py", line 87, in main 
    ds = get_dataset() 
    File "C:\test.py", line 45, in get_dataset 
    dataset.addSample(array[:,:-1], array[:,-1]) 
    File "C:\Python27\lib\site-packages\pybrain\datasets\supervised.py", 
     line 45, in addSample self.appendLinked(inp, target) 
    File "C:\Python27\lib\site-packages\pybrain\datasets\dataset.py", 
     line 215, in appendLinked self._appendUnlinked(l, args[i]) 
    File "C:\Python27\lib\site-packages\pybrain\datasets\dataset.py", 
     line 197, in _appendUnlinked self.data[label][self.endmarker[label], :] = row 
ValueError: output operand requires a reduction, but reduction is not enabled 

Jak mogę rozwiązać ten problem?

+0

Myślę, że problem może być związany z addSample() spodziewa się 2-wymiarową tablicę dla obu parametrów, jednak mam przechodzącą w 1- tablica wymiarowa. Jestem nieco zdezorientowany, jak uczynić tablicę celów dwuwymiarową, ponieważ istnieje tylko jedna zmienna docelowa na przykład treningowy. – User

Odpowiedz

8

Po dużo eksperymentować i ponowne czytanie dataset documentation, następujące przebiega bezbłędnie:

def get_dataset(): 

    array = numpy.loadtxt('test.csv', delimiter=',', skiprows=1) 

    # assume last field in csv is single target variable 
    # and all other fields are input variables 
    number_of_columns = array.shape[1] 
    dataset = SupervisedDataSet(number_of_columns - 1, 1) 

    print array[0] 
    #print array[:,:-1] 
    #print array[:,-1] 
    #dataset.addSample(array[:,:-1], array[:,-1]) 
    #dataset.addSample(array[:,:-1], array[:,-2:-1]) 
    dataset.setField('input', array[:,:-1]) 
    dataset.setField('target', array[:,-1:]) 

    return dataset 

muszę dokładnie sprawdzić, że robi słusznie.

0

Pisałem trochę funkcji, aby to zrobić

def load_csv(filename, cols, sep = ',', skip = 0): 
    from numpy import loadtxt 
    data = loadtxt(filename, delimiter = sep, usecols = cols, skiprows = skip) 
    return data 
Powiązane problemy