Вопрос или проблема
Я попробовал всё, и не уверен, как решить следующую ошибку:
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 - одномерный массив с целевыми значениями
Решения
-
Используйте простое кодирование:
Вам не нужно использоватьget_dummies
для переменнойChurn
, используйте простое бинарное кодирование.Y = data["Churn"].values # vozводим к одномерному массиву
Таким образом,
Y.shape
будет иметь вид(7043,)
, что удовлетворяет требованиюLogisticRegression
. -
Проверьте размеры массивов:
Убедитесь, что размерыX
иY
в обучающем наборе данных совпадают, т.е. обе переменные должны иметь одинаковое количество образцов:print(X_train.shape) # должен быть (число образцов, 45) print(y_train.shape) # должен быть (число образцов,)
-
Разделение на обучающую и тестовую выборки:
При разбиении данных на обучающую и тестовую выборки используйте правильные размеры дляy_train
:X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=101)
Заключение
Ваша ошибка вызвана тем, что вы передаете двумерный массив целевой переменной в модель логистической регрессии, которая ожидает одномерный массив. Используйте простое кодирование для класса и убедитесь, что при разделении данных размеры совпадают. Выполнив данные шаги, вы сможете успешно запустить ваш алгоритм машинного обучения без ошибок формата входных данных.
Запомните, что правильное представление данных имеет критически важное значение в машинном обучении, так как влияет на успешность ваших моделей.