train_test_split train test into array and pandas numpy dataframe machine-learning scikit-learn

pandas - into - train_test_split



¿Cómo dividir los datos en 3 conjuntos(tren, validación y prueba)? (5)

Tengo un marco de datos de pandas y deseo dividirlo en 3 conjuntos separados. Sé que usando train_test_split de sklearn.cross_validation , uno puede dividir los datos en dos conjuntos (entrenar y probar). Sin embargo, no pude encontrar ninguna solución para dividir los datos en tres conjuntos. Preferiblemente, me gustaría tener los índices de los datos originales.

Sé que una solución alternativa sería usar train_test_split dos veces y de alguna manera ajustar los índices. Pero, ¿hay una forma más estándar / integrada de dividir los datos en 3 conjuntos en lugar de 2?


Nota:

La función se escribió para manejar la inicialización de la creación de conjuntos aleatorios. No debe confiar en la división de conjuntos que no aleatoriza los conjuntos.

import numpy as np import pandas as pd def train_validate_test_split(df, train_percent=.6, validate_percent=.2, seed=None): np.random.seed(seed) perm = np.random.permutation(df.index) m = len(df.index) train_end = int(train_percent * m) validate_end = int(validate_percent * m) + train_end train = df.ix[perm[:train_end]] validate = df.ix[perm[train_end:validate_end]] test = df.ix[perm[validate_end:]] return train, validate, test

Demostración

np.random.seed([3,1415]) df = pd.DataFrame(np.random.rand(10, 5), columns=list(''ABCDE'')) df

train, validate, test = train_validate_test_split(df) train

validate

test


Es muy conveniente usar train_test_split sin realizar una reindexación después de dividir en varios conjuntos y no escribir algún código adicional. La mejor respuesta anterior no menciona que al separar dos veces usando train_test_split no cambiar el tamaño de la partición no dará la partición inicialmente prevista:

x_train, x_remain = train_test_split(x, test_size=(val_size + test_size))

Luego, la parte de los conjuntos de validación y prueba en x_remain cambia y podría contarse como

new_test_size = np.around(test_size / (val_size + test_size), 2) # To preserve (new_test_size + new_val_size) = 1.0 new_val_size = 1.0 - new_test_size x_val, x_test = train_test_split(x_remain, test_size=new_test_size)

En esta ocasión se guardan todas las particiones iniciales.


Numpy solucion. Dividiremos nuestro conjunto de datos en las siguientes partes:

  • 60% - juego de trenes,
  • 20% - conjunto de validación,
  • 20% - conjunto de prueba

In [305]: train, validate, test = np.split(df.sample(frac=1), [int(.6*len(df)), int(.8*len(df))]) In [306]: train Out[306]: A B C D E 0 0.046919 0.792216 0.206294 0.440346 0.038960 2 0.301010 0.625697 0.604724 0.936968 0.870064 1 0.642237 0.690403 0.813658 0.525379 0.396053 9 0.488484 0.389640 0.599637 0.122919 0.106505 8 0.842717 0.793315 0.554084 0.100361 0.367465 7 0.185214 0.603661 0.217677 0.281780 0.938540 In [307]: validate Out[307]: A B C D E 5 0.806176 0.008896 0.362878 0.058903 0.026328 6 0.145777 0.485765 0.589272 0.806329 0.703479 In [308]: test Out[308]: A B C D E 4 0.521640 0.332210 0.370177 0.859169 0.401087 3 0.333348 0.964011 0.083498 0.670386 0.169619

[int(.6*len(df)), int(.8*len(df))] - es una matriz numpy.split() para numpy.split() .

Aquí hay una pequeña demostración para el np.split() de np.split() : dividamos la matriz de 20 elementos en las siguientes partes: 80%, 10%, 10%:

In [45]: a = np.arange(1, 21) In [46]: a Out[46]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) In [47]: np.split(a, [int(.8 * len(a)), int(.9 * len(a))]) Out[47]: [array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), array([17, 18]), array([19, 20])]


Sin embargo, un enfoque para dividir el conjunto de datos en train , test , cv con 0.6 , 0.2 , 0.2 sería usar el método train_test_split dos veces.

from sklearn.model_selection import train_test_split x, x_test, y, y_test = train_test_split(xtrain,labels,test_size=0.2,train_size=0.8) x_train, x_cv, y_train, y_cv = train_test_split(x,y,test_size = 0.25,train_size =0.75)


Un enfoque es usar la función train_test_split dos veces.

from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=1)