sklearn.naive_bayes.GaussianNB 中的 ValueError

Posted

技术标签:

【中文标题】sklearn.naive_bayes.GaussianNB 中的 ValueError【英文标题】:ValueError in sklearn.naive_bayes.GaussianNB 【发布时间】:2017-10-19 21:41:09 【问题描述】:

我开始学习机器学习。 所以我从朴素贝叶斯开始 我的python脚本

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)

我该怎么办?

【问题讨论】:

删除x = x.reshape(1,-1),这是您的错误的原因。 x 变成一个长度为 8 的一维数组,它不能适合 y(长度为 4)。 @Nuageux 之后我也得到了那个错误 我的错,你也应该删除:y = y.reshape(1,-1)。你为什么要重塑,有什么特别的原因吗? @Nuageux 起初我没有使用 reshape,但当时它显示了这个 DeprecationWarning: Passing 1d arrays as data 在 0.17 中被弃用,并将在 0.19 中引发 ValueError。如果您的数据具有单个特征,则使用 X.reshape(-1, 1) 重塑您的数据,如果它包含单个样本,则使用 X.reshape(1, -1) 重塑您的数据。弃用警告) 几个问题:您是否尝试过您在此处提供的相同代码而没有两条 reshape 行,但您仍然遇到相同的错误吗?如果是,你的 python 版本是什么? (在 2.7 上我没有任何问题)。最后,由于您的数据没有单一特征也不包含单一样本,因此重塑数据会对其维度产生真正的影响,请注意错误消息,有时它与您的情况不符。跨度> 【参考方案1】:

正如我在 cmets 中所说,无需重塑。您之前收到此错误(即您提供的代码没有),因为您的代码在那之后工作。

考虑到您始终获得 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 成功返回正确的类,因为有足够数量的样本。

为了清晰起见,我创建了一个函数,但您可以在示例中添加更多示例,您会看到它有效。 希望这有助于解决您的问题。

【讨论】:

以上是关于sklearn.naive_bayes.GaussianNB 中的 ValueError的主要内容,如果未能解决你的问题,请参考以下文章