¿Cuál es una buena manera de dividir una matriz NumPy aleatoriamente en un conjunto de datos de entrenamiento y prueba / validación? Algo similar a las funciones cvpartition
o crossvalind
en Matlab.
fuente
¿Cuál es una buena manera de dividir una matriz NumPy aleatoriamente en un conjunto de datos de entrenamiento y prueba / validación? Algo similar a las funciones cvpartition
o crossvalind
en Matlab.
Si desea dividir el conjunto de datos una vez en dos mitades, puede usar numpy.random.shuffle
, o numpy.random.permutation
si necesita realizar un seguimiento de los índices:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]
o
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
indices = numpy.random.permutation(x.shape[0])
training_idx, test_idx = indices[:80], indices[80:]
training, test = x[training_idx,:], x[test_idx,:]
Hay muchas formas de particionar repetidamente el mismo conjunto de datos para la validación cruzada . Una estrategia es volver a muestrear a partir del conjunto de datos, con repetición:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
training_idx = numpy.random.randint(x.shape[0], size=80)
test_idx = numpy.random.randint(x.shape[0], size=20)
training, test = x[training_idx,:], x[test_idx,:]
Finalmente, sklearn contiene varios métodos de validación cruzada (k-fold, leave-n-out, ...). También incluye métodos más avanzados de "muestreo estratificado" que crean una partición de los datos que está equilibrada con respecto a algunas características, por ejemplo, para asegurarse de que haya la misma proporción de ejemplos positivos y negativos en el conjunto de entrenamiento y prueba.
Hay otra opción que solo implica usar scikit-learn. Como describe la wiki de scikit , puede usar las siguientes instrucciones:
De esta manera, puede mantener sincronizadas las etiquetas de los datos que está intentando dividir en entrenamiento y prueba.
fuente
Solo una nota. En caso de que desee entrenar, probar y conjuntos de validación, puede hacer esto:
Estos parámetros darán un 70% al entrenamiento y un 15% a cada uno de los conjuntos de prueba y val. Espero que esto ayude.
fuente
from sklearn.cross_validation import train_test_split
para dejar en claro qué módulo está utilizandoa=0.7
,b=0.15
,c=0.15
, yd = dataset
,N=len(dataset)
y, a continuaciónx_train = dataset[0:int(a*N)]
,x_test = dataset[int(a*N):int((a+b)*N)]
yx_val = dataset[int((a+b)*N):]
.from sklearn.model_selection import train_test_split
Como el
sklearn.cross_validation
módulo quedó obsoleto, puede usar:fuente
También puede considerar la división estratificada en conjunto de entrenamiento y prueba. La división iniciada también genera conjuntos de entrenamiento y prueba aleatoriamente, pero de tal manera que se conservan las proporciones originales de la clase. Esto hace que los conjuntos de entrenamiento y prueba reflejen mejor las propiedades del conjunto de datos original.
Este código genera:
fuente
value_inds
son verdaderamente índices, pero la salida no son índices, solo máscaras.Escribí una función para mi propio proyecto para hacer esto (aunque no usa numpy):
Si desea que los fragmentos sean aleatorios, simplemente mezcle la lista antes de pasarla.
fuente
Aquí hay un código para dividir los datos en n = 5 pliegues de manera estratificada
fuente
Gracias pberkes por tu respuesta. Lo modifiqué para evitar (1) el reemplazo mientras se tomaban muestras (2) ocurrieron instancias duplicadas tanto en el entrenamiento como en las pruebas:
fuente
Después de leer un poco y tener en cuenta las (muchas ...) formas diferentes de dividir los datos para entrenar y probar, ¡decidí cronometrarlo!
Utilicé 4 métodos diferentes (ninguno de ellos está usando la biblioteca sklearn, que estoy seguro dará los mejores resultados, dado que está bien diseñado y probado código):
el método 3 ganó con mucho con el tiempo más corto, después del método 1, y se descubrió que el método 2 y 4 eran realmente ineficientes.
El código para los 4 métodos diferentes que cronometré:
Y para los tiempos, el tiempo mínimo para ejecutar de 3 repeticiones de 1000 bucles es:
¡Espero que sea de ayuda!
fuente
Es probable que no solo deba dividirse en entrenamiento y prueba, sino también una validación cruzada para asegurarse de que su modelo se generalice. Aquí estoy asumiendo 70% de datos de entrenamiento, 20% de validación y 10% de datos de prueba / retención.
Consulte el np.split :
fuente
Dividido en prueba de tren y válido
fuente