Kerasのfit関数のvalidation_splitパラメーターはどのように機能しますか?


17

Kerasシーケンシャルモデルフィット関数の検証分割は、https://keras.io/models/sequential/に次のように文書化されています

validation_split:0から1の間で浮動します。検証データとして使用されるトレーニングデータの割合。モデルは、トレーニングデータのこの部分を分離し、トレーニングを行わず、各エポックの終わりにこのデータの損失とモデルメトリックを評価します。検証データは、シャッフルする前に、提供されたxおよびyデータの最後のサンプルから選択されます。

最後の行に注意してください:

検証データは、シャッフルする前に、提供されたxおよびyデータの最後のサンプルから選択されます。

検証データは常に固定され、メインデータセットの下部から取得されるということですか?

メインデータセットから特定の割合のデータをランダムに選択する方法はありますか?

回答:


17

実際には、各エポックの後に検証セットをリサンプリングしたくないでしょう。これを行うと、データセット内のすべてのサンプルでモデルがトレーニングされるため、オーバーフィットが発生します。トレーニングプロセスの前に常にデータを分割し、その後、トレーニングのためにデータのサブセットのみを使用してアルゴリズムをトレーニングする必要があります。

設計された関数は、各エポックに対して常にデータの同じ部分でトレーニングするようにデータが分離されるようにします。そのオプションが選択されている場合、すべてのシャッフルはエポック間のトレーニングサンプル内で行われます。

ただし、一部のデータセットでは、特にデータセットがクラスに基づいて再グループ化される場合、最後のいくつかのインスタンスを取得することは役に立ちません。そうすると、クラスの分布が歪んでしまいます。したがって、データのサブセットを抽出して、トレーニングと検証のセットでバランスの取れたクラス分布を得るために、何らかのランダムな方法が必要になります。このために、私は常に次のようにsklearn関数を使用したいです

from sklearn.model_selection import train_test_split

# Split the data
x_train, x_valid, y_train, y_valid = train_test_split(data, labels, test_size=0.33, shuffle= True)

それはあなたが望むことをする素敵で使いやすい関数です。変数datalabelsは、最初の次元がインスタンスである標準のnumpy行列です。


1
エポックごとに異なるテストセットを取得するつもりはありませんでした。多くのデータセットがクラスに応じて配置される可能性があるため(私が言ったように)、データセットの最後からデータを取得することについて尋ねました。私は知ってtrain_test_splitいますが、これはデータセットからテスト/検証データをランダムに取得するため、これがより良い方法であることを確認しました。
rnso

@rnso、残念ながらケラスはそのオプションを提供していません。実際に彼らが提供したいものの範囲内ではないのではないでしょうか。名前にランダムな2つの異なるメソッド入力があるため、実装が少し混乱します。
JahKnows

そのtrain_test_spliを使用して、検証とテストデータの定義を混合しませんでしたか?
バグストリス

shuffleパラメータを使用する場合、ケラスモデルにも使用shuffle.fitますか?
Shamoon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.