Un sur-ajustement peut-il se produire même avec une perte de validation en baisse?

12

J'ai un modèle convolutionnel + LSTM à Keras, similaire à celui-ci (réf 1), que j'utilise pour un concours Kaggle. L'architecture est illustrée ci-dessous. Je l'ai formé sur mon ensemble étiqueté de 11000 échantillons (deux classes, la prévalence initiale est ~ 9: 1, j'ai donc suréchantillonné les 1 à environ un rapport 1/1) pour 50 époques avec une répartition de validation de 20%. pendant un certain temps, mais je pensais qu'il était sous contrôle avec des couches de bruit et d'abandon.

Le modèle avait l'air de s'entraîner à merveille, à la fin, il a obtenu 91% sur l'ensemble de l'ensemble de formation, mais lors des tests sur l'ensemble de données de test, des déchets absolus.

Perte par époque

Précision de validation par époque

Remarque: la précision de validation est supérieure à la précision de la formation. C'est l'opposé du sur-ajustement "typique".

Mon intuition est que, compte tenu de la petite validation de validation, le modèle parvient toujours à s'adapter trop fortement à l'ensemble d'entrée et perd la généralisation. L'autre indice est que val_acc est supérieur à acc, cela semble louche. Est-ce le scénario le plus probable ici?

Si cela est trop adapté, l'augmentation du fractionnement de validation atténuerait-elle cela, ou vais-je rencontrer le même problème, car en moyenne, chaque échantillon verra toujours la moitié du total des époques?

Le modèle:

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

Voici l'appel à adapter le modèle (le poids de la classe est généralement autour de 1: 1 depuis que j'ai suréchantillonné l'entrée):

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 a une règle stupide selon laquelle je ne peux pas poster plus de 2 liens jusqu'à ce que mon score soit plus élevé, voici donc l'exemple au cas où vous seriez intéressé: Ref 1: machinelearningmastery DOT com SLASH séquence-classification-lstm-recurrent-neural-networks- python-keras

DeusXMachina
la source

Réponses:

8

Je ne sais pas si l'ensemble de validation est équilibré ou non. Vous avez un grave problème de déséquilibre des données. Si vous échantillonnez de manière égale et aléatoire dans chaque classe pour former votre réseau, puis qu'un pourcentage de ce que vous avez échantillonné est utilisé pour valider votre réseau, cela signifie que vous vous entraînez et validez en utilisant un ensemble de données équilibré. Lors des tests, vous avez utilisé une base de données déséquilibrée. Cela signifie que vos ensembles de validation et de test ne sont pas équivalents. Dans ce cas, vous pouvez avoir une précision de validation élevée et une faible précision de test. Veuillez trouver cette référence qui parle principalement du problème de déséquilibre des données pour DNN, vous pouvez vérifier comment ils échantillonnent pour faire la formation, la validation et les tests https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf

Bashar Haddad
la source
1
L'ensemble de validation est extrait du même ensemble que l'ensemble d'apprentissage. Je ne suis pas sûr à 100%, mais je crois que Keras prend la coupe de validation avant de mélanger et de former (c'est-à-dire si vous lui fournissez des données non mélangées, le fractionnement de validation coupe une partie de votre distribution). J'ai donc équilibré et mélangé manuellement avant de passer à Keras. Le seul problème pourrait être que je duplique les 1 et que j'ajoute du bruit gaussien, ce qui peut améliorer la sur-adaptation.
DeusXMachina
2
Je pense que vous n'avez pas besoin de dépendre de Keras pour faire la validation, vous pouvez diviser vos données en trois parties. Formation, validation et tests. Échantillon des données de formation et formez votre réseau. Ne jouez pas avec la distribution dans les ensembles de validation et de test. Optimisez votre réseau sur l'ensemble de validation, puis vérifiez l'ensemble de test. J'ai modifié ma réponse pour ajouter une référence utile
Bashar Haddad
5

Si votre perte d'entraînement est inférieure à votre perte de validation, vous êtes en surapprentissage , même si la validation est toujours en baisse.

C'est le signe que votre réseau apprend des schémas dans le train qui ne sont pas applicables dans celui de validation

audacieux
la source
Je comprends que la perte d'entraînement va moins que la perte de validation - c'est tout simplement trop adapté à l'ensemble d'entraînement. Mais la précision de validation est supérieure à la précision de la formation . C'est la partie bizarre!
DeusXMachina
Pas si vos sets sont déséquilibrés. Par exemple, dans un classificateur binaire, si vous avez moins 1 en proportion dans le jeu de validation, et que votre modèle ne produit que 0s, vous auriez une précision de validation plus élevée
bold