2014-04-29 14 views
8

Sto lavorando al seguente codice per l'esecuzione di Classificazione foresta casuale su treno e set di test;"Ottenuto 1 colonne invece di ..." errore in numpy

from sklearn.ensemble import RandomForestClassifier 
from numpy import genfromtxt, savetxt 

def main(): 
    dataset = genfromtxt(open('filepath','r'), delimiter=' ', dtype='f8') 
    target = [x[0] for x in dataset] 
    train = [x[1:] for x in dataset] 
    test = genfromtxt(open('filepath','r'), delimiter=' ', dtype='f8') 

    rf = RandomForestClassifier(n_estimators=100) 
    rf.fit(train, target) 
    predicted_probs = [[index + 1, x[1]] for index, x in enumerate(rf.predict_proba(test))] 

    savetxt('filepath', predicted_probs, delimiter=',', fmt='%d,%f', 
      header='Id,PredictedProbability', comments = '') 

if __name__=="__main__": 
    main() 

Tuttavia, durante l'esecuzione viene visualizzato il seguente errore;

---->  dataset = genfromtxt(open('C:/Users/Saurabh/Desktop/pgm/Cora/a_train.csv','r'), delimiter='', dtype='f8') 

ValueError: Some errors were detected ! 
    Line #88 (got 1435 columns instead of 1434) 
    Line #93 (got 1435 columns instead of 1434) 
    Line #164 (got 1435 columns instead of 1434) 
    Line #169 (got 1435 columns instead of 1434) 
    Line #524 (got 1435 columns instead of 1434) 
... 
... 
... 

Qualche suggerimento su come evitarlo ?? Grazie.

risposta

2

Hai troppe colonne in una delle tue righe. Ad esempio

>>> import numpy as np 
>>> from StringIO import StringIO 
>>> s = """ 
... 1 2 3 4 
... 1 2 3 4 5 
... """ 
>>> np.genfromtxt(StringIO(s),delimiter=" ") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.6/site-packages/numpy/lib/npyio.py", line 1654, in genfromtxt 
    raise ValueError(errmsg) 
ValueError: Some errors were detected ! 
    Line #2 (got 5 columns instead of 4) 
+0

possiamo ottenere questo risultato se il numero di colonne non è uguale? –

7

genfromtxt darà questo errore se il numero di colonne è disuguale.

posso pensare di 3 modi intorno ad esso:

1. Usare il usecols parametri

np.genfromtxt('yourfile.txt',delimiter=',',usecols=np.arange(0,1434)) 

Tuttavia - questo può significare che si perde alcuni dati (in cui le righe di lunghezza superiore a 1434 colonne) - se ciò che conta è o meno per te.

2. Regolare il file di dati di input in modo che abbia un numero uguale di colonne.

3. Usare qualcosa di diverso genfromtxt:

............. like this

1

ho avuto questo errore. La causa era una singola voce nei miei dati che aveva uno spazio. Ciò gli ha fatto vedere come una riga in più. Assicurati che tutta la spaziatura sia coerente in tutti i dati.

1

Sembra che l'intestazione che include i nomi delle colonne abbia una colonna in più rispetto ai dati stessi (1435 colonne sull'intestazione rispetto a 1434 sui dati).

Si potrebbe o:

1) Elimina 1 colonna dalla intestazione che non ha senso con dati

O

2) Utilizzare l'intestazione benna dal genfromtxt() ad esempio , np.genfromtxt('myfile', skip_header=*how many lines to skip*, delimiter=' ') ulteriori informazioni disponibili nello documentation.

0

Avevo anche questo errore quando stavo anche cercando di caricare un set di dati di testo con genfromtext e fare la classificazione del testo con Keras.

Il formato di dati era: [some_text]\t[class_label]. La mia comprensione è che ci sono alcuni caratteri nella prima colonna che in qualche modo confondono il parser e le due colonne non possono essere suddivise correttamente.

data = np.genfromtxt(my_file.csv, delimiter='\t', usecols=(0,1), dtype=str); 

questo frammento ha creato lo stesso ValueError con la vostra e la mia prima soluzione era quello di leggere tutto come una colonna:

data = np.genfromtxt(my_file, delimiter='\t', usecols=(0), dtype=str); 

e dividere i dati in seguito da me.

Tuttavia, ciò che ha funzionato correttamente è stato definire esplicitamente il parametro di commento in genfromtxt.

data = np.genfromtxt(my_file, delimiter='\t', usecols=(0,1), dtype=str, comments=None); 

Secondo la documentazione:

commenta L'argomento opzionale viene utilizzato per definire una stringa di caratteri che segna l'inizio di un commento. Per impostazione predefinita, genfromtxt assume commenti = '#'. L'indicatore di commento può comparire in qualsiasi punto della linea. Qualsiasi carattere presente dopo il/i marcatore/i commenti viene semplicemente ignorato.

il carattere predefinito che indica un commento è '#', e quindi se questo carattere è incluso nella colonna di testo, tutto viene ignorato dopo di esso. Questo è probabilmente il motivo per cui le due colonne non possono essere riconosciute da genfromtext.

Problemi correlati