交差検証とは?KFoldの仕組み・種類・データリーク対策を解説

交差検証(Cross-validation)とは、手元のデータを複数のグループに分け、学習と検証を繰り返してモデルの汎化性能を評価する方法です。1回だけ学習データと検証データを分けるより、データの分割による偶然の影響を確認しやすくなります。

一方で、交差検証を使えば必ず本番精度を予測できるわけではありません。テストデータを何度も見てしまう、前処理を分割前に行う、同じ顧客や設備のデータを学習と検証へまたがって入れると、評価が過大になることがあります。この記事では、交差検証の仕組み、ホールドアウト法との違い、KFoldの種類、データリークを防ぐ手順、本番導入前に確認すべきポイントを解説します。

交差検証とは学習と検証を複数回繰り返す評価方法です

交差検証では、データをk個のfold(分割)に分けます。1回目は1番目のfoldを検証用、残りを学習用にし、2回目は2番目のfoldを検証用にするというように、検証用foldを順番に入れ替えます。最後にk回分のスコアを平均し、必要に応じて標準偏差や最小・最大も確認します。

たとえば5-foldなら、同じデータから5通りの学習・検証の組み合わせを作ります。各回で未知データに近い立場のfoldを評価に使うため、1回の分割だけに依存するより、モデル性能のばらつきを把握しやすくなります。ただし、fold数を増やすほどモデルを学習する回数が増え、計算時間も長くなります。

交差検証で推定するのは未知データへの性能です

交差検証の目的は、学習に使っていないデータに対してモデルがどの程度機能するかを推定することです。学習データへ過度に適合していないか、モデルやハイパーパラメータの候補に差があるか、データの分割によって評価がどれくらい変わるかを確認できます。

ただし、交差検証で使ったデータはモデル選択の判断に使われています。そのため、最終的な性能を確認するテストセットは別に残します。scikit-learnの公式ガイドでも、ハイパーパラメータを検証データへ合わせ続けると、その情報がモデルへ漏れ、汎化性能を正しく測れなくなると説明されています。

ホールドアウト法と交差検証の違い

ホールドアウト法は、データを学習用と検証用へ一度だけ分ける方法です。実装しやすく、データ量が十分に多い場合や学習コストが高いモデルで使いやすい反面、たまたま難しいデータが検証側へ偏るとスコアが低くなり、簡単なデータが偏るとスコアが高くなる可能性があります。

交差検証は、検証用データを入れ替えながら複数回評価するため、1回の分割による偶然を抑えやすい方法です。特に、データが少なく、学習に使えるサンプルをできるだけ確保したい場合に有効です。一方で、5-foldなら基本的に5回、10-foldなら10回の学習が必要になるため、推論コストや学習時間とのバランスを取ります。

実務では、開発用データを交差検証でモデル選択に使い、最後まで触らないテストセットを別に保持する構成が基本です。時系列データでは、未来のテスト期間を先に見ない分割にし、将来時点の性能を確認できる形にします。

fold数はデータ量・計算時間・評価の安定性で決めます

5-foldや10-foldがよく使われますが、fold数に万能な正解はありません。fold数を増やすと、各回の学習データは増える一方、学習回数が増えて計算時間も長くなります。サンプルが少ない場合は、1つのfoldに少数クラスがほとんど入らない、あるいは同じグループが偏るといった問題も起きます。

実務では、まずデータの最小単位と件数を確認し、各foldに必要なクラス・グループ・期間が入るかを点検します。計算コストが高い深層学習や大規模な特徴量探索では、開発初期は少ないfoldで候補を絞り、最終候補だけ設定を固定して再評価する方法もあります。fold数を変えたときに結論が逆転するなら、データ量や分割設計そのものが不安定である可能性があります。

交差検証の主な種類と使い分け

交差検証は、データが独立同分布であることを前提にできるか、クラスの偏りがあるか、同じ対象から複数サンプルが生まれているか、時間の順序があるかによって分割方法を選びます。代表的な方法を整理します。

KFoldは基本的なk分割交差検証です

KFoldはデータをk個のfoldに分け、各foldを1回ずつ検証側に回します。回帰や、クラスの偏りがない一般的なデータで出発点になります。データの並び順に意味がある場合は、事前に無条件でshuffleしてよいか確認します。ランダムに混ぜることで、未来の情報が過去の学習へ入るケースもあるためです。

StratifiedKFoldはクラス比率を保ちます

分類で陽性・陰性の比率が大きく異なる場合、通常のKFoldでは、あるfoldに少数クラスがほとんど入らないことがあります。StratifiedKFoldは、各foldでクラス比率がおおむね保たれるように分割します。医療検査や不正検知のように陽性が少ない問題では、accuracyだけでなく、少数クラスを取りこぼしていないかを確認できる形で使います。

ただし、層化すれば統計的な不確実性がなくなるわけではありません。scikit-learnの公式資料では、層化によってfold間のスコアのばらつきが小さく見える可能性があると説明されています。平均スコアだけでなく、実際の少数クラス数、再現率、混同行列を確認します。

