我想使用 knn 进行预测,我有以下代码:
def knn(trainImages, trainLabels, testImages, testLabels): max = 0 for i in range(len(trainImages)): if len(trainImages[i]) > max: max = len(trainImages[i]) for i in range(len(trainImages)): aux = np.array(trainImages[i]) aux.resize(max) trainImages[i] = aux max = 0 for i in range(len(testImages)): if len(testImages[i]) > max: max = len(testImages[i]) for i in range(len(testImages)): aux = np.array(testImages[i]) aux.resize(max) testImages[i] = aux scaler = StandardScaler() scaler.fit(list(trainImages)) trainImages = scaler.transform(list(trainImages)) testImages = scaler.transform(list(testImages)) classifier = KNeighborsClassifier(n_neighbors=5) classifier.fit(trainImages, trainLabels) pred = classifier.predict(testImages) print(classification_report(testLabels, pred))
我在 testImages = scaler.transform(list(testImages))
处遇到了错误。我明白这是因为数组数量的差异导致的。我该如何解决这个问题?
回答:
scikit-learn 中的 scaler
期望输入形状为 (n_samples, n_features)
。如果你的训练集和测试集的第二个维度不相等,那么不仅在 sklearn 中这是错误的并且会引发错误,从理论上讲也是没有意义的。测试集和训练集的 n_features
维度应该相等,但第一个维度可以不同,因为它表示样本数量,你可以在训练集和测试集中有任意数量的样本。
当你执行 scaler.transform(test)
时,它期望 test
具有与你执行 scaler.fit(train)
时相同的特征数量。因此,所有你的图像都应该具有相同的大小。
例如,如果你有 100 张图像,train_images
的形状应该类似于 (90,224,224,3)
,而 test_images
的形状应该类似于 (10,224,224,3)
(只有第一个维度不同)。
所以,尝试这样调整你的图像大小:
import cv2resized_image = cv2.resize(image, (224,224)) #不包括通道维度