交差検証(Cross-Validation)
1. 概要
A. 定義
交差検証とは、保有するデータを複数の学習用・検証用の分割に交互に分けてモデルを反復的に学習・評価することで、一度の分割に依存せずモデルの汎化性能をより安定的に推定するリサンプリング(resampling)ベースの検証手法である。
機械学習モデルの目的は、学習に用いていない将来のデータでもうまく機能すること、すなわち汎化である。しかし手元のデータは有限であるため、学習にすべてを使えば性能を検証する標本が残らず、逆に一度だけ取り分けた検証セット(holdout)で評価すると、その性能推定値はどのデータが偶然検証セットに入ったかによって大きく揺れる。交差検証はこのジレンマを「データを回して使う」方式で緩和し、すべての標本が一度ずつ検証に参加するようにすることで、推定の分散を下げデータを効率的に活用する。
B. 登場背景および必要性
モデル開発はアルゴリズム選択、ハイパーパラメータ調整、特徴量設計という数多くの意思決定の連続であり、これらの選択を客観的に比較するには信頼できる性能推定値が必要である。単一のホールドアウト分割は単純だが二つの問題を抱える。第一に、データが少ないほど検証セットが小さくなり、推定値の変動(分散)が大きくなる。第二に、同じ検証セットを繰り返し見ながらハイパーパラメータを選ぶと、そのモデルが検証セットに密かに過適合し、報告される性能が実際の運用性能を過大評価してしまう。
交差検証はこの問題を、データを複数回再利用して評価する方式で解決する。特にデータ確保コストの大きい医療・製造・金融分野のように標本が数百~数千件に過ぎない場合、交差検証は限られたデータで統計的により信頼できる比較根拠を提供する点で事実上の標準手続きとして定着した。さらに、モデル選択と性能報告を分離する入れ子交差検証は、「検証セットへの過適合」という罠を構造的に防いでくれる。
歴史的に交差検証は1970年代の統計学においてモデル選択と予測誤差推定のためのリサンプリング手法として確立され、ブートストラップ・ジャックナイフとともに「有限標本で分布仮定なしに性能を推定する」方法論の系譜に属する。今日ではscikit-learn・caretといったライブラリがK分割・層化・時系列分割を標準APIとして提供することで、データ分析者なら誰もが基本として適用する共通言語となった。要するに交差検証は「このモデルを信じてよいか」という問いに答えるための最も普遍的で検証された手続きである。
C. 特徴
- 再利用性: すべての標本が学習と検証に交互に用いられ、データ活用効率が高い。
- 分散低減: 複数分割の性能を平均するため、単一分割より推定が安定する。
- バイアス-分散トレードオフ: 分割数(k)と検証セットの大きさにより推定のバイアスと分散が相反する。
- 適用条件依存性: 時系列・グループ・不均衡データでは単純な無作為分割が性能を歪めるため、変形手法が必要となる。
2. 交差検証の原理と全体構造
交差検証は「データをどのように分けて回して使うか」によって複数の変形に分かれる。下の構造図は代表的な手法を分割方式とデータ特性を基準に整理したものである。
flowchart TB
CV["交差検証(Cross-Validation)"] --> H["単純分割<br/>Holdout"]
CV --> K["反復分割<br/>K-Fold系"]
CV --> N["モデル選択分離<br/>Nested CV"]
K --> KF["基本K-Fold"]
K --> SK["層化K-Fold<br/>Stratified"]
K --> LOO["LOOCV<br/>(k=N)"]
K --> RP["反復K-Fold<br/>Repeated"]
CV --> S["データ特性別の変形"]
S --> TS["時系列<br/>TimeSeriesSplit"]
S --> GP["グループ<br/>GroupKFold"]
style CV fill:#e8f0fe,stroke:#2f6fed,stroke-width:2px
style S fill:#fef3e8,stroke:#ed922f,stroke-width:1px
交差検証を貫く核心原理はバイアス-分散トレードオフである。検証セットを大きく取る(学習セットが小さくなる)とモデルがデータを十分に学べず性能を低く偏って推定し、検証セットを小さく取ると推定の分散が大きくなる。分割数kを増やすと各回の学習セットが全体に近づきバイアスは減るが、分割どうしで学習データが大きく重なり性能推定値が互いに相関するため、分散低減効果には限界があり計算コストだけが増える。このために実務ではバイアス・分散・コストの均衡点としてk=5またはk=10が経験則のように用いられる。
もう一つの原理は情報隔離である。検証セットは「一度も見ていない将来」を模さねばならないため、前処理(正規化・欠損補完・特徴量選択)の統計量は必ず学習フォールドでのみ算出して検証フォールドに適用せねばならない。この隔離が破れると検証セットの情報が学習に漏れ込むデータ漏洩(data leakage)が発生し、交差検証が与える信頼が虚像となる。
3. 主要手法と実行手順
下のプロセス図は、最も広く使われるK分割交差検証の1回の反復と、ハイパーパラメータ調整まで含む入れ子(Nested)交差検証の流れを併せて示している。
flowchart LR
subgraph OUTER["外側ループ — 性能推定"]
D["全データ"] --> SP["K個のフォールドに分割"]
SP --> TR["K-1個 = 学習フォールド"]
SP --> VA["1個 = 検証フォールド"]
TR --> FIT["モデル学習<br/>(前処理は学習フォールドでのみ)"]
FIT --> EV["検証フォールドで評価"]
EV --> AVG["K回反復後に性能の平均・標準偏差"]
end
subgraph INNER["内側ループ — ハイパーパラメータ選択"]
TR --> HP["学習フォールドを再びK'分割"]
HP --> GRID["ハイパーパラメータ探索"]
GRID --> BEST["最適値選択"]
BEST --> FIT
end
style OUTER fill:#e8f0fe,stroke:#2f6fed,stroke-width:1px
style INNER fill:#eafbea,stroke:#2faf5a,stroke-width:1px
A. ホールドアウト(Holdout)
最も単純な方法で、データをおおむね学習7080%と検証2030%に一度分けて評価する。計算が一度だけなので速く実装が容易であり、数十万件以上の大規模データでは分割変動が小さく十分に信頼できる。実際、ImageNet級の大規模深層学習では交差検証の反復学習コストが莫大であるため、固定された学習・検証・テスト分割(holdout)を使うのが一般的である。
しかしデータが少ないときホールドアウトは致命的である。どの標本が偶然検証セットに偏るかによって性能推定値が数%ポイントずつ揺れるからである。例えば500件の医療データでホールドアウト一度の正確度が82%と出たとしても、分割シードを変えれば76%や88%が出ることがあり、モデル比較の根拠としては危険である。
またホールドアウトはデータを「学習に使うもの」と「検証に使うもの」に一度分けてしまうため、検証に使われた20~30%は学習にまったく寄与しない。データが貴重な状況でこの浪費はモデル品質を直接低下させる。
B. K分割交差検証(K-Fold)
K分割交差検証はデータをk個のフォールドに分けた後、各フォールドを一度ずつ検証セットとして用い残りのk-1個を学習セットとして用いて、計k回の学習・評価を反復しその性能を平均する。すべての標本が正確に一度検証に用いられるためデータを捨てず、k個の性能値で平均と標準偏差を併せて報告でき、「このモデルが平均どれほど良く、どれほど安定しているか」を同時に判断できる。
kの選択はバイアス-分散・コストのトレードオフである。kが小さい(例:k=3)と学習セットが小さく性能が悲観的に偏り、kが大きい(例:k=20)と学習セットは全体に近づくがフォールド間で学習データが大きく重なり推定値が相関し学習を20回回さねばならずコストが急増する。そのため多くの実務はこの均衡点としてk=5(約20%検証)またはk=10(約10%検証)を採用する。
| 分割数k | 1回の学習セット比率 | 推定バイアス | 推定分散 | 計算コスト |
|---|---|---|---|---|
| k=2~3 | 50~67% | 大(悲観的) | 小 | 低 |
| k=5 | 80% | 中 | 中 | 中 |
| k=10 | 90% | 小 | 中 | 高 |
| k=N (LOOCV) | ≈100% | ほぼなし | 大 | 非常に高 |
表が示すとおりkを大きくすれば無条件に良くなるのではなく、LOOCVのように極端に行くとバイアスは消えるが分散とコストが激増する。つまり指標を「一つだけ大きくすればよい」問題ではなく、データの大きさと計算予算を併せて考えた設計上の決定である。
K分割のもう一つの実務的価値は、性能の不確実性を併せて報告できる点である。例えばモデルAが「正確度 平均84%、標準偏差2%ポイント」、モデルBが「平均85%、標準偏差9%ポイント」であれば、平均だけ見ればBが良いが、Bは分割によって性能が大きく揺れ運用で危険でありうる。交差検証はこのように平均と変動性を同時に提示し、「平均が少し低くともより安定したモデル」を選ぶ根拠を提供する。これは単一ホールドアウトが決して与えられない情報である。
C. 層化・LOOCV・反復交差検証
層化K分割(Stratified K-Fold)は各フォールドが全体のクラス比率をそのまま保つように層化抽出する。分類問題、特に陽性が5%しかない不均衡データで単純な無作為分割を使うと、あるフォールドには陽性がほとんどなく評価が無意味になりうるが、層化分割はすべてのフォールドに陽性を均等に配分しこの歪みを防ぐ。分類では事実上の既定値として用いられる。
LOOCV(Leave-One-Out)はk=Nの極端で、標本一つだけを検証セットとして残り全部で学習することをN回反復する。学習セットがほぼ全体であるため性能推定のバイアスは最も小さいが、N回学習せねばならずデータが数千件になるだけでコストが非現実的となり、推定値の分散が大きいという弱点がある。そのためLOOCVは標本が数十~数百件に過ぎない場合に限定的に用いられる。
反復K分割(Repeated K-Fold)はフォールドを毎回異なるように混ぜてK分割全体を複数回反復しその結果を平均する。たった一度のK分割で生じうる「運の良い・悪い分割」の影響をさらに減らし、小規模データで推定値の分散を一層下げようとするときに使用する。
層化分割の効果は数値で明白である。陽性が3%の1,000件の不正検知データを5分割に分けるとすると、単純な無作為分割ではフォールド別の陽性数が多くて14件から少なくて3件までばらつき、あるフォールドでは再現率を事実上測定すらできない。一方、層化分割はすべてのフォールドに陽性を約6件ずつ均等に配置し、フォールド間の性能偏差そのものを減らし評価を公正にする。少数クラスが貴重なデータほどこの差は決定的となる。
D. 入れ子交差検証(Nested CV)
ハイパーパラメータ調整と性能報告を同じ検証セットで行うと、モデルがその検証セットに合わせて選ばれるため報告される性能が楽観的に膨らむ。入れ子交差検証はこれを防ぐためにループを二重に置く。内側ループで学習フォールドのみを再び分割しハイパーパラメータを選び、外側ループではその選択過程全体を一つの「モデル」とみなし一度も見ていない外側の検証フォールドで評価する。こうすれば「調整を含む全体パイプライン」の汎化性能をバイアスなく推定できる。
入れ子交差検証は計算量が外側・内側の分割数の積(例:5×5=25倍の学習)で増える代わりに、モデル比較を論文・審査・規制提出のように厳密に報告せねばならない状況で信頼を保証する。データが少なく過適合リスクの大きいバイオ・医療分野で特に推奨される。
入れ子交差検証が明らかにする核心的洞察は「ハイパーパラメータ探索そのものが一つの学習過程である」という点である。数百のハイパーパラメータ組合せを検証セットのスコアで選ぶと、そのスコアが最も高く出た組合せは実力とともに運(noise)まで最適化した結果でありうる。例えば非入れ子方式で測った交差検証の正確度が90%だったのに入れ子方式で再測定すると86%に下がる場合がよくあり、この4%ポイントの差こそが「検証セットへの過適合」の大きさである。運用に配備すれば結局86%に近い性能が現れるため、入れ子検証は配備後の性能ショックを事前にあらわにする装置といえる。
4. 特殊状況別の交差検証とデータ漏洩防止
交差検証が与える信頼は「検証セットが将来のデータを正しく模す」という前提の上にある。この前提が破れる代表的な状況が時系列とグループ構造データであり、ここで単純な無作為K分割を使うと性能を深刻に過大評価する。
時系列交差検証は未来で学習し過去で評価することを禁じねばならない。無作為分割を使うと未来時点が学習に混ざり込み「未来を知って過去を当てる」漏洩が生じるからである。代わりにTimeSeriesSplitのように時間順序を守って過去で学習 → すぐ後ろの区間で評価する前進検証(forward chaining)を使う。例えば需要予測モデルで無作為K分割ではMAPE 6%が出たが、時間順序を守った前進検証では11%が出る、というように前者が運用性能を大きく過大評価する場合がよくある。
グループ交差検証(GroupKFold)は同じ個体(患者・利用者・工場設備)から出た複数の標本が学習と検証に同時に入らないようにグループ単位で分割する。同じ患者の複数のCT画像が学習と検証に分かれて入ると、モデルが「疾患」ではなく「その患者」を覚えてしまい検証正確度が95%に見えるが新しい患者には70%台に急落する、という漏洩が発生する。グループ分割はこれを構造的に遮断する。
データ漏洩防止は特殊状況を超えてすべての交差検証の共通規則である。正規化・欠損補完・特徴量選択・オーバーサンプリング(SMOTE)のような前処理は必ず各回の学習フォールドでのみ適合(fit)し検証フォールドには変換(transform)のみを適用せねばならない。よくある誤りは全データで一度スケーリングした後に交差検証を回すことだが、こうすると検証フォールドの分布情報が前処理を通じて学習に漏れ込み性能が膨らむ。scikit-learnのPipelineで前処理とモデルを一つにまとめて交差検証に入れると、この隔離が自動的に保証される。
特に特徴量選択を交差検証の外で先に実施する漏洩が致命的である。全データでターゲットと相関の高い上位特徴量を選んだ後その特徴量だけで交差検証を回すと、特徴量選択段階がすでに検証フォールドの正解を覗いたことになり、実は無意味なランダム特徴量でも交差検証の正確度が70~80%のようにもっともらしく出る錯覚が生じる。正しい手順は特徴量選択を各フォールドの学習データの中に入れて交差検証ループの中で反復することである。この原則を守らない性能報告は再現段階で必ず崩れる。
5. 深化 — 最新動向と実務適用
AutoML・ハイパーパラメータ最適化との結合: Optuna、Auto-sklearnのような自動化ツールは内部的に交差検証スコアを目的関数としてハイパーパラメータを探索する。このとき探索が交差検証スコアを過度に追うと検証セットへのメタ過適合が生じるため、最終性能は必ず探索に使わない別のテストセットや入れ子交差検証で確認せねばならない。
大規模深層学習における現実的な妥協: LLM・ビジョン基盤モデルのように一度の学習に数日~数週間かかる場合、k分割の反復は事実上不可能である。この領域では固定ホールドアウト(train/validation/test)分割を使うが、代わりにデータ規模が大きく単一分割の分散が小さいという点で信頼を確保する。すなわち交差検証はデータが小さいほど価値が大きく、大きいほどホールドアウトで代替される傾向が顕著である。
モデル比較の統計的有意性: 二つのモデルの交差検証の平均性能差が「偶然か実際か」を判断するには、単純な平均比較を超えて統計検定が必要である。ただし交差検証のフォールド性能は学習データが重なり独立でないため、通常のt検定は第1種の誤りを膨らませる。これを補正した修正リサンプリングt検定(corrected resampled t-test)や反復交差検証ベースの検定が推奨される。これは先に扱った[[clt-t-z-test]]の仮定(独立性)が破れるときの実務的対応という点で連携して理解する価値がある。
分布変化(drift)時代の検証: 運用環境のデータ分布が時間とともに変わる状況では、過去データで測った交差検証性能が未来を保証しない。したがって交差検証は「配備前1回の検証」で終わらず、配備後の[[data-quality-management]]・モニタリングと結合して周期的に再検証するMLOpsライフサイクルの一部として定着する趨勢である。
敵対的・公平性観点の検証拡張: 近年は平均性能だけでなく集団別(性別・年齢・地域)の性能偏差を交差検証の過程で併せて測定し公平性(fairness)を点検しようとする流れが強い。例えばグループ別に層化して各集団の再現率格差をフォールドごとに集計すれば、全体の正確度は高いが特定の少数集団でのみ性能が急落するモデルを配備前にふるい落とせる。これはEU AI Actなどの規制が要求する「集団間の性能評価」と接しており、交差検証が単なる性能推定を超えて責任あるAIの検証ツールへと拡張していることを示す。
6. 考慮事項および示唆点
技術士の観点から交差検証は単なる統計手法ではなく、限られたデータで信頼できる意思決定を下すための設計活動である。手法選択と運用において次を総合的に考慮せねばならない。
- データ規模に応じた戦略分離: 数百~数千件の小規模データはK分割・反復交差検証で分散を下げ、数十万件以上の大規模・高コスト学習(深層学習)は固定ホールドアウトでコストを統制するなど、規模に合った妥協が核心である。
- データ構造に合った手法選択(トレードオフ): 分類不均衡は層化K分割、時系列は前進検証、反復測定・個体重複はグループ分割を適用せねばならず、これを無視した無作為分割は性能を過大評価し運用事故につながる。
- 漏洩遮断をパイプラインとして制度化: 前処理の統計量適合を学習フォールドに限定する規則を個人の注意に任せず、
Pipeline・特徴量ストア・検証自動化で構造的に強制してこそ再現性と信頼が確保される。 - モデル選択と性能報告の分離: 調整に使った検証セットで最終性能を報告しないよう入れ子交差検証や別のテストセットを置いて楽観バイアスを除去し、規制・監査対象のモデルほど厳格に適用する。
- コスト-信頼の均衡と展望: k・反復数・入れ子の有無はいずれも計算コストと推定信頼の交換であるため、課題のリスク水準(医療・金融など高リスクほど厳格)に合わせて設計する。今後はAutoML・分散学習インフラと結合して交差検証をパイプラインに内在化し、分布変化に対応する継続検証へと拡張する方向が有力である。
参考資料
- scikit-learn, "Cross-validation: evaluating estimator performance" — https://scikit-learn.org/stable/modules/cross_validation.html
- scikit-learn, "Nested versus non-nested cross-validation" — https://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
一言まとめ: 交差検証はデータを複数の学習・検証分割に回して使い汎化性能を安定的に推定する手法であり、バイアス-分散・コストのトレードオフでkを定め(通常5~10)、データ構造(不均衡・時系列・グループ)に合った変形と漏洩遮断・入れ子検証を通じて信頼できるモデル選択の根拠を提供する。