我正在尝试像这样实施高斯NB训练。但是,如果X的维度不相等(即X中的所有列表需要相同的长度),gnb.fit()会抛出异常。如果我的训练样本是不同长度的向量,那么调用fit()的正确方法是什么?
def train(X, Y):
gnb = GaussianNB()
gnb.fit(X, Y)
return gnb
>>> X = [[1,2,3], [4,5,6,7], [8,9]]
>>> Y = [1,1,1]
>>> snb.train(X, Y)
/Library/Python/2.7/site-packages/sklearn/utils/validation.py:395:
DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17
and will raise ValueError in 0.19. Reshape your data either using
X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1)
if it contains a single sample.
DeprecationWarning)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "snb.py", line 113, in train
gnb.fit(X, Y)
File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line
182, in fit
X, y = check_X_y(X, y)
File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py",
line 521, in check_X_y
ensure_min_features, warn_on_dtype, estimator)
File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py",
line 402, in check_array
array = array.astype(np.float64)
ValueError: setting an array element with a sequence.
答案 0 :(得分:2)
所有X向量必须长度相同。高斯朴素贝叶斯估计器被设计为基于一组因子进行预测。如果每个X中都有一个变量号,分类器如何确定哪个元素属于哪个因子?
一个选项是用0值填充X向量,以确保它们全长相等。否则,您需要考虑变量预处理。
答案 1 :(得分:0)
这是因为列表X
中的列表长度不同。 X
的子列表充当行/示例,该列表中的每个元素都是一个特征。为了确保您的模型运行,您需要具有相同长度的子列表,否则它将无法工作。我改变了那部分并且代码有效。
def train(X, Y):
gnb = GaussianNB()
gnb.fit(X, Y)
return gnb
X = [[1,2,3,4], [4,5,6,7], [8,9,10,11]]
Y = [1,1,1]
train(X, Y)