k-fold 交差検証シミュレーター 戻る
機械学習・統計

k-fold 交差検証シミュレーター

機械学習モデルの「未知データへの予測能力」を客観的に評価する k 分割交差検証を体感するツールです。サンプル数・分割数 k・モデル複雑度・雑音を動かすと、訓練誤差・CV 誤差・標準誤差・汎化ギャップがリアルタイムで変化し、バイアスと分散のトレードオフが直感的に分かります。

パラメータ設定
総サンプル数 N
学習に使えるデータの総数
分割数 k
5 または 10 が標準。N=k で LOOCV
モデル複雑度 d
多項式次数や層数の代理指標
真の雑音標準偏差 σ
どんなモデルでも下回れない誤差の床
モデルバイアス係数 b
仮説族と真の関数のミスマッチ強度
計算結果
訓練データ数
検証データ数
訓練 MSE
CV MSE
CV 標準誤差
汎化ギャップ (%)
k 分割の可視化 — fold の巡回アニメーション

水平バー=データセット。各 fold で一区画が検証(オレンジ)、残りが訓練(青)になり、k 回繰り返した平均を CV スコアとします。

バイアス² ・分散・総誤差 vs モデル複雑度
fold 別 CV エラー(標準誤差バー付き)
理論・主要公式

$$CV_{(k)} = \frac{1}{k}\sum_{i=1}^{k} L\!\left(y_i,\,\hat f^{-i}(x_i)\right),\qquad SE_{CV} = \frac{s_{CV}}{\sqrt{k}}$$

L は損失関数(回帰なら MSE、分類なら 0–1 損失)、$\hat f^{-i}$ は i 番目の fold を除いて学習したモデル。fold 平均で汎化誤差を推定し、SE で不確かさを定量化します。

$$\mathrm{MSE}_{\text{test}} = \underbrace{\bigl(\mathbb{E}[\hat f]-f\bigr)^2}_{\text{Bias}^2} + \underbrace{\mathrm{Var}(\hat f)}_{\text{Variance}} + \underbrace{\sigma^2}_{\text{Irreducible}}$$

テスト誤差はバイアス²・分散・不可避雑音の和。複雑度を上げるとバイアスは下がり分散は上がる、というトレードオフを CV で観測します。

k-Fold 交差検証

🙋
機械学習の本でよく出てくる「交差検証(cross-validation)」って、結局どんな評価のやり方なんですか?訓練データとテストデータに分ければ十分じゃないですか?
🎓
いい質問だね。データを「訓練 80% / テスト 20%」みたいに 1 回だけ分ける hold-out は、たまたまテストに難しいサンプルが偏ると評価が悲観的になるし、逆だと楽観的になる。k-fold はその「たまたま」を平均で打ち消す手法だよ。データを k 個に等分して、各回ごとに 1 個を検証・残り k-1 個で訓練、を k 回繰り返して平均する。例えば k=5 なら 1000 件のデータを 200 件ずつ 5 つに分けて、それぞれ「200 で検証 / 800 で訓練」を 5 通り回すんだ。
🙋
なるほど!じゃあ k を大きくすればするほど良いってことですか?極端に k = N まで上げる LOOCV とか。
🎓
実はそう単純じゃないんだ。k を大きくすると 1 回ごとの訓練データが N-1 件に近づくからバイアスは下がる。でも fold 同士のデータがほぼ重なるから、k 個の評価結果が強く相関して分散がむしろ大きくなる。さらに学習を k=N 回回す計算コストもバカにならない。経験的には k=10 がバイアスと分散のバランスが良いとされていて、Hastie・Tibshirani の "Elements of Statistical Learning" でも 5 または 10 が推奨されているよ。実務ではほぼ k=5 か 10 で十分。
🙋
左の「汎化ギャップ」って数字、複雑度 d を上げるとどんどん増えていきます。これって何を意味してるんですか?
🎓
それが過学習(overfitting)の指標だね。訓練 MSE はモデルが訓練データにどれだけフィットしたか、CV MSE は未知データへの予測誤差。両者の差が「optimism(楽観バイアス)」と呼ばれる量で、訓練誤差だけで評価すると現実より良く見えてしまう分なんだ。本ツールではこのギャップを CV MSE で割って % 表示している。25% を超えるとモデルが訓練データを覚え込みすぎているサイン。複雑度を下げるか、正則化を強めるか、データを増やす対応が必要だよ。
🙋
バイアスと分散のトレードオフって聞いたことあります。グラフを見ると複雑度を上げるとバイアス²はずっと下がるけど、分散が増えて総誤差は U 字になりますね。
🎓
そう、それがまさに古典的なバイアス・分散分解だよ。テスト誤差 = バイアス² + 分散 + 不可避雑音 σ² と分解できて、複雑度を上げるとバイアスは単調減少、分散は単調増加するから、和は必ず U 字を描く。一番下の点が「ちょうど良い複雑度」で、CV はこの点を経験的に当てに行く手段なんだ。最近のディープラーニングでは double descent と呼ばれる例外現象も見つかっているけど、まずはこの U 字を肌で理解するのが基本だよ。
🙋
標準誤差 SE が表示されているのも面白いですね。これって平均値のばらつきを表しているんですか?
🎓
そう。k 個の fold ごとに少しずつ違う CV エラーが出るから、その fold 間ばらつきを s_CV、平均値の標準誤差を SE = s_CV / √k で計算する。これがあると「モデル A の CV が 0.263、モデル B が 0.270」と数字だけ見て A が勝ちと判断するのを避けられる。両者の平均 ± 1 SE の範囲が重なるなら、統計的にはほぼ同等で、シンプルな方を選ぶというのが Breiman らの one-SE rule。実際の hyperparameter 探索でもよく使われる定石だよ。

