我有一个数据集"x"及其标签向量"y"。我想在应用NaiveBayes和交叉验证后绘制每个属性("x"的每一列)的准确性。我想要一个条形图。最后我需要有3个小节,因为"x"有3列。并且分类必须运行3次。每个特征有3种不同的精度。
每当我执行代码时,它都会显示:
ValueError:找到样本数不一致的数组:[1 3]不推荐使用警告:0.17中不推荐使用将1d数组作为数据传递,0.19中将引发ValueError。如果数据只有一个特征,则使用X.整形(-1,1)对数据进行整形;如果数据包含一个样本,则使用X.整形(1,-1)对数据整形。
我做错了什么?
import matplotlib.pyplot as plt
import numpy as np
from sklearn import cross_validation
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
x = np.array([[0, 0.51, 0.00101], [3, 0.54, 0.00105], [6, 0.57, 0.00108], [9, 0.60, 0.00111], [1, 0.73, 0.00114], [5, 0.76, 0.00117], [8, 0.89, 120]])
y = np.array([1, 0, 0, 1, 1, 1, 0])
scores = list()
scores_std = list()
for i in range(x.shape[1]):
xA=x[:, i]
scoresKF2 = cross_validation.cross_val_score(clf, xA, y, cv=2)
scores.append(np.mean(scoresKF2))
scores_std.append(np.std(scoresKF2))
plt.bar(x[:,i], scores)
plt.show()
检查输入数据xA
的形状,可以发现它是一维的——具体来说,它是(7,)
的形状。正如警告告诉我们的那样,这里不允许您传入1d数组。在返回的警告中解决此问题的关键如果数据具有单个特征,则使用X.整形(-1,1)或如果数据包含单个样本,则使用X.整形(1,-1)重塑数据。因此,由于它只是一个单独的功能,所以请执行xA = x[:,i].reshape(-1, 1)
而不是xA = x[:,i]
。
我认为阴谋还有另一个问题。我不完全确定你期望看到什么,但你可能应该用plt.bar(i, np.mean(scoresKF2))
代替plt.bar(x[:,i], scores)
。