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.
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