tutorial train test how example pandas numpy dataframe machine-learning scikit-learn

train - pandas python



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

Nota:

La función fue escrita para manejar la creación de conjuntos aleatorios. No debe confiar en la división de conjuntos que no aleatorice 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) 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

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 (tren y prueba). 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 existe una forma más estándar / integrada de dividir los datos en 3 conjuntos en lugar de 2?


Numpy solución. Dividiremos nuestro conjunto de datos en las siguientes partes:

  • 60% - conjunto 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 indices_or_sections para numpy.split () .

Aquí hay una pequeña demostración para el np.split() de np.split() - vamos a dividir la matriz de 20 elementos en las siguientes partes: 90%, 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.

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)