よくある質問

実務では k=5 か k=10 が標準で、特に k=10 がもっとも広く使われます。k を大きくすると 1 回あたりの訓練データが N(k-1)/k に近づくため、推定値のバイアスは小さくなりますが、fold 間の相関が増えて分散が大きくなり、計算コストも比例して増えます。N=1000・k=5 なら訓練 800・検証 200 と十分なサンプルがあり、計算も 5 回で済むのでバランスが良いです。N が極端に小さいときだけ LOOCV(k=N)を検討します。
汎化ギャップは「optimism(楽観バイアス)」とも呼ばれ、訓練データだけで評価したときの誤差がどれだけ現実より甘く出ているかを示します。本ツールでは (CV 誤差 - 訓練誤差) / CV 誤差 × 100 (%) で表示します。25% 以下なら健全、25〜50% は過学習の兆候、50% を超えると典型的な過学習で、テスト時の性能が大きく落ちると考えられます。複雑度を 1 段下げる、正則化を強める、データを増やす、のいずれかで対処します。
CV の平均値だけでモデルを選ぶと、fold によるたまたまの良し悪しで誤った選択をしがちです。SE = s_CV / √k を計算し、平均 ± 1 SE の範囲が重なるモデル同士は統計的にほぼ同等とみなします。Breiman らが提唱した one-SE rule では、最良モデルの平均 + 1 SE の範囲に入る中で最もシンプルなモデルを選びます。複雑さを抑えながら過学習リスクを下げる実務的な手法として広く使われています。
使えません。ランダムに分割すると未来のデータが訓練に入り過去を予測する形になり(情報リーク)、評価が現実より大幅に楽観的になります。時系列では Walk-Forward(前進検証)や TimeSeriesSplit を使い、常に訓練データ→検証データの時間順を保ちます。また分類問題でクラス不均衡があるときは Stratified k-fold で各 fold のクラス比を母集団と同じに保つ必要があります。問題設定に応じた分割戦略の選択が、CV の信頼性を決めます。

実世界での応用

scikit-learn / PyTorch / XGBoost のモデル選択:多項式次数・木の深さ・学習率・正則化係数といったハイパーパラメータを GridSearchCV や RandomizedSearchCV で探索するとき、内部では k-fold CV が回っています。CV スコアの平均ではなく「平均 + 1 SE」を境界に最もシンプルなモデルを選ぶと、テストデータでの性能が安定しやすくなります。本ツールで複雑度を動かしながら U 字曲線の底を探す感覚を掴むと、実コードでの結果も読み解きやすくなります。

Kaggle・コンペティションのリーダーボード対策:Public LB のスコアだけで提出を選ぶと shake-up(最終順位の大変動)に遭いやすくなります。プロは必ず手元で 5-fold や 10-fold の CV を回し、CV と LB の相関を確認しながら最終モデルを決めます。CV と LB が大きくズレるときは、データ分布の違い(train/test split が時系列やグループで切られている等)を疑います。CV の標準誤差を把握すると「LB の上下 0.001 はノイズだから無視して良い」といった判断ができるようになります。

医療・創薬の予測モデル評価:患者数が数百〜数千と限られる医療データでは hold-out test が小さすぎて信頼性が落ちます。Stratified k-fold で陽性/陰性比を各 fold で揃え、Repeated k-fold(k-fold を異なるシードで複数回繰り返し平均)で評価を安定化させます。さらに患者単位の Group k-fold(同一患者のサンプルを同じ fold に閉じ込める)で情報リークを防ぐのが必須。FDA・PMDA への提出データでも、こうした CV プロトコルの妥当性が審査対象になります。

