O sobreajuste pode ocorrer mesmo com a perda de validação ainda caindo?

12

Eu tenho um modelo convolucional + LSTM em Keras, semelhante a este (ref 1), que estou usando para um concurso Kaggle. A arquitetura é mostrada abaixo. Eu o treinei no meu conjunto rotulado de 11000 amostras (duas classes, a prevalência inicial é de ~ 9: 1, então eu ampliei os 1 para uma proporção de 1/1) em 50 épocas com 20% de divisão de validação. por um tempo, mas achei que o controle estava sob as camadas de ruído e evasão.

O modelo parecia estar treinando maravilhosamente, no final obteve 91% em todo o conjunto de treinamento, mas após o teste no conjunto de dados de teste, lixo absoluto.

Perda por época

Precisão da validação por época

Aviso: a precisão da validação é maior que a precisão do treinamento. Isso é o oposto do sobreajuste "típico".

Minha intuição é que, dada a pequena divisão de validação, o modelo ainda está conseguindo se ajustar muito fortemente ao conjunto de entradas e está perdendo generalização. A outra pista é que val_acc é maior que acc, isso parece suspeito. Esse é o cenário mais provável aqui?

Se isso for excessivo, o aumento da divisão de validação mitigaria isso de alguma forma, ou vou abordar o mesmo problema, já que, em média, cada amostra ainda verá metade das épocas totais?

O 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

Aqui está a chamada para ajustar o modelo (o peso da classe geralmente é de 1: 1 desde que eu ampliei a 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 tem alguma regra boba que eu não posso postar mais de 2 links até que minha pontuação seja maior, então aqui está o exemplo no caso de você estar interessado: Ref 1: machinelearningmastery DOT com SLASH sequência-classificação-lstm-recorrente-redes neurais- python-keras

DeusXMachina
fonte

Respostas:

8

Não tenho certeza se o conjunto de validação é equilibrado ou não. Você tem um grave problema de desequilíbrio de dados. Se você fizer uma amostragem igual e aleatória de cada classe para treinar sua rede e, em seguida, uma porcentagem do que você amostrou for usada para validar sua rede, isso significa que você treina e valida usando um conjunto de dados balanceado. Nos testes, você usou o banco de dados desequilibrado. Isso significa que seus conjuntos de validação e teste não são equivalentes. Nesse caso, você pode ter alta precisão de validação e baixa precisão de teste. Por favor, encontre esta referência que fala principalmente sobre o problema de desequilíbrio de dados para DNN, você pode verificar como eles amostram para fazer o treinamento, validação e teste https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf

Bashar Haddad
fonte
1
O conjunto de validação é extraído do mesmo conjunto que o conjunto de treinamento. Não tenho 100% de certeza, mas acredito que o Keras aceita o corte de validação antes de embaralhar e treinar (ou seja, se você fornecer dados não embaralhados, a divisão de validação cortará parte de sua distribuição). Então, eu balanço manualmente e embaralhe antes de passar para Keras. O único problema é que eu estou duplicando o 1 e adicionando ruído gaussiano, o que pode estar melhorando o excesso de ajuste.
precisa saber é o seguinte
2
Eu acho que você não precisa depender de Keras para fazer a validação, você pode dividir seus dados em três partes. Treinamento, validação e teste. Faça uma amostra dos dados de treinamento e treine sua rede. Não brinque com a distribuição nos conjuntos de validação e teste. Otimize sua rede no conjunto de validação e verifique o conjunto de testes. Eu editei a minha resposta para adicionar uma referência útil
Bashar Haddad
5

Se a sua perda de treinamento estiver abaixo da perda de validação, você estará se ajustando demais , mesmo se a validação ainda estiver caindo.

É o sinal de que sua rede está aprendendo padrões no conjunto de trens que não são aplicáveis ​​na validação

negrito
fonte
Entendo que a perda de treinamento é menor do que a perda de validação - isso é apenas uma adaptação ao conjunto de treinamento. Mas a precisão da validação é maior que a precisão do treinamento . Essa é a parte estranha!
DeusXMachina
Não se seus aparelhos estiverem desequilibrados. Por exemplo, em um classificador binário, se você tiver menos 1 em proporção no conjunto de validação e seu modelo gerar apenas 0s, você terá uma maior precisão de validação
negrito