Błąd train_test_split (): Znaleziono zmienne wejściowe o niespójnej liczbie próbek

21

Dość nowy w Pythonie, ale budowanie mojego pierwszego modelu RF na podstawie niektórych danych klasyfikacyjnych. Przekształciłem wszystkie etykiety w dane liczbowe int64 i załadowałem do X i Y jako tablicę numpy, ale próbuję wyszkolić modele, popełniam błąd.

Oto jak wyglądają moje tablice:

>>> 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 (ostatnie połączenie ostatnio):

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

2039, w tablicach train_test_split = indeksowalny (* tablice) Plik "/Biblioteka/Python/2.7/site-packages/sklearn/utils/validation.py", wiersz 206, w indeksowalnym pliku check_consistent_length (* wynik) / Biblioteka / Python / 2.7 / site-packages / sklearn / utils / validation.py ", wiersz 181, w check_consistent_length" samples:% r "% [int (l) dla l o długości])

ValueError: Found input variables with inconsistent numbers of samples: [1, 29]
josh_gray
źródło
W przyszłości prosimy o zamieszczanie pytań programowych w Stackoverflow . Pytania i odpowiedzi dotyczą nauki o danych, a nie programowania.
Ricardo Cruz,

Odpowiedzi:

15

Używasz do tego błędu, ponieważ Twój Xi Ynie mają taką samą długość (czego train_test_splitwymaga), tj X.shape[0] != Y.shape[0]. Biorąc pod uwagę twój obecny kod:

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

Aby naprawić ten błąd:

  1. Usunąć dodatkowy listy od wewnątrz np.array()przy definiowaniu Xlub usunąć dodatkowy wymiar potem za pomocą następującego polecenia: X = X.reshape(X.shape[1:]). Teraz będzie to kształt X(6, 29).
  2. Transponuj X, uruchamiając, X = X.transpose()aby uzyskać taką samą liczbę próbek w Xi Y. Teraz kształt Xbędzie (29, 6), a kształt Ybędzie (29,).
tuomastik
źródło
1
Niesamowite, że to działało dla mnie! Dzięki Tuomastik! Naprawdę doceniam wskazówki :)
josh_gray
2

Nie train_test_split spodziewa zarówno Xi Ybyć listę samej długości? Twój X ma długość 6, a Y ma długość 29. Czy możesz spróbować przekonwertować go na ramkę danych pandy (o wymiarze 29 x 6) i spróbować ponownie?

Biorąc pod uwagę twoje dane, wygląda na to, że masz 6 funkcji. W takim przypadku spróbuj przekonwertować plik Xna 29 wierszy i 6 kolumn. Następnie przekaż tę ramkę danych do train_test_split. Możesz przekonwertować listę na ramkę danych za pomocą pd.DataFrame.from_records.

Sal
źródło
Dzięki za pomoc Sal! Masz rację, po prostu musiałem przekonwertować go na te same długości. Mój X. kształt był (1, 6, 29), a Y. kształt był (29). Po prostu musiałem je przekształcić i wszystko działało dobrze dla mnie :)
josh_gray