train_test_split () ошибка: найдены входные переменные с непоследовательным количеством сэмплов

21

Довольно плохо знаком с Python, но строю свою первую модель RF на основе некоторых классификационных данных. Я преобразовал все метки в числовые данные int64 и загрузил их в X и Y в виде пустого массива, но у меня возникает ошибка, когда я пытаюсь обучить модели.

Вот как выглядят мои массивы:

>>> X = np.array([[df.tran_cityname, df.tran_signupos, df.tran_signupchannel, df.tran_vmake, df.tran_vmodel, df.tran_vyear]])

>>> Y = np.array(df['completed_trip_status'].values.tolist())

>>> X
array([[[   1,    1,    2,    3,    1,    1,    1,    1,    1,    3,    1,
            3,    1,    1,    1,    1,    2,    1,    3,    1,    3,    3,
            2,    3,    3,    1,    1,    1,    1],
        [   0,    5,    5,    1,    1,    1,    2,    2,    0,    2,    2,
            3,    1,    2,    5,    5,    2,    1,    2,    2,    2,    2,
            2,    4,    3,    5,    1,    0,    1],
        [   2,    2,    1,    3,    3,    3,    2,    3,    3,    2,    3,
            2,    3,    2,    2,    3,    2,    2,    1,    1,    2,    1,
            2,    2,    1,    2,    3,    1,    1],
        [   0,    0,    0,   42,   17,    8,   42,    0,    0,    0,   22,
            0,   22,    0,    0,   42,    0,    0,    0,    0,   11,    0,
            0,    0,    0,    0,   28,   17,   18],
        [   0,    0,    0,   70,  291,   88,  234,    0,    0,    0,  222,
            0,  222,    0,    0,  234,    0,    0,    0,    0,   89,    0,
            0,    0,    0,    0,   40,  291,  131],
        [   0,    0,    0, 2016, 2016, 2006, 2014,    0,    0,    0, 2015,
            0, 2015,    0,    0, 2015,    0,    0,    0,    0, 2015,    0,
            0,    0,    0,    0, 2016, 2016, 2010]]])

>>> Y
array(['NO', 'NO', 'NO', 'YES', 'NO', 'NO', 'YES', 'NO', 'NO', 'NO', 'NO',
       'NO', 'YES', 'NO', 'NO', 'YES', 'NO', 'NO', 'NO', 'NO', 'NO', 'NO',
       'NO', 'NO', 'NO', 'NO', 'NO', 'NO', 'NO'], 
      dtype='|S3')

>>> X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3)

Traceback (последний вызов был последним):

  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/sklearn/cross_validation.py", line

2039, в файле train_test_split arrays = indexable (* arrays) Файл "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", строка 206, в индексируемом файле check_consistent_length (* result) "/ Library / Python / 2.7 / site-packages / sklearn / utils / validation.py ", строка 181, в check_consistent_length" samples:% r "% [int (l) для l в длинах])

ValueError: Found input variables with inconsistent numbers of samples: [1, 29]
josh_gray
источник
В будущем, пожалуйста, опубликуйте вопросы по программированию в stackoverflow . Это вопросы и ответы о науке о данных, а не о программировании.
Рикардо Круз

Ответы:

15

Вы работаете в эти ошибки , потому что ваши Xи Yне имеют одинаковую длину (что train_test_splitтребуется), то есть X.shape[0] != Y.shape[0]. Учитывая ваш текущий код:

>>> X.shape
(1, 6, 29)
>>> Y.shape
(29,)

Чтобы исправить эту ошибку:

  1. Удалить дополнительный список Изнутри np.array()при определении Xили удалить дополнительное измерение потом с помощью следующей команды: X = X.reshape(X.shape[1:]). Теперь формаX будет (6, 29).
  2. Транспонировать X, запустив, X = X.transpose()чтобы получить равное количество образцов в Xи Y. Теперь форма Xбудет (29, 6), а форма Yбудет (29, 6).
tuomastik
источник
1
Удивительно, это сработало для меня! Спасибо Туомастик! Я действительно ценю руководство :)
josh_gray
2

Разве train_test_split не ожидает и того, Xи другого Yсписка? Ваш X имеет длину 6, а Y имеет длину 29. Может быть, попытайтесь преобразовать это в pandas dataframe (с размером 29x6) и попробуйте снова?

Учитывая ваши данные, похоже, у вас есть 6 функций. В этом случае попробуйте конвертировать, Xчтобы иметь 29 строк и 6 столбцов. Затем передайте этот фрейм данных train_test_split. Вы можете преобразовать свой список в dataframe, используя pd.DataFrame.from_records.

Сэл
источник
Спасибо за помощь Сал! Вы правы, я просто должен был преобразовать его в ту же длину. Мой X.shape был (1, 6, 29) и Y.shape был (29,). Я просто должен был изменить их, и у меня все работало нормально :)
josh_gray