ValueError: неверная форма ввода (111, 3)

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

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

dataset = pd.read_csv('iris.csv')
X = dataset.iloc[:,:4]
y = dataset.iloc[:,4]


from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(sparse=False)
y=encoder.fit_transform(y.values.reshape(-1,1))

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)


from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)

Я получаю эти небольшие ошибки, которые мешают моим проектам. Можете ли вы предложить решение этой ошибки?
Также как я могу избежать этих ошибок?

Вы получаете ошибку из-за следующего-

y=encoder.fit_transform(y.values.reshape(-1,1))

Это изменяет форму y. Попробуйте print(y.shape)

Вам может потребоваться обработать ваши данные после того, как они были помечены и преобразованы. Я не уверен, пытаетесь ли вы “научиться” применять OneHotEncoding. Если да, вам стоит подробно изучить документацию. здесь-https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

Дайте знать, если вы это попробовали и все еще есть проблемы.

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

Ошибка ValueError: bad input shape (111, 3) указывает на проблему с размерностью входных данных, передаваемых в классификатор GaussianNB() из библиотеки sklearn. Давайте разберемся с этой проблемой и как ее можно устранить.

Анализ проблемы

В вашем коде происходит следующее:

  1. Считывание данных: Вы загружаете набор данных и разделяете его на признаки X и целевую переменную y.

    dataset = pd.read_csv('iris.csv')
    X = dataset.iloc[:, :4]
    y = dataset.iloc[:, 4]
  2. OneHotEncoding: Вы применяете OneHotEncoder к переменной y, чтобы преобразовать категориальные метки в числовой формат.

    from sklearn.preprocessing import OneHotEncoder
    
    encoder = OneHotEncoder(sparse=False)
    y = encoder.fit_transform(y.values.reshape(-1, 1))

    Однако, после этого преобразования y будет иметь форму (n_samples, n_classes), где n_classes – количество уникальных меток в целевой переменной. В случае с набором данных Iris, это обычно 3 класса. Таким образом, при применении OneHotEncoding размерность y изменится на (n_samples, 3).

  3. Обучение классификатора:

    classifier = GaussianNB()
    classifier.fit(X_train, y_train)

    Однако, GaussianNB ожидает, что целевая переменная будет одномерной (то есть вектором меток). Передавая в него y_train, который является матрицей, вы получаете ошибку ValueError.

Как исправить ошибку

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

  1. Вместо использования OneHotEncoder, можно оставить y в исходном формате:

    y = dataset.iloc[:, 4].values
  2. Если вы хотите использовать OneHotEncoding, вам следует изменить подход к выбору классификатора, который поддерживает многоклассовые метки, такие как GaussianNB, так как этот классификатор принимает лишь одномерные метки. В этом случае подойдут другие классификаторы, например LogisticRegression или RandomForestClassifier.

Пример корректировки:

from sklearn.ensemble import RandomForestClassifier  # Импортируйте RandomForestClassifier
classifier = RandomForestClassifier()  # Используйте его для обучения
classifier.fit(X_train, y_train)  # Обучение

Как избежать подобных ошибок в будущем

  1. Проверяйте входные данные: Перед подачей данных в модель всегда проверяйте их форму с помощью print(X.shape) и print(y.shape), чтобы убедиться, что они соответствуют ожиданиям.

  2. Изучите документацию: Перед применением методов преобразования данных, таких как OneHotEncoder, тщательно ознакомьтесь с их документацией, чтобы понять их поведение и входные/выходные формы.

  3. Понимание классификаторов: Осознавайте, какие классы классификаторов ожидают на входе. Например, GaussianNB ожидает одномерные массивы меток, в то время как LogisticRegression и другие могут работать с многомодальными метками.

Следуя указанным рекомендациям, вы сможете избежать этой ошибки и улучшить качество своего кода в проектах, связанных с машинным обучением.

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

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