

Pythonを独学で勉強しているものです。

Kerasのコードで、

[code]

    model.fit(x_train, y_train, verbose=1, validation_split=0.2, shuffle=True, epochs=20000)
    
[/code]

とした時、80%のデータが学習用に使用され、20%のデータがバリデーションに使用される、というエポックが20000回繰り返されて学習が行われると認識しています。

[code]

    shuffle=True
    
[/code]

としているため、バリデーション用データの選択がランダムになり、このコードは交差検証、もっというならk=5のk分割交差検証になると思っているのですが、合っておりますでしょうか。  
Kerasのk分割交差検証用コードを調べてみると、Scikit-
learnのKholdが使用されているコードなどが出てくるため、合っているかどうか不安になり、質問させていただきました。

初歩的な質問で申し訳ございませんが、ご教示いただけますと幸いです。よろしくお願いいたします。


CC BY-SA 4.0
2021-07-16T05:34:20.360
78225
2022-01-16T09:42:27.407
41680
question
python 深層学習 keras
Keras の validation_split は交差検証でしょうか？


**交差検証ではありません** 。

`validation_split` は、 **データセットのシャッフルをする前に**
、指定した割合のデータをバリデーション用として切り出すための引数です1。また、バリデーションデータはデータセットの末尾から指定割合ぶんを取得しています2。このため、すべてのエポックで同じデータがバリデーションに使われており、抽出方法もランダム抽出ではありません。

`shuffle`
は、学習用のデータセットをシャッフルする引数です。エポックごとに学習データをシャッフルすることで、損失が小さくなりやすいことが知られているため3,4、このような引数が設けられています。

Keras のドキュメンテーションでは、`model.fit` の引数について下記のとおり説明しています：

>   * `validation_split`: 0から1の間の浮動小数点数．バリデーションデータとして使われる訓練データの割合．[中略]
> このバリデーションデータは， **シャッフルを行う前に** ，与えられたxとyのデータの後ろからサンプリングされます．
>   * `shuffle`: 真理値（ **訓練データを** 各試行 [エポック] の前にシャッフルするかどうか）または文字列（'batch'の場合）．
> [後略]
>

>
> _Keras ドキュメンテーション (<https://keras.io/ja/models/model/>) 、最終アクセス年月日:
> 2022-01-16。角カッコおよび強調は回答者が付加。_

Keras はK分割交差検証の機能を提供していません。ご指摘のとおり、scikit-learn など別のライブラリを利用する必要があります。

* * *

1 関連する箇所の実装は、[`model.fit`の定義](https://github.com/keras-
team/keras/blob/35504ff7a13e745d60f0c9ef6d6c97542df40e03/keras/engine/training.py#L1070)
(GitHub) です。`validation_split` を引数とする処理が、`shuffle` の適用前に実行されていることがわかります。  
2 実装上は、[`validation_split`の処理](https://github.com/keras-
team/keras/blob/35504ff7a13e745d60f0c9ef6d6c97542df40e03/keras/engine/data_adapter.py#L1456)
(GitHub) のようになっています。  
3 シャッフルあり/なしの実験例: <https://qiita.com/hikobotch/items/d8ff5bebcf70083de089>  
4 なぜ損失が小さくなるのかの説明（英語）: <https://stats.stackexchange.com/a/311318>


CC BY-SA 4.0
2022-01-16T09:42:27.407
85734
2022-01-16T09:42:27.407
50921
78225
answer