Quel est un bon moyen de diviser un tableau NumPy de manière aléatoire en un ensemble de données d'entraînement et de test / validation? Quelque chose de similaire aux fonctions cvpartition
ou crossvalind
dans Matlab.
Quel est un bon moyen de diviser un tableau NumPy de manière aléatoire en un ensemble de données d'entraînement et de test / validation? Quelque chose de similaire aux fonctions cvpartition
ou crossvalind
dans Matlab.
Si vous souhaitez diviser l'ensemble de données une fois en deux moitiés, vous pouvez utiliser numpy.random.shuffle
, ou numpy.random.permutation
si vous avez besoin de garder une trace des indices:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]
ou
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,:]
Il existe de nombreuses façons de partitionner à plusieurs reprises le même ensemble de données pour la validation croisée . Une stratégie consiste à rééchantillonner à partir de l'ensemble de données, avec répétition:
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,:]
Enfin, sklearn contient plusieurs méthodes de validation croisée (k-fold , Leave -n-out, ...). Il comprend également des méthodes plus avancées «d'échantillonnage stratifié» qui créent une partition des données équilibrée par rapport à certaines caractéristiques, par exemple pour s'assurer qu'il y a la même proportion d'exemples positifs et négatifs dans l'ensemble d'apprentissage et de test.
Il existe une autre option qui implique simplement d'utiliser scikit-learn. Comme le décrit le wiki de scikit , vous pouvez simplement utiliser les instructions suivantes:
De cette façon, vous pouvez synchroniser les étiquettes des données que vous essayez de diviser en entraînement et en test.
la source
Juste une note. Si vous souhaitez entraîner, tester et valider des ensembles, vous pouvez le faire:
Ces paramètres donneront 70% à la formation et 15% chacun pour tester et valider les ensembles. J'espère que cela t'aides.
la source
from sklearn.cross_validation import train_test_split
pour préciser le module que vous utiliseza=0.7
,b=0.15
,c=0.15
etd = dataset
,N=len(dataset)
puisx_train = dataset[0:int(a*N)]
,x_test = dataset[int(a*N):int((a+b)*N)]
etx_val = dataset[int((a+b)*N):]
.from sklearn.model_selection import train_test_split
Le
sklearn.cross_validation
module étant obsolète, vous pouvez utiliser:la source
Vous pouvez également envisager une division stratifiée en ensemble de formation et de test. La division Startified génère également un ensemble de formation et de tests de manière aléatoire, mais de manière à conserver les proportions de classe d'origine. Cela permet aux ensembles de formation et de test de mieux refléter les propriétés de l'ensemble de données d'origine.
Ce code génère:
la source
value_inds
sont vraiment des indices, mais la sortie ne sont pas des indices, seulement des masques.J'ai écrit une fonction pour mon propre projet pour faire cela (il n'utilise pas numpy, cependant):
Si vous voulez que les morceaux soient randomisés, mélangez simplement la liste avant de la transmettre.
la source
Voici un code pour diviser les données en n = 5 fois de manière stratifiée
la source
Merci pberkes pour votre réponse. Je viens de le modifier pour éviter (1) le remplacement lors de l'échantillonnage (2) des instances dupliquées se sont produites à la fois lors de la formation et des tests:
la source
Après avoir fait quelques lectures et pris en compte les (nombreuses ..) différentes façons de fractionner les données à entraîner et à tester, j'ai décidé de timeit!
J'ai utilisé 4 méthodes différentes (aucune d'entre elles n'utilise la bibliothèque sklearn, qui, j'en suis sûr, donnera les meilleurs résultats, étant donné que c'est un code bien conçu et testé):
la méthode 3 a gagné de loin avec le temps le plus court, après cette méthode 1, et les méthodes 2 et 4 se sont révélées vraiment inefficaces.
Le code pour les 4 méthodes différentes que j'ai chronométrées:
Et pour les temps, le temps minimum pour exécuter sur 3 répétitions de 1000 boucles est:
J'espère que c'est utile!
la source
Vous devrez probablement non seulement vous diviser en train et tester, mais également effectuer une validation croisée pour vous assurer que votre modèle se généralise. Ici, je suppose que 70% de données d'entraînement, 20% de validation et 10% de données de maintien / test.
Découvrez le np.split :
la source
Split en train test et valide
la source