ValueError:查询数据维度必须与训练数据维度KNN

时间:2020-05-14 01:20:58

标签: python machine-learning scikit-learn deep-learning knn

最近的邻居,我遇到了以下错误:ValueError:查询数据维必须与训练数据维匹配。

如何确定分类器的尺寸以及如何解决此问题

如果有人可以帮助,这是我的代码:

# 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))

2 个答案:

答案 0 :(得分:0)

首先,您的X_trainX_test必须具有相同的功能。 因此,就像您对X_test = dataset_test.iloc[:, :-1].values所做的那样,将X_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)

答案 1 :(得分:0)

由于X_trainX_test的尺寸不一致而发生此错误。

X_train只有您使用过的X_train = dataset.iloc[:, 0:1 ]一栏。值代替了X_train = dataset.iloc[:, : -1 ]。值。因此,您的火车数据仅具有1个特征,而测试数据具有n个特征。您可以使用DataFrame.shape() (X_train.shape())检查数据框的形状。

还有另一个问题,将导致模型在生产中的性能变差,即data leakage

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)替换前两行。我已经分两个步骤进行了详细说明。