Вопрос или проблема
Я пытаюсь разделить свои x и y на обучающие и тестовые данные для моей модели машинного обучения, но получаю эту ошибку: ValueError: Найдены входные переменные с непоследовательным количеством образцов: [6, 366]
. Мой массив numpy x
выглядит так:
array([[2, 3, 4, ..., 31, 1, 2],
[1, 1, 1, ..., 12, 1, 1],
[2021, 2021, 2021, ..., 2021, 2022, 2022],
[53, 53, 1, ..., 52, 52, 52],
[1, 1, 1, ..., 4, 1, 1],
[1, 1, 1, ..., 1, 0, 1]], dtype=object)
x.shape
: (6, 366)
Мой массив y
:
array([ 774.534973, 975.50769 , ... , 3824.19873 ])
С формой: (366,)
Вам, вероятно, следует транспонировать ваш массив x
, так как первое измерение должно соответствовать количеству образцов в вашем наборе данных, в данный момент первое измерение соответствует количеству признаков вместо количества образцов. Следующий код должен сработать:
import numpy as np
from sklearn.model_selection import train_test_split
# генерируем случайные данные с такой же формой, как у ваших данных
X, y = np.random.randn(6, 366), np.random.randn(366)
print(X.shape, y.shape)
# (6, 366) (366,)
# транспонируем массив признаков, чтобы убедиться, что первое измерение соответствует количеству образцов
X = X.T
print(X.shape, y.shape)
# (366, 6) (366,)
X_train, X_test, y_train, y_test = train_test_split(X, y)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
# (274, 6) (92, 6) (274,) (92,)
Ответ или решение
Ошибка ValueError: Found input variables with inconsistent numbers of samples: [6, 366]
, с которой вы столкнулись во время разделения ваших данных на тренировочные и тестовые выборки, указывает на несоответствие в размере массивов x
и y
. Для успешного обучения модели машинного обучения количество строк в массиве признаков (x
) должно совпадать с количеством элементов в целевой переменной (y
).
Анализ проблемы
Максимальная информация, которую можно извлечь из представленных массивов:
- Array
x
с формой(6, 366)
: здесь первая размерность (6
) указывает на количество признаков, а вторая (366
) представляет количество образцов. - Array
y
с формой(366,)
: это одномерный массив, где366
— это количество целевых значений для каждого образца.
Корректировка структуры данных
Ваша проблема возникает из-за того, что в текущем виде массив x
не соответствует условию модели, при котором каждая строка должна представлять отдельный образец, а столбцы — его признаки. Чтобы исправить это, необходимо транспонировать массив x
, чтобы он принял форму (366, 6)
. Теперь каждая строка будет представлять образец, а каждый столбец — признак.
Решение
Вот как можно осуществить транспонирование и последующее разделение с помощью функции train_test_split
из библиотеки scikit-learn
:
import numpy as np
from sklearn.model_selection import train_test_split
# Ваши данные
x = np.array([[2, 3, 4, ..., 31, 1, 2],
[1, 1, 1, ..., 12, 1, 1],
[2021, 2021, 2021, ..., 2021, 2022, 2022],
[53, 53, 1, ..., 52, 52, 52],
[1, 1, 1, ..., 4, 1, 1],
[1, 1, 1, ..., 1, 0, 1]], dtype=object)
y = np.array([774.534973, 975.50769, ..., 3824.19873])
# Транспонирование массива x
x = x.T
# Проверка форм массивов
print(x.shape) # (366, 6)
print(y.shape) # (366,)
# Деление на тренировочные и тестовые наборы
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
# Проверка форм выборок
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
# Ожидаемые размеры: (292, 6), (74, 6), (292,), (74,)
Заключение
Проблема, с которой вы столкнулись, связана с неправильной интерпретацией размерностей ваших данных. Очевидное решение — транспонировать массив x
, чтобы соответствовать требованиям модели. Убедитесь, что каждый образец представлен в виде одной строки, а соответствующая целевая переменная находится в массиве y
. Следуя приведенным рекомендациям, вы сможете успешно подготовить данные для обучения вашей модели машинного обучения.