交差検証の種類

目次

背景

  • 単純にデータをTrain/Testに1回だけ分割するhold-out法は、手軽だが、たまたまその分割が簡単(または難しい)だった場合に、性能推定が偏ってしまう
  • 特にデータが少ない場合、1回の分割で評価に回すサンプルを減らすと、TrainもTestも情報が不足する
  • 交差検証(Cross-Validation)は、分割を複数回変えて評価を繰り返すことで、性能推定の分散を抑える手法群
  • 一口に交差検証といっても、データの性質によって適した種類が異なるため、ここで整理する

k-分割交差検証(k-Fold Cross-Validation)

  • データを$k$個のfoldに分割し、$k-1$個をTrain、残り1個をTestとして評価するのを、Testにする部分を入れ替えながら$k$回繰り返す
  • 最終的な性能は、$k$回の評価の平均(と分散)として報告する
$$ \hat{R}_{\text{cv}} = \frac{1}{k}\sum_{i=1}^{k} \hat{R}_i $$
  • $k=5$や$k=10$がよく使われる
  • Testに使うfoldが毎回入れ替わるため、hold-out法より少ないデータロスで、全サンプルを1回ずつTestとして使える

Stratified k-Fold

  • クラス比率が偏っているデータでは、単純にランダムにfold分割すると、あるfoldにだけ少数クラスが集中してしまうことがある
  • Stratified k-Foldは、各foldでのクラス比率が元データの比率を維持するように分割する
  • 機械学習におけるデータとデータソースの再考で触れたstratified splitのk-Fold版

Leave-One-Out(LOOCV)

  • $k=n$(サンプル数)とした、k-Foldの特殊ケース
  • 1サンプルだけをTestにして、残り全部をTrainにするのを、全サンプル分繰り返す
  • メリット: 毎回$n-1$件をTrainに使えるため、データが極端に少ない場合でも学習データを無駄にしない
  • デメリット
    • $n$回モデルを学習させる必要があり、$n$が大きいと計算コストが高い
    • Trainセット同士がほぼ同じデータ(1件しか違わない)になるため、$k$回の評価結果が互いに強く相関し、平均の分散が見かけ上小さく出ることがある
    • モデル選択(ハイパーパラメータ探索)にLOOCVを使い回すと、小さなデータに対して過度にモデルを適合させてしまうリスクも指摘されている(Cawley & Talbot, 2010)

Leave-P-Out(LPOCV)

  • LOOCVを一般化し、1件ではなく$p$件をTestとして抜き出すのを、全ての組み合わせで繰り返す手法
  • 組み合わせ数は$\binom{n}{p}$になるため、$p$が2以上になると急速に計算量が増え、実務ではあまり使われない
  • $p=1$の場合がLOOCVに一致する

5×2交差検証

  • $k$-Foldを1回行うだけでは、fold分割そのものの偶然性が結果に残る
  • 5×2交差検証は、データを2分割してTrain/Testを入れ替える2-Fold CVを、分割の仕方を変えて5回繰り返す(合計10回の評価)
  • マクネマー検定でモデル比較の有意差を検定するで触れた5×2 cvペアードt検定は、この5×2交差検証の結果を使って、2つのモデルの性能差を検定する手法
  • 単純な$k$-Foldの平均を比較するより、分割の偶然性による誤検出を抑えられる

Nested Cross-Validation

  • ハイパーパラメータ探索と、最終的な性能評価の両方に同じ交差検証を使い回すと、分布外データの対処方法で触れたWinner’s Curseと同じ問題が起きる
  • つまり、複数のハイパーパラメータ候補を同じ検証データで比較して一番良いものを選ぶと、選ばれた候補の評価値は本来の実力より楽観的に偏る
  • Nested Cross-Validationは、これを避けるために交差検証を二重にする
    • 外側のループ: 性能評価のためのTrain/Testの分割
    • 内側のループ: 外側のTrain部分の中だけで、ハイパーパラメータ探索のための交差検証を行う
  • 内側でハイパーパラメータを選び、外側のTestは一度もハイパーパラメータ探索に使わないため、性能評価が楽観的に偏りにくい
  • 計算コストは、外側$\times$内側の分割数だけモデルを学習する必要があり、通常のk-Foldよりかなり高くなる

時系列データでの交差検証

  • 時系列データでは、通常のk-Foldをそのまま使うと問題が起きる
  • 未来のデータでTrainし、過去のデータでTestするような分割が発生しうるため、本来知り得ないはずの未来の情報がTrainに紛れ込む(リーク)
  • Walk-Forward Validation(時系列分割)では、常に「過去をTrain、未来をTest」という時間順序を守ったまま、Testの範囲を時間方向にずらしながら繰り返す
1
2
3
Fold1: Train[1..10]  Test[11..12]
Fold2: Train[1..12]  Test[13..14]
Fold3: Train[1..14]  Test[15..16]
  • Trainの範囲を固定せず、常に直近までを含めて広げていく方式と、一定の窓幅でスライドさせる方式がある

Group k-Fold

  • 同じ患者・同じユーザー・同じデバイスから複数のサンプルが取られているデータでは、単純なランダム分割だと、同じグループのサンプルがTrainとTestの両方に紛れ込むことがある
  • この場合、モデルはそのグループ固有の特徴(患者の個人差など)を学習してしまい、Testでの性能が実際の汎化性能より高く出る
  • Group k-Foldは、同じグループに属するサンプルが必ず同じfold(同じTrainまたは同じTest)に入るように分割する
  • これは機械学習におけるデータとデータソースの再考で触れた「元データソースを分ける」という独立性の要求を、fold分割のレベルで実現したものと言える

まとめ

  • 交差検証は、hold-out法の分割の偶然性による性能推定のブレを抑える手法群
  • k-Fold CVが基本形で、クラス比率を保つStratified k-Foldとセットで使われることが多い
  • LOOCVはk=nの特殊ケースで、データが少ない場合に有効だが、計算コストと評価結果の相関に注意が必要
  • 5×2交差検証は、モデル比較の統計的検定と組み合わせて使われる
  • Nested Cross-Validationは、ハイパーパラメータ探索と性能評価を分離し、Winner’s Curseのような楽観バイアスを避ける
  • 時系列データ・グループ構造を持つデータでは、通常のランダム分割ではなく、時間順序やグループの独立性を守った専用の分割方法が必要

参考文献

Built with Hugo
テーマ Stack は Jimmy によって設計されています。