🙋
機械学習の本でよく出てくる「交差検証(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 回だけ評価します。これを怠るとモデル選択バイアスが残り、論文や本番デプロイ後に性能が大幅に低下する事故につながります。