検証の損失がまだ低下している場合でも、過剰適合は発生しますか?


12

Kerasには、Kaggleコンテストに使用している畳み込み+ LSTMモデルがあります(参照1)。アーキテクチャを以下に示します。ラベル付けされた11000サンプルのセットでトレーニングしました(2つのクラス、初期有病率は〜9:1であるため、1を約1/1の比率にアップサンプリングしました)。しばらくの間、私はそれがノイズとドロップアウト層で制御下にあると思った。

モデルは見事にトレーニングされているように見え、最終的にトレーニングセット全体で91%を獲得しましたが、テストデータセットでテストすると、絶対ゴミになりました。

エポックによる損失

エポックによる検証精度

注意:検証の精度は、トレーニングの精度よりも高くなっています。これは、「典型的な」過剰適合の反対です。

私の直感では、検証の分割がわずかであるため、モデルは依然として入力セットにあまりにも強く適合し、一般化を失っています。もう1つの手がかりは、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 python-keras

回答:


8

検証セットのバランスが取れているかどうかはわかりません。重大なデータの不均衡の問題があります。各クラスから均等かつランダムにサンプリングしてネットワークをトレーニングし、サンプリングした割合の割合を使用してネットワークを検証する場合、これはバランスの取れたデータセットを使用してトレーニングおよび検証することを意味します。テストでは、不均衡なデータベースを使用しました。つまり、検証セットとテストセットは同等ではありません。このような場合、検証の精度が高く、テストの精度が低い可能性があります。主にDNNのデータの不均衡の問題について説明しているこのリファレンスを見つけてください。トレーニング、検証、テストを行うためのサンプルのサンプルを確認できますhttps://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf


1
検証セットは、トレーニングセットと同じセットから取得されます。100%確信はありませんが、Kerasはシャッフルとトレーニングの前に検証カットを行うと考えています(つまり、シャッフルされていないデータをフィードすると、検証分割は分布の一部を切り落とします)。ケラスに渡す前に手動でバランスを取り、シャッフルします。唯一の問題は、1を複製し、ガウスノイズを追加することです。これにより、オーバーフィットが強化される可能性があります。
-DeusXMachina

2
検証を行うためにKerasに依存する必要はないと思います。データを3つの部分に分割できます。トレーニング、検証、テスト。トレーニングデータからサンプリングしてネットワークをトレーニングします。検証セットとテストセットで配布を使用しないでください。検証セットでネットワークを最適化してから、テストセットで確認します。私は便利な参照を追加するには私の答えに編集
バシャールハダッド

5

あなたの場合は、トレーニング損失があなたの下で検証損失を行く、あなたは過剰適合している検証がまだドロップされた場合でも、。

これは、ネットワークが検証セットに適用できない列車セットのパターンを学習していることを示しています。


トレーニングの損失は検証の損失よりも少ないことを理解しています。これは、トレーニングセットに対する過剰適合です。ただし、検証の精度はトレーニングの精度よりも高くなっています。それは奇妙な部分です!
DeusXMachina

セットのバランスが崩れていない場合。たとえば、バイナリ分類器では、検証セットの割合が1未満で、モデルが0のみを出力する場合、検証の精度が高くなります
太字
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.