Вопрос или проблема
Я нов в области науки о данных и нуждаюсь в помощи по следующему вопросу:
Я работаю с набором данных, который состоит как из категориальных, так и из числовых значений. Сначала я объединил два файла (обучающий и тестовый), чтобы применить шаги EDA к нему, затем я выполнил шаги EDA над полученным набором данных, применил кодирование с одним горячим значением и разделил данные. Я получаю следующее сообщение, похоже, что есть несоответствие между записями y и полным набором данных, и это логично, но как мне справиться с этой проблемой.
y_train
y
target
0 1
1 1
2 1
3 0
4 1
... ...
17252 0
17253 0
17254 0
17255 0
17256 1
17257 строк × 1 столбец
ohe_data=ohe_data.drop(['ind'],axis="columns")
ohe_data.columns
Index(['experience', 'last_new_job', 'training_hours',
'relevent_experience_Has relevent experience',
'relevent_experience_No relevent experience',
'enrolled_university_Full time course',
'enrolled_university_Part time course',
'enrolled_university_no_enrollment', 'education_level_Graduate',
'education_level_High School', 'education_level_Masters',
'education_level_Phd', 'education_level_Primary School',
'major_discipline_Arts', 'major_discipline_Business Degree',
'major_discipline_Humanities', 'major_discipline_No Major',
'major_discipline_Other', 'major_discipline_STEM'],
dtype="object")
ohe_data.shape
(28762, 19)
y = y_train
x = ohe_data
# Разделение на обучающую и тестовую выборки
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y,
test_size=0.33,
random_state=1)
---------------------------------------------------------------------------
ValueError Traceback (последний вызов был самым последним)
<ipython-input-167-aa834d5164c8> в <module>()
4 X_train, X_test, y_train, y_test = train_test_split(x, y,
5 test_size=0.33,
----> 6 random_state=1)
2 кадра
/usr/local/lib/python3.7/dist-packages/sklearn/utils/validation.py в check_consistent_length(*arrays)
210 если len(uniques) > 1:
211 поднять ValueError("Обнаружены входные переменные с несовместимым количеством"
--> 212 " образцов: %r" % [int(l) для l в lengths])
213
214
ValueError: Обнаружены входные переменные с несовместимым количеством образцов: [28762, 17257]
Эта проблема вызвана тем, что количество наблюдений в ваших переменных x
и y
не совпадает. Как вы можете видеть, в вашей переменной x
(которая такая же, как ohe_data
) у вас 28762 наблюдения, в то время как ваша переменная y
имеет только 17257 наблюдений. Поскольку мы не видим код до этого, мы не можем сказать, что вызывает эту разницу.
Функция train_test_split
из Sklearn разрешает только совпадающее количество строк для X и Y.
В вашем случае форма Y
равна (17257 , 1 )
, а форма X
равна (28762, 19)
Вам нужно просто изменить форму X и Y так, чтобы у обоих было одинаковое количество строк (наблюдений)
-
Измените форму X на (17257,19)
(ИЛИ)
-
Измените форму Y на (28762,1)
Ответ или решение
Проблема с несовпадением размерностей y
и x
в процессе деления на обучающие и тестовые наборы данных
В вашем проекте возникает ошибка, связанная с несовпадением количества наблюдений в переменных x
и y
при использованием функции train_test_split
из библиотеки sklearn
. Давайте рассмотрим, как исправить эту ситуацию.
Основная проблема
Согласно вашему описанию, вы столкнулись со следующими размерами данных:
x
(илиohe_data
) имеет форму(28762, 19)
y
(илиy_train
) имеет форму(17257, 1)
Ошибка, с которой вы столкнулись, связана с тем, что для корректного разделения данных на обучающие и тестовые наборы, количество строк (или наблюдений) в обоих наборов должно быть одинаковым.
Возможные причины несовпадения
Несоответствие в количестве наблюдений может произойти по нескольким причинам:
- Неаккуратное объединение данных: Если вы конкатенировали два файла, могли случайно добавить лишние строки или не учесть, что некоторые из них являются пропущенными.
- Отбор данных: Возможно, в процессе очистки данных (например, при удалении выбросов или строк с отсутствующими значениями) вы пропустили некоторые строки только в одном из наборов, тем самым нарушив согласованность размеров.
- Разные источники данных: Если
y
иx
формировались из разных источников, это может также привести к несоответствию.
Решение проблемы
-
Проверка и пересчет данных: Начните с того, чтобы проверить количество строк в каждом из наборов данных. Это можно сделать с помощью:
print("Размер x:", x.shape) print("Размер y:", y.shape)
-
Выравнивание данных: Для того чтобы исправить несовпадение, вы можете либо изменить размер
x
, чтобы он стал равным по количеству строкy
, либо наоборот. Например, если вы хотите оставитьy
в его текущем состоянии, вам нужно будет отфильтровать ваши данные вx
, чтобы их количество совпало. Вот пример, как вы можете этого добиться:# Если y_train является Series и вам нужно оставить размер y x_aligned = x.iloc[:len(y_train), :]
Либо, если вам нужно сохранить полный набор x и расширить y:
# Если необходимо продублировать y y_aligned = pd.concat([y_train]* (len(x) // len(y_train) + 1))[:len(x)]
-
Запуск
train_test_split
: После приведённых выше преобразований, у вас должны совпадать размеры. Теперь вы можете снова запуститьtrain_test_split
:from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(x_aligned, y_train, test_size=0.33, random_state=1)
Заключение
Ошибки, подобные вашей, являются распространенной проблемой в области обработки данных. Важно следить за тем, чтобы размеры ваших входных массивов всегда совпадали, особенно при выполнении таких операций как разделение на обучающие и тестовые выборки. Проведя тщательную проверку и выравнивание данных, вы сможете успешно устранить возникшую проблему и продолжить свою работу в области анализа данных.