Comment fonctionne le paramètre validation_split de la fonction d'ajustement de Keras?

17

La validation-division dans la fonction d'ajustement du modèle Keras Sequential est documentée comme suit sur https://keras.io/models/sequential/ :

validation_split: Flotter entre 0 et 1. Fraction des données d'apprentissage à utiliser comme données de validation. Le modèle séparera cette fraction des données d'entraînement, ne s'entraînera pas dessus et évaluera la perte et toutes les métriques du modèle sur ces données à la fin de chaque époque. Les données de validation sont sélectionnées parmi les derniers échantillons dans les données x et y fournies, avant de les mélanger.

Veuillez noter la dernière ligne:

Les données de validation sont sélectionnées parmi les derniers échantillons dans les données x et y fournies, avant de les mélanger.

Cela signifie-t-il que les données de validation sont toujours fixes et extraites du bas de l'ensemble de données principal?

Existe-t-il un moyen de sélectionner au hasard une fraction donnée de données dans l'ensemble de données principal?

rnso
la source

Réponses:

17

En fait, vous ne voudriez pas rééchantillonner votre ensemble de validation après chaque époque. Si vous faisiez cela, votre modèle serait formé sur chaque échantillon de votre jeu de données, ce qui entraînerait un surajustement. Vous souhaitez toujours diviser vos données avant le processus de formation, puis l'algorithme ne doit être formé qu'en utilisant le sous-ensemble de données pour la formation.

La fonction telle qu'elle est conçue garantit que les données sont séparées de telle manière qu'elles s'entraînent toujours sur la même partie des données pour chaque époque. Tout mélange est effectué dans l'échantillon d'apprentissage entre les époques si cette option est choisie.

Cependant, pour certains ensembles de données, obtenir les dernières instances n'est pas utile, en particulier si l'ensemble de données est regroupé en fonction de la classe. La distribution de vos cours sera alors biaisée. Ainsi, vous aurez besoin d'une sorte de méthode aléatoire pour extraire un sous-ensemble de données pour obtenir des distributions de classe équilibrées dans l'ensemble de formation et de validation. Pour cela, j'aime toujours utiliser la fonction sklearn comme suit

from sklearn.model_selection import train_test_split

# Split the data
x_train, x_valid, y_train, y_valid = train_test_split(data, labels, test_size=0.33, shuffle= True)

C'est une belle fonction facile à utiliser qui fait ce que vous voulez. Les variables dataet labelssont des matrices numpy standard, la première dimension étant les instances.

JahKnows
la source
1
Je ne voulais pas obtenir un ensemble de tests différent après chaque époque. Je demandais à ce sujet l'obtention de données à la fin de l'ensemble de données, car de nombreux ensembles de données peuvent être organisés selon la classe (comme vous l'avez mentionné). Je sais train_test_splitet maintenant vous confirmez que c'est une meilleure méthode car elle obtiendra au hasard des données de test / validation de l'ensemble de données.
rnso
@rnso, malheureusement, Keras ne propose pas cette option. Je suppose que ce n'est pas vraiment dans le cadre de ce qu'ils veulent offrir. Cela rendrait l'implémentation un peu déroutante avec 2 entrées de méthode différentes avec aléatoire dans le nom.
JahKnows
N'avez-vous pas mélangé la définition des données de validation et de test en utilisant ce train_test_spli?
bagustris
Si vous utilisez le shuffleparamètre, l'utiliseriez-vous également shuffledans le .fitmodèle pour un keras?
Shamoon