CAE・代理モデル(surrogate model)の構築:有限要素解析の結果から Kriging やニューラルネット代理モデルを作るとき、計算 1 件に数時間〜数日かかるためサンプル数 N が数十〜数百と非常に少ないことが多いです。この領域では LOOCV(k=N)が主流で、N 回の再学習コストを払ってでも 1 件 1 件の貢献を評価します。Design of Experiments(DOE)で次の計算点を選ぶ前に、LOOCV 誤差マップを見て予測の不確かさが大きい領域を優先するアクティブラーニング戦略にもつながります。

よくある誤解と注意点

最初の落とし穴が、「データ前処理を CV ループの外で行ってしまう」ことです。標準化(StandardScaler)・特徴量選択・PCA を全データに対して先に適用してから k-fold を回すと、検証 fold の情報が訓練フェーズに漏れ込んで CV スコアが楽観的に出ます。これを data leakage と呼びます。正しくは sklearn の Pipeline で前処理と推定器を 1 つにまとめ、Pipeline ごと cross_val_score に渡すか、各 fold 内で「訓練 fold で fit → 検証 fold に transform」を実行します。前処理が単純な標準化なら影響は小さいですが、特徴量選択(target を見ている)や PCA(分散を見ている)では数 % の楽観バイアスが普通に出ます。

次に、「CV の平均だけ見てモデルを決める」のも危険です。例えば 5-fold で {0.85, 0.82, 0.87, 0.83, 0.86} と {0.88, 0.70, 0.92, 0.75, 0.88} の平均はどちらも約 0.85 ですが、後者は fold 間ばらつきが大きく信頼できません。必ず標準偏差や標準誤差を報告し、複数モデルを比較するときは平均 ± 1 SE の重なりを確認します。one-SE rule に従えば、最良モデルの平均 + 1 SE 以内に入る最もシンプルなモデルを選ぶことで、本番でも安定した性能を期待できます。

最後に、「最終的なテスト評価まで CV だけで済ませる」のも要注意です。CV は hyperparameter チューニングに使うべきもので、その過程で何度も評価したデータは厳密には「見られたデータ」になっています。最終評価には必ず学習時に一度も触れていない hold-out test set を残しておくのが鉄則。理想は train(CV 用)/ validation(早期停止やしきい値調整)/ test(最終評価のみ)の 3 分割で、test は 1 回だけ評価します。これを怠るとモデル選択バイアスが残り、論文や本番デプロイ後に性能が大幅に低下する事故につながります。

使い方ガイド

  1. サンプル数(N)を設定:データセットの総サンプル数を入力。例えば機械学習プロジェクトで N=500 の場合、k=5 なら各折で100サンプルが検証用になります
  2. 分割数(k)を決定:通常 k=5 または k=10 を選択。k が小さいと各折の検証データが多く(N/k が大きい)、計算コストが低下しますが分散が増加します
  3. モデル複雑度(d)と雑音レベル(σ)を調整:例えば d=3(3次多項式)、σ=0.5 と設定すると、各折での訓練 MSE と CV MSE の乖離が可視化されます
  4. 「シミュレート実行」をクリック:k 回の反復で訓練誤差と検証誤差を計算し、汎化ギャップ(%)と CV 標準誤差を出力

具体的な計算例

化学プロセスの収率予測モデル開発で N=200 サンプル、k=5、d=2(2次多項式回帰)、σ=0.8 と設定した場合:各折では 160 サンプルが訓練、40 サンプルが検証になります。実行結果として訓練 MSE=0.24、CV MSE=0.31、汎化ギャップ=29.2%、CV 標準誤差=0.045 が得られます。この場合、CV MSE が訓練 MSE を明確に上回っており軽度の過学習の兆候があるため、モデル複雑度 d=1(線形)への簡略化または正則化パラメータの調整を検討する値です。

実務での注意点

  1. 時系列データには層化 k-fold を使用:金融時系列の日次リターン予測で単純ランダム分割すると時間的依存性が破壊されるため、時系列順序を保持した分割が必須
  2. 不均衡分類問題では Stratified k-fold を適用:異常検知タスク(異常 2%、正常 98%)で無作為分割すると検証折に異常サンプルが 0 個になる可能性があり、層化分割で各折の陽性率を均等化
  3. CV 標準誤差が大きい場合(>0.1)はモデル再設計を検討:建築構造の耐震性評価で σ が高い観測環境下では k=10 へ増加させて推定精度を向上
  4. 汎化ギャップが 50% を超える場合は過学習判定:医療診断モデルで d が大きすぎると訓練データへの過適合が進行し実臨床での性能低下につながるため d 削減必須