train_test_split () error: Foram encontradas variáveis ​​de entrada com números inconsistentes de amostras

21

Bastante novo no Python, mas construindo meu primeiro modelo de RF com base em alguns dados de classificação. Eu converti todos os rótulos em dados numéricos int64 e carreguei em X e Y como uma matriz numpy, mas estou detectando um erro ao tentar treinar os modelos.

Aqui está a aparência das minhas matrizes:

>>> 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 (última chamada mais recente):

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

2039, em matrizes train_test_split = indexável (* matrizes) Arquivo "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", linha 206, no arquivo indexável check_consistent_length (* result) "/ Library / Python / 2.7 / site-packages / sklearn / utils / validation.py ", linha 181, em check_consistent_length" samples:% r "% [int (l) para l em comprimentos])

ValueError: Found input variables with inconsistent numbers of samples: [1, 29]
josh_gray
fonte
No futuro, poste questões de programação no stackoverflow . Esta sessão de perguntas e respostas é sobre ciência de dados, não sobre programação.
Ricardo Cruz

Respostas:

15

Você está enfrentando esse erro porque seu Xe Ynão possui o mesmo comprimento (que é o que train_test_splitrequer), ou seja X.shape[0] != Y.shape[0],. Dado o seu código atual:

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

Para corrigir este erro:

  1. Remover a lista extra a partir de dentro de np.array()ao definir Xou remover a dimensão extra depois com o seguinte comando: X = X.reshape(X.shape[1:]). Agora, a forma de Xserá (6, 29).
  2. Transponha Xexecutando X = X.transpose()para obter um número igual de amostras em Xe Y. Agora, a forma de Xserá (29, 6) e a forma de Yserá (29,).
tuomastik
fonte
1
Incrível isso funcionou para mim! Obrigado Tuomastik! Eu realmente aprecio a orientação :)
josh_gray
2

Train_test_split não espera ambos Xe Ydeve ser uma lista do mesmo comprimento? Seu X tem comprimento 6 e Y tem comprimento 29. Pode ser que você tente convertê-lo no dataframe do pandas (com dimensão 29x6) e tente novamente?

Dados os seus dados, parece que você tem 6 recursos. Nesse caso, tente converter o seu Xpara ter 29 linhas e 6 colunas. Em seguida, passe esse quadro de dados para train_test_split. Você pode converter sua lista em dataframe usando pd.DataFrame.from_records.

Sal
fonte
Obrigado pela ajuda Sal! Você está certo, eu apenas tive que convertê-lo para os mesmos comprimentos. Minha forma X era (1, 6, 29) e a forma Y era (29,). Eu apenas tive que reformular-los e tudo funcionou bem para mim :)
josh_gray