Kaggle における K-Fold CV まとめ
背景
先日 submission の締切が過ぎて終了フェーズの Quora Insincere Questions Classification | Kaggle。 local CV と pubic LB の相関についてたくさんの議論があった。また local CV vs train test split の話もあった。別のコンペでもよくある議論だと思うのでここでまとめて理解を深める。
参考
- Cross-Validation | Kaggle
- Cross Validationはなぜ重要なのか【kaggle Advent Calendar 3日目】 - u++の備忘録
- validationの切り方いろいろ(sklearnの関数まとめ)【kaggle Advent Calendar 4日目】 - u++の備忘録
- cv strategy | Kaggle
K-Fold CV と Train Test Split 違い
- Train Test Split
- Train data の量が少ないともったいない。
- 大きいデータセットに向いている
- Cross validation
- 2つ以上の model を学習させるので時間がかかる
- model の性能についてより正しい理解が得られる
- 小さいデータセットのときは Cross validation 一択。
- cv strategy | Kaggle の議論からのまとめ。全ての trainig data を使った single model と比べて、K-Fold CV のほうが良いのはなぜか?という疑問。
- K-Fold は異なるデータセットから K 個の異なるモデルを作る。そのため各モデルは微妙に異なる prediction をする。それゆえに K 個のモデルからの prediction を平均して使うと頑丈で良い結果になるし overfit しにくくなる(筆者:なぜ?より diverse なものに強いから?)
- K-Fold は全ての traing データを使うことができる。single model だと validation 用に holdout が必要になる。
- これは必ずしも真ではない。holdout で validation して model のベストパラメータを見つけたあとに、全ての train データを使って1から学習させればよい。その際には epoch などを注意深く設定して overfit しないように気をつけないといけない。(とある grandmaster は epoch * 1.1 くらいを推奨している)
- 上記の調節が難しいので K-Fold が好まれる事が多いらしい。
K-Fold CV 例
K-Fold (4- 6) で train データ全体に対して prediction をして validation score を出す(average など)。K-Fold 時に使ったモデルすべてを使って test prediction を行い。final submission を average などで出す。
K-Fold 亜種
validationの切り方いろいろ(sklearnの関数まとめ)【kaggle Advent Calendar 4日目】 - u++の備忘録 がとても良くまとまっている。特にデータに偏りがある場合の visualization が分かりやすい。
CV FAQ
Local CV の値が安定しない
PyTorch を使おう。Keras よりも PyTorch の方が Deterministic に出来るので好まれている模様。Deterministic neural networks using PyTorch | Kaggle を参照のこと。下記の seed_everything が肝。
# Written by Benjamin Minixhofer def seed_everything(seed=1234): random.seed(seed) os.environ['PYTHONHASHSEED'] = str(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed(seed) torch.backends.cudnn.deterministic = True
Local CV と public LB で傾向が違う
例えば Local CV が改善したのに public LB が下がったとか。
考えられる理由1
validation, train, test セットの分布が異なる。EDA をきちんとやって適切な K-Fold 亜種を選ぶ。Adversarial validation という方法も。
考えられる理由2
それぞれが計算された方法が微妙に異なること。
- Local CV は K 個のモデルからでた K 個のスコアを平均している
- Public LB は K個のモデルから出た K 個の prediction を平均してスコアを計算している
A validation framework & impact of the random seed | Kaggle という手法がある。
Local CV と public LB どちらを信じるか
Local CV。通常 traing data の方が test data よりも大きいのでより信頼できる。