我正在尝试使用scikit learn站点中的以下代码:
http://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html
我正在使用自己的数据。 我的问题是,我有两个以上的功能。如果我想将功能从 2 "扩展"到 3 或 4....
我得到:
"查询数据维度必须与训练数据维度匹配">
def machine():
with open("test.txt",'r') as csvr:
reader= csv.reader(csvr,delimiter='t')
for i,row in enumerate(reader):
if i==0:
pass
elif '' in row[2:]:
pass
else:
liste.append(map(float,row[2:]))
a = np.array(liste)
h = .02
names = ["Nearest Neighbors", "Linear SVM", "RBF SVM", "Decision Tree",
"Random Forest", "AdaBoost", "Naive Bayes", "LDA", "QDA"]
classifiers = [
KNeighborsClassifier(1),
SVC(kernel="linear", C=0.025),
SVC(gamma=2, C=1),
DecisionTreeClassifier(max_depth=5),
RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1),
AdaBoostClassifier(),
GaussianNB(),
LDA(),
QDA()]
X = a[:,:3]
y = np.ravel(a[:,13])
linearly_separable = (X, y)
datasets =[linearly_separable]
figure = plt.figure(figsize=(27, 9))
i = 1
for ds in datasets:
X, y = ds
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4)
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
cm = plt.cm.RdBu
cm_bright = ListedColormap(['#FF0000', '#0000FF'])
ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6)
ax.set_xlim(xx.min(), xx.max())
ax.set_ylim(yy.min(), yy.max())
ax.set_xticks(())
ax.set_yticks(())
i += 1
for name, clf in zip(names, classifiers):
ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
print clf.fit(X_train, y_train)
score = clf.score(X_test, y_test)
print y.shape, X.shape
if hasattr(clf, "decision_function"):
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
print Z
else:
Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
Z = Z.reshape(xx.shape)
ax.contourf(xx, yy, Z, cmap=cm, alpha=.8)
ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
alpha=0.6)
ax.set_xlim(xx.min(), xx.max())
ax.set_ylim(yy.min(), yy.max())
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(name)
ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),
size=15, horizontalalignment='right')
i += 1
figure.subplots_adjust(left=.02, right=.98)
plt.show()
在这种情况下,我使用三个功能。 我在代码中做错了什么,是X_train和X_test数据的问题吗? 只有两个功能,一切都很好。
我的 X 值:
(array([[ 1., 1., 0.],
[ 1., 0., 0.],
[ 1., 0., 0.],
[ 1., 0., 0.],
[ 1., 1., 0.],
[ 1., 0., 0.],
[ 1., 0., 0.],
[ 3., 3., 0.],
[ 1., 1., 0.],
[ 1., 1., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 4., 4., 2.],
[ 0., 0., 0.],
[ 6., 3., 0.],
[ 5., 3., 2.],
[ 2., 2., 0.],
[ 4., 4., 2.],
[ 2., 1., 0.],
[ 2., 2., 0.]]), array([ 1., 1., 1., 1., 0., 1., 1., 0., 1., 1., 0., 1., 1.,
1., 1., 1., 0., 1., 1., 0., 1., 0., 1., 1.]))
第一个数组是 X 数组,第二个数组是 y(目标)数组。
很抱歉格式错误=错误:
Traceback (most recent call last):
File "allM.py", line 144, in <module>
mainplot(namePlot,1,2)
File "allM.py", line 117, in mainplot
Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
File "/usr/local/lib/python2.7/dist-packages/sklearn/neighbors/classification.py", line 191, in predict_proba
neigh_dist, neigh_ind = self.kneighbors(X)
File "/usr/local/lib/python2.7/dist-packages/sklearn/neighbors/base.py", line 332, in kneighbors
return_distance=return_distance)
File "binary_tree.pxi", line 1298, in sklearn.neighbors.kd_tree.BinaryTree.query (sklearn/neighbors/kd_tree.c:10433)
ValueError: query data dimension must match training data dimension
这是 X 数组,没有将他放入数据集"ds"中。
[[ 1. 1. 0.][ 1. 0. 0.][ 1. 0. 0.][ 1. 0. 0.][ 1. 1. 0.][ 1. 0. 0.][ 1. 0. 0.][ 3. 3. 0.][ 1. 1. 0.][ 1. 1. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 4. 4. 2.][ 0. 0. 0.][ 6. 3. 0.][ 5. 3. 2.][ 2. 2. 0.][ 4. 4. 2.][ 2. 1. 0.][ 2. 2. 0.]]
发生这种情况是因为clf.predict_proba()
需要一个数组,其中每行具有与训练数据中的行相同数量的元素 - 换句话说,具有形状(num_rows, 3)
的输入。
当您使用二维示例时,这是有效的,因为np.c_[xx.ravel(), yy.ravel()]
的结果是一个包含双元素行的数组:
print np.c_[xx.ravel(), yy.ravel()].shape
(45738, 2)
这些示例有两个元素,因为它们是由示例代码用来创建一组输入以覆盖二维空间的np.meshgrid
创建的,该输入将很好地绘制。尝试将包含三项目行的数组传递给clf.predict_proba
,事情应该可以正常工作。
如果要重现此特定示例代码段,则必须创建一个 3D 网格网格,如 SO 上的此问题中所述。您还将在 3D 中绘制结果,其中 mplot3d 将作为一个很好的起点,尽管基于我在示例代码中对绘图的(诚然简短)外观,我怀疑这可能比它的价值更麻烦。我不太确定这些情节的3D模拟是什么样子的。