パラメータ設定
リセット
真の関数は $y = 2x - 0.5x^2 + 0.05x^3$($x \in [0,5]$)。データは決定論的 LCG(seed=42)でノイズを加えています。
訓練 MSE と CV MSE / データとフィット曲線
上段: 訓練 MSE(青)と CV MSE(赤)vs 多項式次数 d、★ が CV 最適 / 下段: データ点 + 最適次数フィット(緑)+ 高次オーバーフィット曲線(紫破線)
理論・主要公式
多項式回帰のモデル。次数 $d$ の多項式を最小二乗で当てはめます:
$$\hat y(x) = \beta_0 + \beta_1 x + \beta_2 x^2 + \cdots + \beta_d x^d$$
訓練データに対する平均二乗誤差(MSE):
$$\mathrm{MSE}_\text{train} = \frac{1}{n}\sum_{i=1}^{n}\bigl(y_i - \hat y(x_i)\bigr)^2$$
K-fold 交差検証 MSE。データを $K$ 等分し、各 fold を順に test として学習・評価します:
$$\mathrm{MSE}_\text{CV} = \frac{1}{K}\sum_{k=1}^{K}\mathrm{MSE}_\text{test}^{(k)}$$
最適次数は $\arg\min_d \mathrm{MSE}_\text{CV}(d)$。訓練 MSE は $d$ を上げると単調に減りますが、CV MSE は途中で底を打って上昇に転じます——その底が過学習の境目です。
K-分割交差検証シミュレーターとは
🙋
「交差検証」って機械学習でよく聞きますけど、結局なにを確かめているんですか?
🎓
ざっくり言うと「未知のデータに対するモデルの当てはまり度」を、手元のデータだけで推定する手続きだよ。データを K 個の塊に分けて、そのうち1つを順番にテスト、残りを訓練に使って学習・評価を K 回繰り返す。上のシミュレーターで「分割数 K」を 5 から 2 に下げると、CV カーブが少しガタつくのが見える——テストに使うデータが多いほど評価が安定する反面、訓練量が減るからね。
🙋
グラフを見てると、訓練 MSE はずっと下がるのに、CV MSE は途中で底を打って上がりますね。これが「過学習」ですか?
🎓
まさにそれが過学習の正体だ。多項式の次数を上げれば訓練データには好きなだけフィットできるけど、ノイズまで覚えてしまって新しいデータでは外れる。下段のグラフを見て——緑が CV 最適次数のフィット、紫の破線が最大次数のフィット。紫はデータ点を全部通ろうとしてグニャグニャしてるだろう?これが「ノイズを記憶してしまった」状態だ。
🙋
真の関数は 3 次なのに、最適次数が 3 か 4 になるのは何でですか?
🎓
理想は 3 次がぴったり選ばれてほしいけど、ノイズが乗っているデータでは「ちょうど 1 つ余分な係数」を加えてもさほど悪くないことがある。だから 3 か 4 が拮抗して、ノイズの引き方で揺れる。実務でも「真の次数」は知らないのが普通だから、CV で底が浅い領域の中から「より単純な方」(パラメトニーの原則)を選ぶ、という運用がよく取られるよ。
🙋
ノイズ σ を 0 にすると過学習も消えるんですか?
🎓
試してみて。σ=0 なら真の関数を 3 次以上の任意の多項式が完璧に再現できて、訓練・CV 両方の MSE がほぼゼロに落ち着くはず。実データには必ずノイズが乗るから、過学習は避けられない宿命。だからこそ CV のような「正直な評価方法」が必須なんだよ。
よくある質問
Leave-One-Out (LOO) CV と K-fold はどう違いますか?
LOO は K = N の特別な K-fold で、各データを1点ずつテストにします。バイアスは最小(ほぼ全データで学習)ですが、N 回学習するので計算量が大きく、テストが1点ずつなので評価の分散が大きい傾向があります。実務では K = 5 か 10 がバランスよく、データセットの規模に応じて使い分けます。
単純なホールドアウト法と比べた利点は?
ホールドアウトはデータを train/test に1回だけ分けるので、分け方の運でスコアが大きくぶれます。K-fold は K 通りの分け方の平均を取るため、評価のばらつきが小さくなります。データが少ないほど K-fold の優位性が大きくなり、データが豊富なら単純なホールドアウトでも十分実用的です。
Stratified KFold はどんな場面で必要ですか?
分類問題でクラス比が偏っているときに使います。各 fold のクラス比を全体と同じに保つ層化サンプリングで、評価のばらつきを抑えられます。通常の KFold だと少数クラスがある fold にほとんど含まれないこともあり、評価が不安定です。回帰でも目的変数の分布を層化することがあります。
ハイパーパラメータ最適化に CV を使うときの注意点は?
同じ CV データで「ハイパーパラメータ選択」と「最終性能評価」を兼ねると、CV スコアに対するメタ過学習が起きます。実務では Nested CV(外側で評価、内側でチューニング)を使うか、別途取り分けたテストセットで最終評価します。本ツールは次数選びの可視化に特化しており、選んだ d* の本当の汎化性能はさらに別データで測るのが正しい手順です。
実世界での応用
機械学習モデルのハイパーパラメータ選択: scikit-learn の GridSearchCV や RandomizedSearchCV は、内部で K-fold CV を回して各候補の性能を比較し、最良のハイパーパラメータを選びます。XGBoost や LightGBM の木の深さ・学習率、リッジ回帰の正則化係数 λ など、ほぼ全てのモデルでこの手順が標準です。
サロゲートモデルの精度評価(CAE): 応答曲面法や Kriging で実機 CAE 解析の代理モデルを作るとき、K-fold CV で「サロゲートが未知の設計点でどの程度信頼できるか」を見積もります。最適化に渡す前にこの精度を確認しないと、サロゲートの外挿で見当外れの最適解を出してしまいます。
材料試験データへの構成則フィット: 少量の実験データから降伏曲線や疲労 S-N 曲線をフィットする際、過剰に複雑な関数で全データを通すと外挿で破綻します。CV で「データを覚えてしまわない複雑度」を選ぶことが、現場で使える構成則を得るための鍵です。
時系列モデルの評価(時系列 CV): 株価や需要予測など時間順序があるデータでは、通常の K-fold は使えません(未来データで学習して過去を予測することになる)。代わりに「拡大窓 CV(expanding window)」「スライディングウィンドウ CV」を使い、常に過去で学習・未来で評価する分割方式に置き換えます。
よくある誤解と注意点
最も多い誤解は、「CV を使えば過学習は完全に防げる」と考えてしまう ことです。CV はあくまで「どの程度過学習しているか」を計測するメジャーであり、過学習自体を止める仕組みではありません。複雑すぎるモデルを使えば CV MSE も高く出てしまいます。CV はあくまで複数の候補モデルを比較 する道具で、選択肢の中に良いモデルがなければ、CV をいくら回しても改善しません。シミュレーターで σ を大きくしてみると、どの次数でも CV MSE が下がらない様子が見えます。
次に多いのが、K の値を「とにかく大きくすれば良い」と思い込む ことです。K を大きくすると訓練データが多くなりバイアスが減りますが、各 fold のテストが少なくなって評価の分散が増えます。さらに計算量が線形に増えます。実務では K=5 や K=10 が、バイアス・分散・計算コストのバランスとして広く使われます。シミュレーターで K=2 と K=10 を比べると、後者の CV カーブがより滑らかになるのが分かるでしょう。
最後に、「CV で選んだモデルの CV スコア = そのモデルの本当の汎化性能」と等号で結んでしまう 誤りです。複数候補から最良を選ぶ過程で、CV スコアには選択バイアスが入り込み、本当の性能より楽観的になります。コンペや論文ではこれが致命傷になります。正しい運用は「最終評価用のホールドアウトセット」を別に確保しておく、または Nested CV を使うこと。本ツールでも「d* の CV MSE = d* の真の性能」ではないことに注意してください。