KNeighborsClassifier предсказывает выдачу «Ожидается 2D-массив, вместо этого получен 1D-массив»Python

Программы на Python
Ответить
Anonymous
 KNeighborsClassifier предсказывает выдачу «Ожидается 2D-массив, вместо этого получен 1D-массив»

Сообщение Anonymous »

Я пишу алгоритм сходства изображений. Я использую cv2.calcHist для извлечения функций изображения. После создания объектов я сохраняю их в файл json в виде списка numpy.float64:

Код: Выделить всё

list(numpy.float64(features))
, это встраивание многомерного вектора.
На втором этапе я загружаю данные из своего json и готовлю их для sklearn KNeighborsClassifier.

Код: Выделить всё

import numpy as np
import json
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import cosine_similarity

with open('data.json') as f:
jsonData = json.load(f)

X = []
y = []

for image in jsonData['images']:
embeddingData = image['histogram']
X.append(embeddingData)
y.append(image['classification'])

X = np.array(X)
y = np.array(y)

#split dataset into train and test data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1, stratify=y)

print('Shape of X_train:')
print(X_train.shape)
print('Shape of X_test:')
print(X_test.shape)
print('Shape of y_train:')
print(y_train.shape)

# Create KNN classifier
knn = KNeighborsClassifier(n_neighbors = 1, metric=cosine_similarity)
# Fit the classifier to the data
knn.fit(X_train, y_train)

#show predictions on the test data
y_pred = knn.predict(X_test)
Когда я запускаю этот код, я получаю следующую ошибку в строке

Код: Выделить всё

y_pred = knn.predict(X_test)

Код: Выделить всё

ValueError: Expected 2D array, got 1D array instead:
array=[1.13707140e-01 9.81128156e-01 2.89475545e-02 ... 0.00000000e+00
5.02811105e-04 1.15502894e-01].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
Вывод части формы:

Код: Выделить всё

Shape of X_train:
(36, 4096)
Shape of X_test:
(9, 4096)
Shape of y_train:
(36,)
Я пытался использовать предложение по изменению формы

Код: Выделить всё

y_pred = knn.predict(X_test.reshape(-1, 1))
, который помог другим людям с той же проблемой, что и в этом посте, но который меня сразил

Код: Выделить всё

ValueError: X has 1 features, but KNeighborsClassifier is expecting 4096 features as input.
4096 — это размеры объектов моей гистограммы.
Я также попробовал изменить форму X_train, чтобы она снова соответствовала X_test:

Код: Выделить всё

knn.fit(X_train.reshape(-1, 1), y_train)
, но это приводит к

Код: Выделить всё

ValueError: Found input variables with inconsistent numbers of samples: [147456, 36]
Сначала я попробовал немного другой подход, основанный на примере knn, где они обучали свою модель на наборе данных радужной оболочки глаза, но там knn.fit не принимал обучающие данные с тем же 2D Ошибка значения /1D. Затем я нашел этот пример в pyimagesearch, и это примерно то, что я хочу сделать, за исключением того, что у меня есть один промежуточный шаг с файлом json. Однако в моем случае json необходим, потому что я хочу добавить другие вложения позже и не хочу все пересчитывать.
Я не понимаю, почему knn.fit принимает данные из X_train , но knn.predict не принимает данные из X_test, которые были получены таким же образом. Почему в одном случае ошибка исправляется, а в другом нет?
Я уже пробовал предложенные решения из этого, этого и этого поста, но решение с изменением формы в моем случае не работает , как говорилось выше. Когда я пытаюсь добавить дополнительные скобки вот так:

Код: Выделить всё

y_pred = knn.predict([X_test])
, я получаю следующую ошибку:

Код: Выделить всё

ValueError: Found array with dim 3. KNeighborsClassifier expected 

Подробнее здесь: [url]https://stackoverflow.com/questions/79269801/kneighborsclassifier-predict-throws-expected-2d-array-got-1d-array-instead[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»