即使验证损失仍在下降,是否会发生过度拟合?

数据挖掘 喀拉斯 交叉验证 过拟合
2021-09-20 01:46:24

我在 Keras 中有一个卷积 + LSTM 模型,类似于这个(参考 1),我在 Kaggle 比赛中使用它。架构如下所示。我已经在我标记的 11000 个样本集(两个类别,初始流行度约为 9:1,所以我将 1 的样本上采样到大约 1/1 的比率)训练了 50 个 epoch,其中 20% 的验证拆分。我得到了明显的过度拟合有一段时间,但我认为它可以通过噪声和丢失层来控制。

模型看起来训练非常好,最终在整个训练集上得分 91%,但在测试数据集上进行测试,绝对垃圾。

历元损失

按时代划分的验证准确性

注意:验证准确率高于训练准确率。这与“典型”过拟合相反。

我的直觉是,考虑到较小的验证拆分,该模型仍然设法过强地适应输入集并失去泛化能力。另一个线索是 val_acc 大于 acc,这看起来很可疑。这是最有可能的情况吗?

如果这是过度拟合,增加验证拆分会完全缓解这种情况,还是我会遇到同样的问题,因为平均而言,每个样本仍然会看到总时期的一半?

该模型:

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

这是拟合模型的调用(类权重通常约为 1:1,因为我对输入进行了上采样):

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 有一些愚蠢的规则,我可以发布不超过 2 个链接,直到我的分数更高,所以如果你有兴趣,这里有一个例子:参考 1:machinelearningmastery DOT com SLASH sequence-classification-lstm-recurrent-neural-networks- python-keras

2个回答

我不确定验证集是否平衡。你有一个严重的数据不平衡问题。如果您从每个类中平均随机抽样来训练您的网络,然后将您抽样的一部分用于验证您的网络,这意味着您使用平衡数据集进行训练和验证。在测试中,您使用了不平衡的数据库。这意味着您的验证和测试集是不等价的。在这种情况下,您可能具有较高的验证准确度和较低的测试准确度。请找到这个主要讨论 DNN 的数据不平衡问题的参考资料,您可以查看他们如何采样来进行训练、验证和测试

如果您的训练损失低于验证损失,即使验证仍在下降,您也是过拟合。

这表明您的网络正在学习训练集中的模式,而这些模式不适用于验证模式