Ich habe ein Faltungs + LSTM-Modell in Keras, ähnlich wie dieses (Ref. 1), das ich für einen Kaggle-Wettbewerb verwende. Die Architektur ist unten dargestellt. Ich habe es auf meinem etikettierten Satz von 11000 Proben trainiert (zwei Klassen, anfängliche Prävalenz ist ~ 9: 1, daher habe ich die 1 auf etwa 1/1 hochgerechnet) für 50 Epochen mit 20% Validierungssplit für eine Weile, aber ich dachte, es hat es unter Kontrolle gebracht mit Lärm und Dropout-Schichten.
Das Modell sah aus, als würde es wunderbar trainieren. Am Ende wurden 91% des gesamten Trainingssatzes erzielt, aber beim Testen des Testdatensatzes lag absoluter Müll vor.
Hinweis: Die Validierungsgenauigkeit ist höher als die Trainingsgenauigkeit. Dies ist das Gegenteil von "typischer" Überanpassung.
Ich habe die Intuition, dass das Modell angesichts der kleinen Teilung der Validierung immer noch zu stark in die Eingabemenge passt und die Generalisierung verliert. Der andere Hinweis ist, dass val_acc größer als acc ist, was faul zu sein scheint. Ist das hier das wahrscheinlichste Szenario?
Wenn dies überpassend ist, würde eine Erhöhung des Validierungssplits dies überhaupt abmildern, oder werde ich auf dasselbe Problem stoßen, da im Durchschnitt jede Stichprobe immer noch die Hälfte der gesamten Epochen aufweist?
Das Model:
Layer (type) Output Shape Param # Connected to
====================================================================================================
convolution1d_19 (Convolution1D) (None, None, 64) 8256 convolution1d_input_16[0][0]
____________________________________________________________________________________________________
maxpooling1d_18 (MaxPooling1D) (None, None, 64) 0 convolution1d_19[0][0]
____________________________________________________________________________________________________
batchnormalization_8 (BatchNormal(None, None, 64) 128 maxpooling1d_18[0][0]
____________________________________________________________________________________________________
gaussiannoise_5 (GaussianNoise) (None, None, 64) 0 batchnormalization_8[0][0]
____________________________________________________________________________________________________
lstm_16 (LSTM) (None, 64) 33024 gaussiannoise_5[0][0]
____________________________________________________________________________________________________
dropout_9 (Dropout) (None, 64) 0 lstm_16[0][0]
____________________________________________________________________________________________________
batchnormalization_9 (BatchNormal(None, 64) 128 dropout_9[0][0]
____________________________________________________________________________________________________
dense_23 (Dense) (None, 64) 4160 batchnormalization_9[0][0]
____________________________________________________________________________________________________
dropout_10 (Dropout) (None, 64) 0 dense_23[0][0]
____________________________________________________________________________________________________
dense_24 (Dense) (None, 2) 130 dropout_10[0][0]
====================================================================================================
Total params: 45826
Hier ist der Aufruf zum Anpassen des Modells (die Klassengewichtung liegt normalerweise bei 1: 1, da ich die Eingabe hochgerechnet habe):
class_weight= {0:1./(1-ones_rate), 1:1./ones_rate} # automatically balance based on class occurence
m2.fit(X_train, y_train, nb_epoch=50, batch_size=64, shuffle=True, class_weight=class_weight, validation_split=0.2 )
SE hat eine dumme Regel, die besagt, dass ich nicht mehr als 2 Links posten kann, bis meine Punktzahl höher ist. Hier ist das Beispiel, falls Sie interessiert sind: Ref 1: Maschinenlernen-Meisterschaft Python-Keras