плохая форма входных данных (5634, 2)

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

Я попробовал всё, и не уверен, как решить следующую ошибку:

ValueError: плохая форма входных данных (5634, 2)

Это мой первый пример машинного обучения, так что прошу вас проявить терпение. Вот код на Python:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
from pylab import rcParams
from IPython import get_ipython

ipy = get_ipython()
if ipy is not None:
    ipy.run_line_magic('matplotlib', 'inline')
# Загрузка CSV с помощью pandas
data = pd.read_csv('...WA_Fn-UseC_-Telco-Customer-Churn.csv')

# Данные для графика
sizes = data['Churn'].value_counts(sort = True)
colors = ["grey","purple"]
rcParams['figure.figsize'] = 5,5
explode = (0.1, 0)  # выделить 1-й сектор
labels = "Да","Нет"
# График
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct="%1.1f%%", shadow=True, startangle=270,)
plt.title('Процент оттока в наборе данных')
plt.show()

data.drop(['customerID'], axis=1, inplace=True)
tc = (data['TotalCharges'].str.strip())
#print(tc)
data['TotalCharges'] = pd.to_numeric(tc)

data["Churn"] = data["Churn"].eq('Yes').astype(int)
Y = pd.get_dummies(data["Churn"].values).fillna(0)
X = pd.get_dummies(data.drop(labels = ["Churn"],axis = 1)).fillna(0)


print(X.shape) #(7043, 45)
print(Y.shape) #(7043, 2)

# Создание обучающей и тестовой выборки
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=101)

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
result = model.fit(X_train, y_train)

Почему возникает ошибка

плохая форма входных данных (5634, 2), когда X.shape равно (7043, 45), а Y.shape равно
(7043, 2)?

Логистическая регрессия ожидает помеченные y_train, вам не нужно выполнять OneHotEncoding.

y : массивоподобный, форма (n_samples,)

Выше указано из sklearn LogisticRegression.fit.

Я думаю, что пока это закодировано метками (используя LabelEncoder), этот инструмент автоматически создаст сопоставление меток из ваших категориальных значений в уникальные целые числа от 0 до n-1, где n представляет количество различных значений категории. Логистическая регрессия будет работать нормально с закодированным метками целевым значением.

Совет : Пожалуйста, используйте labelencoder или OneHotEncoder для сопоставления категориальных значений. Проблема с get_dummies заключается в том, что он полагается на то, что вы выполняете трансформацию на различных разделённых наборах данных (например, тестовый набор, содержащийся в другом датафрейме), предположим, что в обучающем наборе у вас есть 3 уникальных категориальных значения, но в тестовом наборе только 2 уникальных значения. Тогда pd.get_dummies даст вам только 2 столбца (вместо 3), когда вы будете выполнять это на тестовом наборе.

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

Ошибка ValueError: bad input shape (5634, 2) в машинном обучении

В вашем коде возникает ошибка ValueError: bad input shape (5634, 2), что связано с неверным форматом входных данных, подаваемых в модель логистической регрессии. Давайте разберем проблему и возможные пути её решения.

Причина ошибки

Вы используете метод pd.get_dummies для того, чтобы создать матрицу признаков для целевой переменной Churn:

Y = pd.get_dummies(data["Churn"].values).fillna(0)

Этот метод создает бинарные обозначения для категориальных переменных. Однако модель логистической регрессии в библиотеке scikit-learn ожидает, что целевая переменная (y_train) будет одномерным массивом, где каждый элемент представляет собой класс (порядковое или бинарное значение). В данном случае, вместо того чтобы использовать pd.get_dummies, вам нужно просто закодировать целевую переменную в 0 и 1 с помощью .astype(int):

data["Churn"] = data["Churn"].eq('Yes').astype(int)

После этого у вас будет:

Y = data["Churn"].values  # Теперь Y - одномерный массив с целевыми значениями

Решения

  1. Используйте простое кодирование:
    Вам не нужно использовать get_dummies для переменной Churn, используйте простое бинарное кодирование.

    Y = data["Churn"].values  # vozводим к одномерному массиву

    Таким образом, Y.shape будет иметь вид (7043,), что удовлетворяет требованию LogisticRegression.

  2. Проверьте размеры массивов:
    Убедитесь, что размеры X и Y в обучающем наборе данных совпадают, т.е. обе переменные должны иметь одинаковое количество образцов:

    print(X_train.shape)  # должен быть (число образцов, 45)
    print(y_train.shape)  # должен быть (число образцов,)
  3. Разделение на обучающую и тестовую выборки:
    При разбиении данных на обучающую и тестовую выборки используйте правильные размеры для y_train:

    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=101)

Заключение

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

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

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

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