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)