¿Puede ocurrir un sobreajuste incluso con una pérdida de validación que sigue cayendo?

12

Tengo un modelo convolucional + LSTM en Keras, similar a este (ref. 1), que estoy usando para un concurso de Kaggle. La arquitectura se muestra a continuación. Lo he entrenado en mi conjunto etiquetado de 11000 muestras (dos clases, la prevalencia inicial es ~ 9: 1, así que tomé muestras de 1 a aproximadamente una proporción de 1/1) durante 50 épocas con una división de validación del 20%. por un tiempo, pero pensé que lo tenía bajo control con ruido y capas de deserción.

El modelo parecía que estaba entrenando maravillosamente, al final obtuvo un 91% en la totalidad del conjunto de entrenamiento, pero al probar en el conjunto de datos de prueba, basura absoluta.

Pérdida por época

Precisión de validación por época

Aviso: la precisión de la validación es mayor que la precisión del entrenamiento. Esto es lo opuesto al sobreajuste "típico".

Mi intuición es que, dada la división de validación pequeña, el modelo todavía se las arregla para ajustarse demasiado al conjunto de entrada y pierde la generalización. La otra pista es que val_acc es mayor que acc, eso parece sospechoso. ¿Es ese el escenario más probable aquí?

Si esto es un ajuste excesivo, ¿el aumento de la división de validación mitigaría esto en absoluto, o me voy a encontrar con el mismo problema, ya que, en promedio, cada muestra todavía verá la mitad de las épocas totales?

El modelo:

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

Aquí está la llamada para ajustarse al modelo (el peso de la clase es típicamente alrededor de 1: 1 desde que tomé muestras de la entrada):

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 tiene una regla tonta de que no puedo publicar más de 2 enlaces hasta que mi puntaje sea más alto, así que aquí está el ejemplo en caso de que esté interesado: Ref 1: machinelearningmastery DOT com SLASH secuencia-clasificación-lstm-recurrente-neural-networks- pitón-keras

DeusXMachina
fuente

Respuestas:

8

No estoy seguro de si el conjunto de validación está equilibrado o no. Tiene un problema grave de desequilibrio de datos. Si realiza un muestreo igual y aleatorio de cada clase para entrenar su red, y luego se utiliza un porcentaje de lo que muestreó para validar su red, esto significa que entrena y valida usando un conjunto de datos equilibrado. En las pruebas usaste una base de datos desequilibrada. Esto significa que sus conjuntos de validación y prueba no son equivalentes. En tal caso, puede tener una alta precisión de validación y baja precisión de prueba. Encuentre esta referencia que habla principalmente sobre el problema de desequilibrio de datos para DNN, puede verificar cómo realizan muestras para realizar la capacitación, validación y pruebas https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf

Bashar Haddad
fuente
1
El conjunto de validación se extrae del mismo conjunto que el conjunto de entrenamiento. No estoy 100% seguro, pero creo que Keras toma el corte de validación antes de mezclar y entrenar (es decir, si alimenta los datos sin mezclar, la validación divide parte de su distribución). Así que balanceo y barajo manualmente antes de pasar a Keras. El único problema podría ser que estoy duplicando los 1 y agregando ruido gaussiano, lo que puede mejorar el sobreajuste.
DeusXMachina
2
Creo que no necesita depender de Keras para hacer la validación, puede dividir sus datos en tres partes. Formación, validación y pruebas. Muestra de los datos de entrenamiento y entrena tu red. No juegues con la distribución en los conjuntos de validación y prueba. Optimice su red en el conjunto de validación y luego verifique el conjunto de prueba. Edité mi respuesta para agregar una referencia útil
Bashar Haddad el
5

Si su pérdida de entrenamiento cae por debajo de su pérdida de validación, está sobreajustando , incluso si la validación sigue cayendo.

Es la señal de que su red está aprendiendo patrones en el conjunto de trenes que no son aplicables en la validación.

negrita
fuente
Entiendo que la pérdida de entrenamiento va menos que la pérdida de validación; esto es solo un ajuste excesivo para el conjunto de entrenamiento. Pero la precisión de la validación es mayor que la precisión del entrenamiento . Esa es la parte rara!
DeusXMachina
No si tus sets están desequilibrados. Por ejemplo, en un clasificador binario, si tiene menos 1 en proporción en el conjunto de validación, y su modelo solo genera 0s, tendría una mayor precisión de validación
negrita