2017-05-19 6 views
0

나는 기계 학습을 배우기 시작했습니다. 그래서 나는 내가 오류가Sklearn.naive_bayes.GaussianNB의 ValueError

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

어떻게해야한다 얻을 나이브 베이 즈
내 파이썬 스크립트

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

'x = x.reshape (1, -1)'을 제거하십시오. 이것은 오류의 원인입니다. x는 y 길이 (길이 4)에 맞지 않는 길이 8의 1D 배열이됩니다. – Nuageux

+0

@Nuageux 그 후에도 오류가 발생합니다. –

+0

실수로, 'y = y.reshape (1, -1)'도 제거해야합니다. 왜 어떤 특별한 이유에서 재구성하고 싶습니까? – Nuageux

답변

0

될 것입니다, 필요 바꿀 없습니다. 코드가 작동하기 때문에이 오류가 발생하기 전에 (즉, 제공 한 코드로는 아니요)

항상 예측치 0을 얻는 부분을 고려하면 데이터 때문일 것입니다. Naive Bayes는 클래스를 분리하기 위해 더 많은 샘플을 필요로하며, 비선형 문제에 대해 클래스 당 두 개의 샘플만으로는 충분하지 않습니다.

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,] (일반적으로) 인 2 차원 배열이어야한다고 요구합니다.

x = x.reshape(1,-1)을 사용하고 있습니다.이 데이터는 모양이 [1,8] 인 배열로 변환되며, 이는 8 개의 피쳐를 갖는 1 개의 샘플로 해석됩니다. 그리고 y는 오류의 원인이되는 모양 [4,]입니다.

는 이미 모양으로 Y를 바꿀 필요가 없습니다 (4)

그냥 제대로 X에 바꿀 사용합니다. 네 가지 샘플이 있습니다. 따라서 모양은 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

덕분에 아무런 오류도 없었습니다.
하지만,''[1,0]''또는''[0,1]에 대해서 항상 a = [0] a = clf.predict ([[1,1] ]''2 개의 값''a = [1]'' –

+0

@AditSrivastava 완전히 이해하지 못했습니다. 좀 더 설명해 주시겠습니까? 문제 해결에 도움이된다면 답을 수락하는 것을 고려해보십시오. –

+0

@VivekKumar, 일부 데이터를 현재 모양으로 바꾼 경우 아무 것도 수행되지 않습니다. 재 형성의 오류는 Adit의 이전 시도 (주석에 설명 된대로)에서 비롯됩니다. – Nuageux