2017-05-19 4 views
0

Ich fing an, maschinelles Lernen zu lernen. Also begann ich mit Naive Bayes
mein Python-SkriptValueError in sklearn.naive_bayes.GaussianNB

import numpy as np 
x = np.array([[0,0],[1,1],[0,1],[1,0]]) 
y = np.array([0,0,1,1]) 
print(x) 
from sklearn.naive_bayes import GaussianNB 
clf = GaussianNB() 
x = x.reshape(1,-1) 
y = y.reshape(1,-1) 
clf.fit(x,y) 
a = clf.predict([[1,1]]) 
print(a) 

der Fehler ich bin ist

[[0 0] 
[1 1] 
[0 1] 
[1 0]] 
Traceback (most recent call last): 
    File "ex.py", line 9, in <module> 
    clf.fit(x,y) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/naive_bayes.py", line 182, in fit 
    X, y = check_X_y(X, y) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 526, in check_X_y 
    y = column_or_1d(y, warn=True) 
    File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 562, in column_or_1d 
    raise ValueError("bad input shape {0}".format(shape)) 
ValueError: bad input shape (1, 4) 

, was soll ich tun?

+0

Entfernen Sie die 'x = x.reshape (1, -1)', das ist die Ursache für Ihren Fehler. x wird zu einem 1D-Array der Länge 8, das nicht zu y passt (Länge 4). – Nuageux

+0

@Nuageux danach bekomme ich auch diesen Fehler –

+0

Mein Fehler, Sie sollten auch entfernen: 'y = y.reshape (1, -1)'. Warum wollten Sie einen bestimmten Grund umgestalten? – Nuageux

Antwort

0

sein wird, wie ich in den Kommentaren sagen will, keine Notwendigkeit, neu zu gestalten. Sie erhalten diesen Fehler zuvor (d. H. Nein mit dem von Ihnen angegebenen Code), da der Code danach funktioniert hat.

Wenn Sie den Teil betrachten, bei dem Sie immer 0 als Vorhersage erhalten, lag das an Ihren Daten. Naive Bayes benötigt mehr Samples, um die Klassen zu trennen, zwei Samples pro Klasse für ein nichtlineares Problem reichen nicht aus.

import numpy as np 
from sklearn.naive_bayes import GaussianNB 

def GNB(x,y): 
    clf = GaussianNB() 
    clf.fit(x,y) 
    a = clf.predict(x) 
    print(a) 

x = np.array([[0,0],[1,1],[0,1],[1,0]]) 
y = np.array([0,0,1,1]) 
GNB(x,y) 
# Output : [0,0,0,0] 

x = np.array([[0,0],[0,1],[1,1],[1,0],[3,4],[-2,2],[-3,2],[-4,-2]]) 
y = np.array([0,0,0,0,1,1,1,1]) 
GNB(x,y) 
# [0 0 0 0 1 1 1 1] 

Schauen Sie sich meine zwei Beispiele an. Im ersten Fall (dem von Ihnen bereitgestellten) ist es dem NB nicht möglich, die Daten zu trennen. Bei dem zweiten Beispiel (immer noch nicht-linear) gelang es dem NB, die richtigen Klassen zurückzugeben, da eine ausreichende Anzahl von Abtastungen vorhanden war.

Ich erstelle eine Funktion für Klarheit, aber Sie können einfach weitere Beispiele zu Ihrem Beispiel hinzufügen, und Sie werden sehen, dass es funktioniert. Hoffe das hilft und löst Ihr Problem.

0

Sie sollten die Daten basierend auf Ihrer Anzahl von Proben neu gestalten.

Alle Scikit-Schätzer verlangen, dass X ein 2-d-Array mit shape [n_samples, n_features] und y mit shape [n_samples,] ist (häufig).

Sie verwenden x = x.reshape(1,-1), die die Daten in ein Array der Form [1,8] konvertieren, die als 1 Beispiel mit 8 Funktionen interpretiert wird. Und dann ist dein y von Form [4], was den Fehler verursacht. richtig

Keine Notwendigkeit y als bereits der Form neu zu gestalten (4,)

Verwenden Sie einfach auf X neu zu gestalten. Sie haben 4 Proben. Also sollte die Umformung x = x.reshape(4, -1) sein.

So Ihr vollständiger Code

x = np.array([[0,0],[1,1],[0,1],[1,0]]) 
y = np.array([0,0,1,1]) 
print(x) 
from sklearn.naive_bayes import GaussianNB 
clf = GaussianNB() 
x = x.reshape(4,-1) 
clf.fit(x,y) 
a = clf.predict([[1,1]]) 
print(a) 
+0

danke kein Fehler jetzt
aber a = [0] immer '' a = clf.predict ([[1,1]]) '' für jeden Wert '' [1,0] '' oder '' [0,1 ] '' für diese 2 Werte '' a = [1] '' –

+0

@AditSrivastava Ich habe dich nicht vollständig verstanden. Kannst du bitte ein bisschen mehr erklären. Bitte denken Sie darüber nach, die Antwort zu akzeptieren, wenn sie Ihnen geholfen hat, das Problem zu lösen. –

+0

@VivekKumar, wenn Sie einige Daten in ihre aktuelle Form umformen, tut es nichts. Der Fehler beim Umformen kommt von einem vorherigen Versuch von Adit (wie im Kommentar erklärt). – Nuageux