J'ai un dataframe pandas et je souhaite le diviser en 3 ensembles séparés. Je sais qu'en utilisant train_test_split from sklearn.cross_validation
, on peut diviser les données en deux ensembles (train et test). Cependant, je n'ai trouvé aucune solution pour diviser les données en trois ensembles. De préférence, j'aimerais avoir les indices des données d'origine.
Je sais qu'une solution de contournement serait d'utiliser train_test_split
deux fois et d'ajuster en quelque sorte les indices. Mais existe-t-il un moyen plus standard / intégré de diviser les données en 3 ensembles au lieu de 2?
Réponses:
Solution numpy. Nous allons d'abord mélanger l'ensemble de données entier (df.sample (frac = 1)), puis diviser notre ensemble de données dans les parties suivantes:
[int(.6*len(df)), int(.8*len(df))]
- est unindices_or_sections
tableau pour numpy.split () .Voici une petite démonstration d'
np.split()
utilisation - divisons le tableau de 20 éléments en les parties suivantes: 80%, 10%, 10%:la source
frac=1
demande à lasample()
fonction de renvoyer toutes les lignes (100%
ou fraction =1.0
)np.random.seed(any_number)
avant la ligne de division pour obtenir le même résultat à chaque exécution. Deuxièmement, pour faire des rapports inégaux comme l'train:test:val::50:40:10
utilisation[int(.5*len(dfn)), int(.9*len(dfn))]
. Ici, le premier élément indique la taille pourtrain
(0,5%), le deuxième élément indique la taille pourval
(1-0,9 = 0,1%) et la différence entre les deux indique la taille pourtest
(0,9-0,5 = 0,4%). Corrigez-moi si je me trompe :)Remarque:
La fonction a été écrite pour gérer l'amorçage de la création d'ensemble aléatoire. Vous ne devez pas vous fier à un fractionnement d'ensemble qui ne randomise pas les ensembles.
Manifestation
la source
Cependant, une approche pour diviser l'ensemble de données en
train
,test
,cv
avec0.6
,0.2
,0.2
serait d'utiliser latrain_test_split
méthode deux fois.la source
np.split()
. En outre, il ne nécessite pas de dépendance supplémentaire sursklearn
.Voici une fonction Python qui divise une trame de données Pandas en trames de données d'entraînement, de validation et de test avec un échantillonnage stratifié. Il effectue cette division en appelant
train_test_split()
deux fois la fonction de scikit-learn .Voici un exemple de travail complet.
Considérez un ensemble de données qui a une étiquette sur laquelle vous souhaitez effectuer la stratification. Cette étiquette a sa propre distribution dans l'ensemble de données d'origine, disons 75%
foo
, 15%bar
et 10%baz
. Maintenant, divisons l'ensemble de données en train, validation et test en sous-ensembles en utilisant un ratio 60/20/20, où chaque division conserve la même distribution des étiquettes. Voir l'illustration ci-dessous:Voici l'exemple d'ensemble de données:
Maintenant, appelons la
split_stratified_into_train_val_test()
fonction ci-dessus pour obtenir des trames de données d'entraînement, de validation et de test suivant un rapport 60/20/20.Les trois dataframes
df_train
,df_val
etdf_test
contiennent toutes les lignes d'origine, mais leurs tailles suivront le rapport ci-dessus.De plus, chacune des trois divisions aura la même répartition du label, à savoir 75%
foo
, 15%bar
et 10%baz
.la source
Il est très pratique à utiliser
train_test_split
sans effectuer de réindexation après avoir divisé en plusieurs ensembles et ne pas écrire de code supplémentaire. La meilleure réponse ci-dessus ne mentionne pas qu'en séparant deux fois entrain_test_split
ne modifiant pas la taille des partitions, cela ne donnera pas la partition initialement prévue:Ensuite, la partie des ensembles de validation et de test dans le x_remain change et pourrait être comptée comme
Dans cette occasion, toutes les partitions initiales sont enregistrées.
la source