Come funziona il parametro validation_split della funzione fit di Keras?


17

La suddivisione della convalida nella funzione di adattamento del modello sequenziale di Keras è documentata come segue su https://keras.io/models/sequential/ :

validation_split: Float tra 0 e 1. Frazione dei dati di allenamento da utilizzare come dati di validazione. Il modello separerà questa frazione dei dati di addestramento, non si allenerà su di esso e valuterà la perdita e le eventuali metriche del modello su questi dati alla fine di ogni epoca. I dati di convalida vengono selezionati dagli ultimi campioni nei dati xey forniti, prima di mescolarli.

Si prega di notare l'ultima riga:

I dati di convalida vengono selezionati dagli ultimi campioni nei dati xey forniti, prima di mescolarli.

Significa che i dati di convalida sono sempre corretti e presi dal fondo del set di dati principale?

Esiste un modo per selezionare casualmente una determinata frazione di dati dal set di dati principale?

Risposte:


17

In realtà non vorresti ricampionare il tuo set di validazione dopo ogni epoca. Se lo facessi, il tuo modello verrebbe addestrato su ogni singolo campione nel tuo set di dati e ciò provocherebbe un eccesso di adattamento. Si desidera dividere sempre i dati prima del processo di training e quindi l'algoritmo deve essere addestrato utilizzando solo il sottoinsieme dei dati per il training.

La funzione così come progettata assicura che i dati siano separati in modo tale che si alleni sempre sulla stessa porzione di dati per ogni epoca. Tutto il mescolamento viene eseguito all'interno del campione di allenamento tra epoche se viene scelta quell'opzione.

Tuttavia, per alcuni set di dati ottenere le ultime istanze non è utile, in particolare se il set di dati è riorganizzato in base alla classe. Quindi la distribuzione delle lezioni sarà distorta. Quindi avrai bisogno di un modo casuale per estrarre un sottoinsieme dei dati per ottenere distribuzioni di classe bilanciate nel set di addestramento e validazione. Per questo mi piace sempre usare la funzione sklearn come segue

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)

È una bella funzione facile da usare che fa quello che vuoi. Le variabili datae labelssono matrici intorpidite standard con la prima dimensione che sono le istanze.


1
Non intendevo ottenere set di test diversi dopo ogni epoca. Stavo chiedendo di ottenere i dati dalla fine del set di dati poiché molti set di dati possono essere organizzati in base alla classe (come hai detto). Conosco train_test_splite ora confermi che questo è un metodo migliore poiché otterrà casualmente i dati di test / convalida dal set di dati.
anche il

@rnso, sfortunatamente Keras non offre questa opzione. Immagino che non rientri davvero nell'ambito di ciò che vogliono offrire. Renderebbe l'implementazione un po 'confusa avendo 2 input di metodi diversi con random nel nome.
JahKnows,

Non hai mescolato la definizione di validazione e dati di test usando quel train_test_spli?
Bagustris,

Se utilizzi il shuffleparametro, utilizzeresti anche shuffleil .fitmodello for per keras?
Shamoon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.