Вопрос о изменении размера массива для классификаторов KNN

Вопрос или проблема

Я продолжаю пытаться запустить новый набор данных через свой классификатор KNN, но получаю сообщение:

 ValueError: размерность данных запроса должна совпадать с размерностью обучающих данных

Затем я использовал:

x_new = pd.read_csv('NewFeaturePractice.csv' , names = attributes)    
x_new = x_new.values.reshape(52,84) 

(что соответствует размерностям обучающих данных), но затем получал:

ValueError: невозможно изменить размер массива размером 672 в форму (52,84)

Второй набор данных не имеет такого же количества строк, как первый, что означает, что даже если я попытаюсь изменить размер массива, у меня будут несколько пустых мест. Как я могу запустить код так, чтобы независимо от размера моего нового набора данных, я все равно мог получить результаты?

Похоже, вы делаете две ошибки –

Размерность изменения формы не совпадает с размером, т.е. 10 != 3X3

Размерности в обучении и тестировании разные. Обучение на 5 признаках и тестирование на 4 признаках.

Что я могу предложить –

Вы должны знать количество ваших признаков – скажем, N

тогда измените размер с помощью reshape(-1,N). Это автоматически определит первую размерность.

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
N=2
x.reshape(-1,N)

Ответ или решение

Для успешного выполнения классификации с использованием метода K-ближайших соседей (KNN) важно обеспечить согласованность между размерностями обучающего и тестового наборов данных. Ошибка, с которой вы сталкиваетесь, указывает на то, что количество признаков (фич) в вашем новом наборе данных не совпадает с количеством признаков, использованным для обучения модели. В данной ситуации я предлагаю следующий алгоритм действий:

1. Определение проблемы

Ошибка, которую вы видите (ValueError: query data dimension must match training data dimension), возникает, когда размерность вашего тестового набора данных не совпадает с размерностью обучающего. Это происходит, когда вы пытаетесь запустить новый набор данных, не проверив его структуру и размерность.

2. Проверка размерностей

Прежде всего, вы должны убедиться, что количество признаков в новом наборе данных соответствует количеству признаков в обучающем наборе данных. Если ваш обучающий набор данных имел, например, 84 признака, тогда ваш тестовый набор данных также должен содержать 84 признака, независимо от количества строк.

3. Загрузка данных и их очистка

При загрузке нового набора данных с использованием pd.read_csv(), проверьте, сколько признаков у вас есть:

import pandas as pd

# Загрузка нового набора данных
x_new = pd.read_csv('NewFeaturePractice.csv', names=attributes)

# Проверка размерности
print(x_new.shape)  # Покажет (количество строк, количество признаков)

4. Использование reshape

Если размерность вашего нового набора данных имеет правильное количество признаков, вы можете использовать метод reshape, чтобы удостовериться, что он правильно подготовлен для KNN. Однако, как показано в вашем примере, ошибка возникает, когда вы пытаетесь явно задать размеры.

Для автоматического определения первой размерности используйте:

import numpy as np

# Предположим, у вас есть N — общее количество признаков
N = len(attributes)  # количество признаков в вашем обучающем наборе

# Преобразование в массив NumPy и использование автоматического определения первой размерности
x_new = x_new.values.reshape(-1, N)

5. Устранение проблем с размерностью

Если новый набор данных не имеет достаточного количества признаков (меньше, чем ожидалось), полезно выполнить предварительную обработку данных, чтобы добавить недостающие признаки или удалить лишние:

  • Добавление недостающих значений: Если ваш новый набор данных меньше, чем требуется, вы можете добавить заполнители (например, нули).
  • Удаление лишних признаков: Если признаков больше, чем нужно, просто отберите нужные, используя индексирование.

6. Проверка соответствия модели

Обязательно проверяйте соответствие структуры данных перед передачей их в модель KNN. Например:

from sklearn.neighbors import KNeighborsClassifier

# Обучение вашего KNN-классификатора на обучающем наборе
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# Применение модели к новому набору данных
predictions = knn.predict(x_new)
print(predictions)

Заключение

Таким образом, чтобы избежать ошибки размерности в KNN и обеспечить корректное использование модели, необходимо внимательно следить за размерами и структурами ваших данных. В случае, если предположения о размере данных не соблюдаются, предварительная обработка и динамическое преобразование данных с использованием reshape(-1, N) станут необходимыми шагами. Таким образом, вы сможете успешно классифицировать данные независимо от их первоначального размера.

Оцените материал
Добавить комментарий

Капча загружается...