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?
Respuestas:
Numpy solucion. Primero barajaremos todo el conjunto de datos (df.sample (frac = 1)) y luego dividiremos nuestro conjunto de datos en las siguientes partes:
[int(.6*len(df)), int(.8*len(df))]
- es unaindices_or_sections
matriz para numpy.split () .Aquí hay una pequeña demostración para su
np.split()
uso: dividamos la matriz de 20 elementos en las siguientes partes: 80%, 10%, 10%:fuente
frac=1
indica a lasample()
función que devuelva todas las filas (100%
o fracción =1.0
)np.random.seed(any_number)
antes de la línea de división para obtener el mismo resultado con cada ejecución. En segundo lugar, hacer una relación desigual como eltrain:test:val::50:40:10
uso[int(.5*len(dfn)), int(.9*len(dfn))]
. Aquí el primer elemento denota el tamaño paratrain
(0.5%), el segundo elemento denota el tamaño paraval
(1-0.9 = 0.1%) y la diferencia entre los dos denota el tamaño paratest
(0.9-0.5 = 0.4%).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.
Demostración
fuente
Sin embargo, un enfoque para dividir el conjunto de datos en
train
,test
,cv
con0.6
,0.2
,0.2
sería utilizar eltrain_test_split
método de dos veces.fuente
np.split()
. Además, no requiere dependencia adicional desklearn
.Aquí hay una función de Python que divide un marco de datos Pandas en marcos de datos de tren, validación y prueba con muestreo estratificado. Realiza esta división llamando a la función scikit-learn
train_test_split()
dos veces.A continuación se muestra un ejemplo de trabajo completo.
Considere un conjunto de datos que tenga una etiqueta sobre la cual desea realizar la estratificación. Esta etiqueta tiene su propia distribución en el conjunto de datos original, digamos 75%
foo
, 15%bar
y 10%baz
. Ahora dividamos el conjunto de datos en tren, validación y prueba en subconjuntos usando una relación 60/20/20, donde cada división conserva la misma distribución de las etiquetas. Vea la siguiente ilustración:Aquí está el conjunto de datos de ejemplo:
Ahora, llamemos a la
split_stratified_into_train_val_test()
función desde arriba para obtener marcos de datos de entrenamiento, validación y prueba siguiendo una relación 60/20/20.Los tres marcos de datos
df_train
,df_val
ydf_test
contienen todas las filas originales, pero sus tamaños seguirán la relación anterior.Además, cada una de las tres divisiones tendrá la misma distribución de la etiqueta, es decir, 75%
foo
, 15%bar
y 10%baz
.fuente
Es muy conveniente usarlo
train_test_split
sin realizar una reindexación después de dividirlo en varios conjuntos y no escribir algún código adicional. La mejor respuesta anterior no menciona que al separarse dos veces usandotrain_test_split
no cambiar los tamaños de partición no se obtendrá la partición inicialmente prevista:Luego, la parte de los conjuntos de validación y prueba en x_remain cambia y podría contarse como
En esta ocasión se guardan todas las particiones iniciales.
fuente