GroupKFoldは同じ対象を学習と検証へ分けません

同じ顧客、患者、店舗、設備、契約から複数のレコードが作られる場合、それらをランダムに分割すると、同じ対象の特徴を学習したモデルを同じ対象で検証することになります。これは新しい顧客や設備へ適用したいケースの評価としては不適切です。GroupKFoldでは、指定したグループが学習側と検証側の両方に現れないように分けます。

たとえば、同じ患者の検査値を複数行にしているなら患者ID、同じ工場のセンサー値を集めているなら設備IDをグループにします。新しい顧客へ展開するモデルなのか、既存顧客の翌月データへ適用するモデルなのかで、グループ設計と評価の意味が変わります。分割単位は機械学習担当者だけでなく、データを作った業務担当者と決めます。

TimeSeriesSplitは時間の順序を守ります

売上予測、需要予測、設備の異常検知、アクセス数予測のように、未来のデータを予測する問題では、ランダム分割を避けます。ランダムに混ぜると、未来の季節性や市場環境が学習データへ入り、現実には得られない情報で評価することになるためです。

TimeSeriesSplitのような時間を意識した分割では、過去を学習し、後の期間を検証します。たとえば1月から6月で学習して7月を検証し、次は1月から7月で学習して8月を検証するように、運用時の予測に近い順序を作ります。トレンドが変化する事業では、古い期間を含めるか、直近期間を重くするかも検討します。

交差検証で最も注意したいデータリーク

データリークとは、本番予測時には利用できない情報が学習や検証へ入り、実際より高いスコアが出る状態です。交差検証の分割自体が正しくても、分割前に全データで標準化、欠損値補完、特徴量選択を行うと、検証foldの情報が学習側へ漏れることがあります。

対策は、各foldの学習データだけで前処理のパラメータを学習し、そのパラメータを検証データへ適用することです。scikit-learnでは、前処理とモデルをPipelineにまとめることで、交差検証の各回における処理順を管理しやすくなります。特徴量の作成でも、未来の集計値や予測対象期間の後に確定する情報を混ぜないようにします。

よくあるリークの例

  • 全期間の平均値や最大値を計算してから、学習・検証へ分ける。
  • 同じ顧客・患者・設備のレコードをランダムに分割する。
  • 将来の解約や故障が起きた後に確定する情報を特徴量に入れる。
  • テストセットの結果を見ながら、モデルや特徴量を何度も調整する。
  • 検証データの分布や正解ラベルを人が確認し、意思決定に利用する。

リークを防ぐには、各特徴量について「予測を実行する時点で存在するか」「誰がいつ確定させるか」「将来の値を参照していないか」を確認します。モデルのコードだけでなく、データ抽出SQL、集計バッチ、業務システムの確定タイミングまで含めてレビューすることが重要です。

ハイパーパラメータを調整するなら評価の役割を分けます

モデルの種類、正則化の強さ、木の深さ、学習率などを検証スコアに合わせて繰り返し変更すると、検証データへも間接的に適合していきます。候補を比較するための内側の交差検証と、調整後の性能を確認する外側の評価を分けるnested cross-validationは、この選択バイアスを抑える考え方です。

すべての案件でnested cross-validationが必要とは限りませんが、候補数が多い、データが少ない、研究結果を厳密に比較したい場合は検討します。一般の業務システムでも、テストセットを残し、モデル選択の判断に使うデータと最終報告用のデータを分けるだけで、評価の信頼性を高められます。どのデータを何回見たかを記録することが、手法名より重要です。

検証設計を文書化するときは、分割方法だけでなく、対象期間、除外条件、グループ列、乱数シード、評価指標、テストセットの保存場所も明記します。後から同じ実験を再現できる状態にしておけば、精度が変わった原因をデータの変化、モデルの変更、分割方法の変更に切り分けられます。

交差検証のスコアは平均とばらつきをセットで見ます

交差検証の結果を平均スコアだけで報告すると、特定のfoldだけ極端に悪いケースを見落とします。平均、標準偏差、最小値、最大値、各foldのデータ件数とクラス比率を並べると、モデルが安定しているか確認しやすくなります。業務上重要な期間や顧客群を含むfoldが、どの評価結果に対応するかも記録します。

複数の評価指標を使う場合は、どれを最終判断に使うかを先に決めます。たとえば不正検知で再現率だけを最大化すると、誤検知が増えて確認業務が回らなくなる可能性があります。再現率、適合率、確認件数、見逃しコストを合わせて評価し、モデル選択のルールを事前に合意します。

