即使验证损失仍然下降,也可能发生过度拟合吗?


12

我在Keras中有一个卷积+ LSTM模型,与此类似(参考文献1),我正在用它进行Kaggle竞赛。架构如下所示。我已经在我标记的11000个样本集上进行了训练(两个类别,初始患病率是〜9:1,所以我将1的样本上采样到大约1/1的比例)进行了50个时期的验证,拆分率为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序列分类-lstm-recurrent-neural-networks- python-keras

Answers:


8

我不确定验证集是否平衡。您有严重的数据不平衡问题。如果您从每个类中平均随机抽样以训练网络,然后将所抽样的百分比用于验证网络,这意味着您将使用平衡数据集进行训练和验证。在测试中,您使用了不平衡的数据库。这意味着您的验证和测试集不相同。在这种情况下,您可能具有很高的验证准确性和较低的测试准确性。请找到主要针对DNN的数据不平衡问题的参考资料,您可以检查它们如何进行训练,验证和测试https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf


1
验证集是从与训练集相同的集合中提取的。我不确定100%,但是我相信Keras在改组和训练之前会采取验证措施(即,如果您将未经改组的数据送入,则验证会砍掉您的部分发行版)。因此,在传递给Keras之前,我会手动进行平衡和改组。唯一的问题可能是我正在复制1并添加高斯噪声,这可能会加剧过拟合。
DeusXMachina

2
我认为您不需要依靠Keras进行验证,您可以将数据分为三个部分。培训,验证和测试。从训练数据中采样并训练您的网络。不要使用验证和测试集中的发行版。在验证集上优化网络,然后检查测试集。我编辑我的答案补充了有益的借鉴
巴沙尔·哈达德

5

如果培训损失低于验证损失,则说明您过拟合了,即使验证仍在下降。

这表明您的网络正在训练中的学习模式不适用于验证之一


我知道训练损失要少于验证损失-这只是对训练集的过度拟合。但是验证精度高于训练精度。那是奇怪的部分!
DeusXMachina

如果您的设备不平衡,则不会。例如,在二进制分类器中,如果您在验证集中的比例少于1,并且您的模型仅输出0,则您将具有更高的验证精度
粗体字
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.