Wie funktioniert der Parameter validation_split der Anpassungsfunktion von Keras?


17

Die Aufteilung der Validierung in Keras Sequential Model Fit-Funktionen ist unter https://keras.io/models/sequential/ wie folgt dokumentiert :

validation_split: Float zwischen 0 und 1. Bruchteil der Trainingsdaten, die als Validierungsdaten verwendet werden sollen. Das Modell unterscheidet diesen Teil der Trainingsdaten, trainiert ihn nicht und bewertet den Verlust und alle Modellmetriken für diese Daten am Ende jeder Epoche. Die Validierungsdaten werden aus den letzten Abtastwerten in den bereitgestellten x- und y-Daten vor dem Mischen ausgewählt.

Bitte beachten Sie die letzte Zeile:

Die Validierungsdaten werden vor dem Mischen aus den letzten Abtastwerten in den bereitgestellten x- und y-Daten ausgewählt.

Bedeutet dies, dass die Validierungsdaten immer fest und am Ende des Hauptdatensatzes abgelegt sind?

Gibt es eine Möglichkeit, einen bestimmten Datenanteil aus dem Hauptdatensatz zufällig auszuwählen?

Antworten:


17

Eigentlich möchten Sie Ihren Validierungssatz nicht nach jeder Epoche erneut testen. Wenn Sie dies tun, wird Ihr Modell an jeder einzelnen Probe in Ihrem Datensatz trainiert und dies führt zu einer Überanpassung. Sie möchten Ihre Daten immer vor dem Trainingsprozess aufteilen und dann sollte der Algorithmus nur unter Verwendung der Teilmenge der zu trainierenden Daten trainiert werden.

Die Funktion, wie sie entworfen wurde, stellt sicher, dass die Daten so getrennt werden, dass sie für jede Epoche immer den gleichen Teil der Daten trainieren. Jegliches Mischen wird innerhalb des Trainingsbeispiels zwischen den Epochen durchgeführt, wenn diese Option ausgewählt ist.

Für einige Datasets ist es jedoch nicht sinnvoll, die letzten paar Instanzen abzurufen, insbesondere wenn das Dataset anhand der Klasse neu gruppiert wird. Dann wird die Verteilung Ihrer Klassen verzerrt. Daher benötigen Sie eine zufällige Methode, um eine Teilmenge der Daten zu extrahieren, um eine ausgewogene Klassenverteilung im Trainings- und Validierungssatz zu erhalten. Dafür benutze ich immer gerne die sklearn-Funktion wie folgt

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)

Es ist eine schöne, einfach zu bedienende Funktion, die das macht, was Sie wollen. Die Variablen dataund labelssind Standard-Zahlenmatrizen, wobei die erste Dimension die Instanzen sind.


1
Ich wollte nicht nach jeder Epoche einen anderen Testsatz bekommen. Ich habe darum gebeten, Daten vom Ende des Datensatzes abzurufen, da viele Datensätze möglicherweise nach Klassen geordnet sind (wie Sie erwähnt haben). Ich weiß darüber Bescheid train_test_splitund jetzt bestätigen Sie, dass dies eine bessere Methode ist, da zufällig Test- / Validierungsdaten aus dem Datensatz abgerufen werden.
RNSO

@rnso, leider bietet Keras diese Option nicht an. Ich denke, es liegt nicht wirklich im Rahmen dessen, was sie anbieten wollen. Wäre die Implementierung etwas verwirrend, wenn man 2 verschiedene Methodeneingaben mit zufälligem Namen hätte.
JahKnows

Haben Sie die Definition von Validierungs- und Testdaten nicht mit diesem train_test_spli gemischt?
Bagustris

Wenn Sie die Verwendung shuffleParameter, würden Sie auch shufflein der .fitfür ein keras Modell?
Shamoon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.