交差検証を実務で使うためのチェックリスト

  • 本番で予測したい単位(顧客・患者・設備・日付)を定義したか。
  • 最後まで使わないテストセットを確保したか。
  • データ生成過程に合う分割(KFold、Stratified、Group、時系列)を選んだか。
  • 前処理、特徴量選択、ハイパーパラメータ探索を各foldの学習データ内で行っているか。
  • 評価指標と、業務上の成功・失敗の定義を対応づけたか。
  • 平均だけでなくfold間のばらつき、重要セグメント別の性能を確認したか。
  • 乱数シード、分割方法、データ期間、除外条件、ライブラリのバージョンを記録したか。
  • 本番データの分布変化を検知し、再評価する運用を決めたか。

交差検証は分割方法まで設計して初めて意味があります

交差検証は、限られたデータを複数回の学習・検証に使い、モデルの汎化性能を推定する方法です。KFoldは基本形ですが、クラスの偏りにはStratifiedKFold、同じ対象から複数行が生まれるデータにはGroupKFold、時間の順序があるデータにはTimeSeriesSplitを使います。

最も重要なのは、交差検証の回数を増やすことではありません。本番時点で利用できる情報だけを使い、業務の予測単位に合わせて分割し、最後まで触らないテストセットで最終確認することです。平均スコアとばらつき、業務KPI、データ更新後の再評価までを一つの検証計画にまとめると、机上の精度を本番の判断へつなげやすくなります。

よくある質問(FAQ)

ここでは、交差検証を設計・運用するときによくある疑問に、結論から回答します。分割方法だけでなく、本番で利用できる情報の範囲と最終評価の扱いも合わせて確認してください。

Q. 交差検証とは何ですか?

交差検証とは、データを複数のfoldに分け、学習用と検証用を入れ替えながらモデルの性能を評価する方法です。1回の分割だけに依存せず、平均スコアとばらつきを確認できるため、未知データへの汎化性能を推定しやすくなります。

Q. KFoldとホールドアウト法はどう違いますか?

ホールドアウト法はデータを一度だけ学習用と検証用に分ける方法で、計算が速い一方、分割の偶然に評価が左右されます。KFoldは複数の分割で評価するため計算量は増えますが、データが少ない場合でも結果の安定性を確認しやすくなります。

Q. fold数はいくつに設定すればよいですか?

5分割または10分割がよく使われますが、正解はデータ量と計算コストで決まります。fold数を増やすほど学習データは増える一方、計算時間が伸び、fold間の相関も高まりやすくなります。5分割を基準に、平均・標準偏差・実行時間を比較して決めると実務的です。

Q. StratifiedKFold、GroupKFold、TimeSeriesSplitはどう使い分けますか?

クラス比率を保ちたい分類にはStratifiedKFold、同じ顧客・患者・設備をまたいで分けたくない場合にはGroupKFold、未来を予測する時系列データにはTimeSeriesSplitを使います。データの生成単位と本番の予測単位に合う分割を選ぶことが重要です。

Q. 交差検証を使えばデータリークは防げますか?

防げるとは限りません。分割前に全データで標準化や欠損値補完を行うと、検証foldの情報が学習側へ漏れます。前処理とモデルをPipelineにまとめ、各foldの学習データだけで前処理を学習することで、リークを抑えます。

Q. 交差検証をした後もテストセットは必要ですか?

必要です。交差検証のスコアを見ながらモデルや特徴量を調整すると、検証データへも間接的に適合する可能性があります。最後までモデル選択に使わないテストセットを残し、採用モデルの最終性能を一度だけ確認してください。

参考資料

会社紹介

株式会社riplaでは、お客様の事業・ユーザー・業務に最適化したオーダーメイド型システムを、構想策定・要件定義から開発・改善まで一気通貫で支援。事業会社でIT・DXを経験したプロフェッショナルによる高い要件定義力・システム設計力を活かし、事業成果の最大化に伴走します。

また、当社独自の開発テンプレート「Boxシリーズ」による標準機能の高速開発と、AI駆動開発の独自フレームワーク「GoDD」による独自機能のAI実装を組み合わせることで、低コスト・短期間で開発を実現いたします。

もし、システム開発やプロダクト開発に関するご要望がございましたら、お気軽にお問い合わせください。

・サービス概要資料のURLはこちら >>>
・お問合せページのURLはこちら >>>
・お役立ち資料のURLはこちら >>>

執筆者プロフィール
張田谷凌央
張田谷凌央

株式会社ripla 代表取締役CEOとして、システムパッケージ活用、システム開発、データ分析、生成AI活用、SaaS開発、アプリ開発、EC構築など、幅広い領域で企業のDX推進と事業成長を支援している。事業会社でIT・DXを経験したプロフェッショナルが集う株式会社riplaにおいて、お客様の事業・ユーザー・業務に最適化したオーダーメイド型システムを構想策定・要件定義から開発・改善まで一気通貫で支援し、単なるシステム納品にとどまらず、クライアントと同じ目線で事業成果の最大化に向けた伴走支援を行う。早稲田大学卒業後、ラクスル株式会社、LINEヤフー株式会社にて事業開発やDX推進などに従事した後、株式会社riplaを創業。