ValueError: 查询数据维度必须与训练数据维度-KNN匹配。

问题描述 投票:0回答:1

我和最近的邻居得到了这个错误。ValueError: query data dimension must match training data dimension.

我怎样才能知道分类器的维度,怎样才能解决这个问题?

这是我的代码,如果有人能帮助。

# Part 1 - Data Preprocessing

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the training set

dataset = pd.read_csv('Google_Stock_Price_Train1.csv')
X_train = dataset.iloc[:, 0:1].values
y_train = dataset.iloc[:, -1].values


# Importing testing set
dataset_test = pd.read_csv('Google_Stock_Price_Test1.csv')
X_test = dataset_test.iloc[:, :-1].values
y_test = dataset_test.iloc[:, -1].values


# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)




# KNN 
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
classifier.fit(X_train, y_train)






y_pred = classifier.predict(X_test)
print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1))
python machine-learning scikit-learn deep-learning knn
1个回答
0
投票

首先,你的 X_trainX_test 必须有相同的功能。所以,改变 X_test = dataset_test.iloc[:, :-1].valuesX_test = dataset_test.iloc[:, 0:1].values 如同 X_train.

此外,包括标度器在内的大多数预处理模型都应该使用训练数据进行拟合,它们同时用于变换训练数据和测试数据。

所以,修改代码如下。

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)

之后

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

0
投票

出现这种错误的原因是由于下列因素不一致 X_trainX_test.

X_train 只有一列,因为你已经使用了 X_train = dataset.iloc[:,0:1].值,而不是 X_train = dataset.iloc[:, :-1].值。所以你的训练数据只有1个特征,测试数据有n个特征。你可以使用 DataFrame.shape() (X_train.shape()) 用于检查数据框的形状。

还有一个问题会导致你的模型在生产中表现不佳,即 数据泄漏.

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)

在这里,你使用训练数据的平均值和标准值进行训练数据的缩放,使用测试数据的平均值和标准值进行测试数据的缩放。但这将导致数据泄漏问题。为了防止这个问题,使用下面的方法.从训练数据集计算平均值和标准,然后应用于训练和测试。

sc.fit(X_train) # python will calculate std and mean save it internally
X_train = sc.transform(X_train) #scaling train dataset
X_test = sc.transform(X_test )  #scaling test datset

您可以将前两行替换为 X_train = sc.fit_transform(X_train). 我分2个步骤来写,以便更加明确。

© www.soinside.com 2019 - 2024. All rights reserved.