2017-05-19 25 views
0

我開始學習機器學習。 於是我開始用樸素貝葉斯
我的Python腳本ValueError 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) 

我的錯誤得到的是

[[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) 

我應該怎麼辦?

+0

刪除'x = x.reshape(1,-1)',這是錯誤的原因。 x變成長度爲8的一維數組,其不能適應y(長度4)。 – Nuageux

+0

@Nuageux之後,我也得到那個錯誤 –

+0

我的錯誤,你也應該刪除:'y = y.reshape(1,-1)'。你爲什麼要重塑,有什麼特別的原因? – Nuageux

回答

0

正如我在評論中說,沒有必要重塑。你之前得到這個錯誤(即沒有你提供的代碼),因爲你的代碼在那之後工作。

考慮到您始終獲得0的部分作爲預測,這是因爲您的數據。樸素貝葉斯需要更多樣本來分離類,每個類的兩個樣本對於非線性問題是不夠的。

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] 

看看我的兩個例子。在第一種情況下(您提供的情況),NB不會成功分離數據。在第二個示例中(仍然是非線性的),由於有足夠數量的樣本,NB成功返回正確的類。

爲了清晰起見,我創建了一個函數,但您可以在示例中添加更多示例,並且您會看到它的工作原理。 希望這有助於解決您的問題。

0

您應該根據您的樣本數重新規劃數據。

所有scikit估計器都要求X是一個具有形狀[n_samples,n_features]和形狀爲[n_samples,](通常)的二維數組。

您正在使用x = x.reshape(1,-1),它會將數據轉換爲形狀爲[1,8]的數組,其被解釋爲具有8個特徵的1個樣本。然後你的y形狀[4,]導致錯誤。

無需重塑Ÿ其已經形狀(4)

只需使用重塑X上正確。你有4個樣本。所以重塑應該是x = x.reshape(4, -1)

所以你完整的代碼將

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

現在感謝沒有錯誤
但a = [0]總是''a = clf.predict([[1,1]])''爲任意值''[1,0]''或''[0,1 ]''爲這兩個值''a = [1]'' –

+0

@AditSrivastava完全不理解你。你能多解釋一下嗎?如果它幫助您解決問題,請考慮接受答案。 –

+0

@VivekKumar,如果您將某些數據重塑爲其當前形狀,則它什麼也不做。重塑的錯誤來自Adit的先前嘗試(如評論中所述)。 – Nuageux