scikit-learn 查询数据维度必须匹配训练数据维度

Posted

技术标签:

【中文标题】scikit-learn 查询数据维度必须匹配训练数据维度【英文标题】:scitkit-learn query data dimension must match training data dimension 【发布时间】:2015-07-09 00:00:03 【问题描述】:

我正在尝试使用来自 scikit 学习网站的代码:

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(target) 数组。

很抱歉格式错误=错误:

        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

这是没有将他放入数据集“ds”的X数组。

[[ 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.]]

【问题讨论】:

您的 X 示例看起来像是一个包含示例和目标的元组,但这不是代码所期望的。你能举一个a的例子吗?从那里可以更容易地测试您的代码。 你还能提供更多关于错误的信息吗?错误发生在哪里?即使包括整个错误回溯也会有所帮助 不好意思,就是X和y,第一个数组是X,第二个数组是y(target)。 我在帖子中编辑了错误代码和“正常”X 数组,但没有将 im 放入数据集向量中 您能解决这个问题吗?如果可以,请告诉我如何解决? 【参考方案1】:

发生这种情况是因为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 网格,如this 关于 SO 的问题中所述。您还将在 3D 中绘制结果,mplot3d 将作为一个很好的起点,尽管基于我在示例代码中绘制的(诚然简短的)外观,我怀疑这可能比这是值得的。我不确定这些情节的 3D 模拟看起来如何。

【讨论】:

我认为如果不切片,您就无法真正制作 3d 绘图。也许是界限,但它看起来会很乱。无论如何,它不会概括超过 3 个维度... @AndreasMueller 我认为你是对的。如果 OP 决定继续使用此示例,只是想提供一些方向。

以上是关于scikit-learn 查询数据维度必须匹配训练数据维度的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-Learn KDE 中的 PDF 估计

python机器学习——使用scikit-learn训练感知机模型

使用 scikit-learn python 的逻辑回归输出不匹配

如何将功能管道从 scikit-learn V0.21 移植到 V0.24

使用 scikit-learn PCA 找到具有最高方差的维度

如何使用 scikit-learn 组合具有不同维度输出的特征