Error train_test_split (): se encontraron variables de entrada con números inconsistentes de muestras

21

Bastante nuevo en Python pero construyendo mi primer modelo de RF basado en algunos datos de clasificación. He convertido todas las etiquetas en datos numéricos int64 y cargado en X e Y como una matriz numpy, pero estoy detectando un error cuando estoy tratando de entrenar a los modelos.

Así es como se ven mis matrices:

>>> 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)

Rastreo (llamadas recientes más última):

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

2039, en train_test_split arrays = indexable (* arrays) Archivo "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", línea 206, en indexable check_consistent_length (* resultado) Archivo "/ Library / Python / 2.7 / site-packages / sklearn / utils / validation.py ", línea 181, en muestras de check_consistent_length":% r "% [int (l) para l en longitudes])

ValueError: Found input variables with inconsistent numbers of samples: [1, 29]
josh_gray
fuente
En el futuro, publique preguntas de programación en stackoverflow . Este Q&A es sobre ciencia de datos, no programación.
Ricardo Cruz

Respuestas:

15

Se está ejecutando en ese error porque su Xy Yno tienen la misma longitud (que es lo que train_test_splitrequiere), es decir, X.shape[0] != Y.shape[0]. Dado su código actual:

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

Para corregir este error:

  1. Eliminar la lista adicional desde el interior de np.array()la hora de definir Xo eliminar la dimensión extra después con el comando siguiente: X = X.reshape(X.shape[1:]). Ahora, la forma de Xserá (6, 29).
  2. Transponga Xejecutando X = X.transpose()para obtener el mismo número de muestras en Xy Y. Ahora, la forma de Xserá (29, 6) y la forma de Yserá (29,).
tuomastik
fuente
1
¡Increíble esto funcionó para mí! Gracias Tuomastik! Realmente aprecio la orientación :)
josh_gray
2

¿No está train_test_split esperando ambos Xy Yser una lista de la misma longitud? Su X tiene una longitud de 6 e Y tiene una longitud de 29. ¿Puede intentar convertir eso en un marco de datos de pandas (con una dimensión de 29x6) y volver a intentarlo?

Dada su información, parece que tiene 6 funciones. En ese caso, intente convertir su Xpara tener 29 filas y 6 columnas. Luego pase ese marco de datos a train_test_split. Puede convertir su lista a trama de datos usando pd.DataFrame.from_records.

Sal
fuente
Gracias por la ayuda Sal! Tienes razón, solo tuve que convertirlo a la misma longitud. Mi X.shape fue (1, 6, 29) e Y.shape fue (29,). Solo tuve que remodelarlos y todo funcionó bien para mí :)
josh_gray