Tengo un conjunto de datos bastante grande en forma de un marco de datos y me preguntaba cómo podría dividir el marco de datos en dos muestras aleatorias (80% y 20%) para capacitación y pruebas.
¡Gracias!
python
python-2.7
pandas
dataframe
tooty44
fuente
fuente
msk
es de dtypebool
,df[msk]
,df.iloc[msk]
ydf.loc[msk]
siempre devuelven el mismo resultado.rand
para< 0.8
dar sentido porque devuelve uniformemente distribuida números aleatorios entre 0 y 1.in[12]
,in[13]
,in[14]
? Quiero entender el código de Python en sí mismonp.random.rand(len(df))
es una matriz de tamañolen(df)
con valores flotantes distribuidos aleatoria y uniformemente en el rango [0, 1]. El< 0.8
aplica la comparación elemento a elemento y almacena el resultado en su lugar. Por lo tanto, los valores <0.8 se conviertenTrue
y el valor> = 0.8 se conviertenFalse
scikit learn's
train_test_split
es bueno.fuente
kf = KFold(n, n_folds=folds) for train_index, test_index in kf: X_train, X_test = X.ix[train_index], X.ix[test_index]
vea el ejemplo completo aquí: quantstart.com/articles/…from sklearn.model_selection import train_test_split
lugar.from sklearn.cross_validation import train_test_split
La muestra aleatoria de pandas también funcionará
fuente
random_state
haciendo arg?test
se desea un conjunto aleatorio como se indica aquí stackoverflow.com/questions/29576430/shuffle-dataframe-rows .test=df.drop(train.index).sample(frac=1.0)
Usaría el propio training_test_split de scikit-learn y lo generaría a partir del índice
fuente
cross_validation
módulo ahora está en desuso:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
Hay muchas formas de crear un tren / prueba e incluso muestras de validación.
Caso 1: forma clásica
train_test_split
sin ninguna opción:Caso 2: caso de un conjunto de datos muy pequeño (<500 filas): para obtener resultados para todas sus líneas con esta validación cruzada. Al final, tendrá una predicción para cada línea de su conjunto de entrenamiento disponible.
Caso 3a: conjuntos de datos no balanceados para fines de clasificación. Siguiendo el caso 1, aquí está la solución equivalente:
Caso 3b: conjuntos de datos no balanceados para fines de clasificación. Siguiendo el caso 2, aquí está la solución equivalente:
Caso 4: necesita crear un conjunto de tren / prueba / validación en big data para sintonizar hiperparámetros (60% tren, 20% prueba y 20% val).
fuente
Puede usar el siguiente código para crear muestras de prueba y entrenamiento:
El tamaño de la prueba puede variar según el porcentaje de datos que desea incluir en su conjunto de datos de prueba y entrenamiento.
fuente
Hay muchas respuestas válidas. Agregando uno más al grupo. de sklearn.cross_validation import train_test_split
fuente
También puede considerar la división estratificada en conjunto de entrenamiento y prueba. La división Startified también genera un conjunto de entrenamiento y pruebas al azar, pero de tal manera que se preservan las proporciones originales de clase Esto hace que los conjuntos de entrenamiento y prueba reflejen mejor las propiedades del conjunto de datos original.
df [train_inds] y df [test_inds] le brindan los conjuntos de entrenamiento y prueba de su DataFrame df original.
fuente
Si necesita dividir sus datos con respecto a la columna de etiquetas en su conjunto de datos, puede usar esto:
y úsalo:
También puede pasar random_state si desea controlar la aleatoriedad dividida o utilizar alguna semilla aleatoria global.
fuente
fuente
Puede usar ~ (operador de tilde) para excluir las filas muestreadas usando df.sample (), dejando que solo los pandas manejen el muestreo y el filtrado de índices, para obtener dos conjuntos.
fuente
Esto es lo que escribí cuando necesitaba dividir un DataFrame. Pensé en usar el enfoque de Andy anterior, pero no me gustó que no pudiera controlar el tamaño de los conjuntos de datos exactamente (es decir, a veces sería 79, a veces 81, etc.).
fuente
Simplemente seleccione la fila de rango de df como este
fuente
df
en su fragmento de código se baraja (o debería), mejorará la respuesta.Hay muchas respuestas excelentes arriba, así que solo quiero agregar un ejemplo más en el caso de que desee especificar el número exacto de muestras para el tren y los conjuntos de prueba utilizando solo la
numpy
biblioteca.fuente
Para dividirse en más de dos clases, tales como entrenamiento, prueba y validación, uno puede hacer:
Esto colocará aproximadamente el 70% de los datos en capacitación, el 15% en pruebas y el 15% en validación.
fuente
necesita convertir el marco de datos de pandas en una matriz numpy y luego volver a convertir la matriz numpy en un marco de datos
fuente
Si su deseo es tener un marco de datos entrante y dos marcos de datos fuera (no matrices numpy), esto debería ser el truco:
fuente
Puede hacer uso de la función df.as_matrix () y crear Numpy-array y pasarlo.
fuente
Un poco más elegante para mi gusto es crear una columna aleatoria y luego dividirla, de esta manera podemos obtener una división que se adapte a nuestras necesidades y será aleatoria.
fuente
fuente
No es necesario convertir a numpy. Simplemente use un pandas df para hacer la división y devolverá un pandas df.
Y si quieres dividir x de y
fuente
Creo que también necesita obtener una copia, no una porción de marco de datos, si desea agregar columnas más adelante.
fuente
¿Qué tal esto? df es mi marco de datos
fuente