1

Ich arbeite an Assignment 3: Regularization. Nach einem Blick in diese Github, habe ich versucht, die Zuordnung zu lösen, aber ich bekomme einen Laufzeitfehler. Beachten Sie, dass ich eine kleinere Größe des Datasets ausgewählt habe als den Link.Udacity: Aufgabe 3: ValueError: falsche Eingabeform (1000, 10)

Dies ist die Situation:

print('Training set', train_dataset.shape, train_labels.shape) 
print('Validation set', valid_dataset.shape, valid_labels.shape) 
print('Test set', test_dataset.shape, test_labels.shape) 
#Training set (20000, 784) (20000, 10) 
#Validation set (1000, 784) (1000, 10) 
#Test set (1000, 784) (1000, 10) 

und hier ist das Problem:

from sklearn.linear_model import LogisticRegression 

original_train_labels = train_labels 

logit_clf = LogisticRegression(penalty='l2') 
logit_clf.fit(train_dataset[:1000,:], original_train_labels[:1000]) 

, die bei der Ausführung gibt:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-12-4888dc0bbc75> in <module>() 
     4 
     5 logit_clf = LogisticRegression(penalty='l2') 
----> 6 logit_clf.fit(train_dataset[:1000,:], original_train_labels[:1000]) 
     7 predicted = logit_clf.predict(test_dataset) 
     8 print('accuracy', accuracy((np.arange(num_labels) == predicted[:,None]).astype(np.float32), test_labels), '%') 

/usr/local/lib/python2.7/dist-packages/sklearn/linear_model/logistic.pyc in fit(self, X, y, sample_weight) 
    1140 
    1141   X, y = check_X_y(X, y, accept_sparse='csr', dtype=np.float64, 
-> 1142       order="C") 
    1143   check_classification_targets(y) 
    1144   self.classes_ = np.unique(y) 

/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.pyc in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator) 
    513       dtype=None) 
    514  else: 
--> 515   y = column_or_1d(y, warn=True) 
    516   _assert_all_finite(y) 
    517  if y_numeric and y.dtype.kind == 'O': 

/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.pyc in column_or_1d(y, warn) 
    549   return np.ravel(y) 
    550 
--> 551  raise ValueError("bad input shape {0}".format(shape)) 
    552 
    553 

ValueError: bad input shape (1000, 10) 

Irgendeine Idee, wie man dieses Problem beheben?

+0

http://stackoverflow.com/questions/31306390/sklearn-classifier-get-valueerror-bad-input-shape –

+0

Hmm dank @MosesKoledoye, aber Ich verstehe nicht genau, wie ich mein Problem mit diesem Link lösen soll (verzeihe meine Unwissenheit). Kannst du helfen? :) – gsamaras

+0

Die Form Ihrer Ausgabe ist wahrscheinlich unpassend. Können Sie 'original_train_labels.shape' drucken? –

Antwort

1

Sie verwenden die Ein-Hot-Codierung für train_labels. Das heißt, es hat eine Form wie [1000. 10], 1000 Proben und jede hat 10 'Spalten', wobei 1 angibt, um welche Klasse es sich handelt. Es ist für neuronale Netze erforderlich, aber Logistic Regression von sklearn requires es von Form [1000, 1], was bedeutet, dass es nur ein Vektor von 1000 Zeilen sein sollte und in jeder Zeile sollten Sie ein int haben, die Zielklasse angibt. Konvertiere Ein-Hot-Encoding in Integer mit Argmax-Funktion und Du solltest alles einstellen.

1

Maxim Haytovich ist richtig, die Form Ihrer train_labels hat sich geändert, Sie sollten eine Kopie Ihrer Bahnetiketten behalten, bevor Sie sie zu (20000, 10) umformatieren. Anfangs hat train_labels eine Form von (20000,), die ein Vektor mit Klassenlabelwerten wie [1 2 4 3 ..] ist. Logistische Regression erfordert diese Klassenbeschriftungen.

Wenn Sie mit train_dataset, train_labels = reformat(train_dataset, train_labels) umformatieren die train_labels werden (20000,10) wo frühere [1 2 4 3 ...][[1 0 0 0 0 ...], [0 1 0 0 ...], [0 0 0 1 0 ...], ...] wird, die für neuronale Netz benötigt wird, aber nicht mit der logistischen Regression arbeiten.

Dann haben Sie original_train_labels = train_labels zugewiesen, das heißt original_train_labels hat die gleiche Form von (20000, 10). So erhalten Sie Value Error für falsche Form von Klassenbezeichnungen. Sie müssen den Schritt original_train_labels = train_labels vor train_dataset, train_labels = reformat(train_dataset, train_labels) ausführen. Überprüfen Sie die Reihenfolge der Schritte unten und korrigieren Sie den Code entsprechend gsamaras

original_train_labels = train_labels 
... 
... 
train_dataset, train_labels = reformat(train_dataset, train_labels) 
... 
... 
logit_clf.fit(train_dataset[:1000,:], original_train_labels[:1000]) 
+0

Danke Akiz, willkommen in SO! – gsamaras