¿Cuál es una buena manera de dividir una matriz NumPy aleatoriamente en el conjunto de datos de prueba y prueba/validación? Algo similar a las funciones cvpartition
o crossvalind
en Matlab.Cómo dividir/particionar un conjunto de datos en conjuntos de datos de entrenamiento y prueba para, por ejemplo, validación cruzada?
Respuesta
Si desea dividir el conjunto de datos una vez en dos mitades, puede utilizar numpy.random.shuffle
o numpy.random.permutation
si necesita hacer 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 hay muchas formas de repeatedly partition the same data set for cross validation. Una estrategia es volver a muestrear a partir del conjunto de datos, con la 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,:]
Por último, sklearn contiene several cross validation methods (k veces, deje-N-Out, ...). También incluye métodos más avanzados "stratified sampling" 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.
escribí una función para mi propio proyecto para hacer esto (que no utiliza numpy, sin embargo):
def partition(seq, chunks):
"""Splits the sequence into equal sized chunks and them as a list"""
result = []
for i in range(chunks):
chunk = []
for element in seq[i:len(seq):chunks]:
chunk.append(element)
result.append(chunk)
return result
si desea que los trozos que se asignaron al azar, simplemente barajar la lista antes de pasarla en
Hay otra opción que solo implica el uso de scikit-learn. Como scikit's wiki describes, sólo puede utilizar las siguientes instrucciones:
from sklearn.model_selection import train_test_split
data, labels = np.arange(10).reshape((5, 2)), range(5)
data_train, data_test, labels_train, labels_test = train_test_split(data, labels, test_size=0.20, random_state=42)
esta manera se puede mantener en sincronía las etiquetas para los datos que está tratando de dividir a la formación y la prueba.
También puede considerar la división estratificada en un conjunto de entrenamiento y prueba. La división iniciada también genera un conjunto de entrenamiento y prueba al azar, pero de tal manera que se conservan las proporciones de clase originales. Esto hace que los conjuntos de entrenamiento y prueba reflejen mejor las propiedades del conjunto de datos original.
import numpy as np
def get_train_test_inds(y,train_proportion=0.7):
'''Generates indices, making random stratified split into training set and testing sets
with proportions train_proportion and (1-train_proportion) of initial sample.
y is any iterable indicating classes of each observation in the sample.
Initial proportions of classes inside training and
testing sets are preserved (stratified sampling).
'''
y=np.array(y)
train_inds = np.zeros(len(y),dtype=bool)
test_inds = np.zeros(len(y),dtype=bool)
values = np.unique(y)
for value in values:
value_inds = np.nonzero(y==value)[0]
np.random.shuffle(value_inds)
n = int(train_proportion*len(value_inds))
train_inds[value_inds[:n]]=True
test_inds[value_inds[n:]]=True
return train_inds,test_inds
y = np.array([1,1,2,2,3,3])
train_inds,test_inds = get_train_test_inds(y,train_proportion=0.5)
print y[train_inds]
print y[test_inds]
Este código salidas:
[1 2 3]
[1 2 3]
¡Gracias! La denominación es algo engañosa, 'value_inds' son realmente índices, pero los resultados no son índices, solo máscaras. – greenoldman
sólo una nota. En caso de que quiera tren, probar y conjuntos de validación, usted puede hacer esto:
from sklearn.cross_validation import train_test_split
X = get_my_X()
y = get_my_y()
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
x_test, x_val, y_test, y_val = train_test_split(x_test, y_test, test_size=0.5)
Estos parámetros darán 70% a la formación, y el 15% cada uno para probar y conjuntos val. Espero que esto ayude.
Aquí es un código para dividir los datos en n = 5 pliegues de forma estratificada
% X = data array
% y = Class_label
from sklearn.cross_validation import StratifiedKFold
skf = StratifiedKFold(y, n_folds=5)
for train_index, test_index in skf:
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
, gracias pberkes por su respuesta.Yo sólo lo modificó para evitar (1) reemplazo mientras prueba (2) casos duplicados se produjeron tanto en la formación y las pruebas:
training_idx = np.random.choice(X.shape[0], int(np.round(X.shape[0] * 0.8)),replace=False)
training_idx = np.random.permutation(np.arange(X.shape[0]))[:np.round(X.shape[0] * 0.8)]
test_idx = np.setdiff1d(np.arange(0,X.shape[0]), training_idx)
Como está desfasada sklearn.cross_validation
módulo, se pueden utilizar:
import numpy as np
from sklearn.model_selection import train_test_split
X, y = np.arange(10).reshape((5, 2)), range(5)
X_trn, X_tst, y_trn, y_tst = train_test_split(X, y, test_size=0.2, random_state=42)
- 1. ¿Dividir datos en conjuntos de datos de entrenamiento/prueba en MATLAB?
- 2. Conjuntos de datos para entrenamiento de red neuronal
- 3. Generar conjuntos para la validación cruzada
- 4. Cómo utilizar combinaciones de conjuntos como datos de prueba
- 5. Normalización/validación para conjuntos de datos internacionales en una base de datos?
- 6. Cómo cargar datos de entrenamiento en PyBrain?
- 7. validación cruzada en I
- 8. LibSVM: opción -wi (selección de peso) durante la validación cruzada y prueba
- 9. Ayuda Comprensión de validación cruzada y árboles de decisión
- 10. estratificado 10 veces la validación cruzada
- 11. Pasar por los conjuntos de datos
- 12. SQLite para grandes conjuntos de datos?
- 13. Conjuntos de datos para generación realista de datos aleatorios/de prueba
- 14. ¿Cómo usar solo ciertos conjuntos de validación para validar datos en Cake PHP?
- 15. Redes neuronales: ejemplo de fuente abierta mínima con datos de entrenamiento exhaustivos?
- 16. Datos de entrenamiento para el análisis de sentimientos
- 17. Marcos generales para preparar los datos de entrenamiento?
- 18. Referencia cruzada en varias bases de datos
- 19. Conjuntos de datos grandes y gratuitos para experimentar con Hadoop
- 20. Proceso para comparar dos conjuntos de datos
- 21. Conjuntos de datos fuertemente tipados y cambios de esquema
- 22. Prueba de múltiples conjuntos de datos con ScalaTest
- 23. Cómo generar datos de prueba para un algoritmo "agrupar por datos de otras filas"
- 24. escalando los datos de prueba para LIBSVM: implementación de MATLAB
- 25. detección Group en conjuntos de datos
- 26. Conjuntos de datos grandes
- 27. Generación automática de conjuntos de datos DBUnit
- 28. validación cruzada 10 veces
- 29. ¿Cómo puedo consultar eficientemente conjuntos contiguos de fechas en mi conjunto de datos?
- 30. Cómo filtrar y combinar 2 conjuntos de datos en C#
gracias por estos soluciones. Pero, ¿no es cierto que el último método, usando randint, tiene buenas posibilidades de proporcionar los mismos índices para los conjuntos de prueba y entrenamiento? – ggauravr