Erreur train_test_split (): variables d'entrée trouvées avec un nombre d'échantillons incohérent

21

Assez nouveau pour Python mais construisant mon premier modèle RF basé sur certaines données de classification. J'ai converti toutes les étiquettes en données numériques int64 et chargé dans X et Y en tant que tableau numpy, mais je rencontre une erreur lorsque j'essaie de former les modèles.

Voici à quoi ressemblent mes tableaux:

>>> 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 (dernier appel le plus récent):

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

2039, dans train_test_split arrays = indexable (* arrays) File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", ligne 206, dans indexable check_consistent_length (* result) File "/ Library / Python / 2.7 / site-packages / sklearn / utils / validation.py ", ligne 181, dans les échantillons check_consistent_length":% r "% [int (l) pour l en longueurs])

ValueError: Found input variables with inconsistent numbers of samples: [1, 29]
josh_gray
la source
À l'avenir, veuillez publier vos questions de programmation sur stackoverflow . Ce Q&A concerne la science des données, pas la programmation.
Ricardo Cruz

Réponses:

15

Vous rencontrez cette erreur parce que votre Xet Yn'ont pas la même longueur (ce qui est train_test_splitrequis), c'est-à-dire X.shape[0] != Y.shape[0]. Compte tenu de votre code actuel:

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

Pour corriger cette erreur:

  1. Supprimer la liste supplémentaire à l' intérieur de np.array()la définition Xou de supprimer la dimension supplémentaire après avec la commande suivante: X = X.reshape(X.shape[1:]). Maintenant, la forme de Xsera (6, 29).
  2. Transposer Xen exécutant X = X.transpose()pour obtenir un nombre égal d'échantillons dans Xet Y. Maintenant, la forme de Xsera (29, 6) et la forme de Ysera (29,).
tuomastik
la source
1
Incroyable, cela a fonctionné pour moi! Merci Tuomastik! J'apprécie vraiment les conseils :)
josh_gray
2

Train_test_split n'attend-il pas les deux Xet Yune liste de même longueur? Votre X a une longueur de 6 et Y a une longueur de 29. Peut-être essayez de convertir cela en trame de données pandas (avec une dimension 29x6) et réessayez?

Compte tenu de vos données, il semble que vous ayez 6 fonctionnalités. Dans ce cas, essayez de convertir votre Xpour avoir 29 lignes et 6 colonnes. Passez ensuite cette trame de données à train_test_split. Vous pouvez convertir votre liste en dataframe en utilisant pd.DataFrame.from_records.

Sal
la source
Merci pour l'aide Sal! Tu as raison, je devais juste le convertir aux mêmes longueurs. Ma forme X était (1, 6, 29) et ma forme Y était (29,). Je devais juste les remodeler et tout a bien fonctionné pour moi :)
josh_gray