最近的邻居,我遇到了以下错误: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))
答案 0 :(得分:0)
首先,您的X_train
和X_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_train
和X_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)
替换前两行。我已经分两个步骤进行了详细说明。