K-分割交差検証シミュレーター 戻る
機械学習シミュレーター

K-分割交差検証シミュレーター — 多項式回帰の次数選択

1次元データに多項式回帰を行い、K-fold CV で最適な次数を選ぶ過程を可視化。訓練誤差と CV 誤差の差から、どの次数で過学習が始まるのかを直感的に学べます。

パラメータ設定
最大次数 d_max
分割数 K
ノイズ σ
データ点数 N

真の関数は $y = 2x - 0.5x^2 + 0.05x^3$($x \in [0,5]$)。データは決定論的 LCG(seed=42)でノイズを加えています。

計算結果
CV 最適次数 d*
最小 CV MSE
d* での訓練 MSE
過学習比率
訓練 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 のような「正直な評価方法」が必須なんだよ。

よくある質問

LOO は K = N の特別な K-fold で、各データを1点ずつテストにします。バイアスは最小(ほぼ全データで学習)ですが、N 回学習するので計算量が大きく、テストが1点ずつなので評価の分散が大きい傾向があります。実務では K = 5 か 10 がバランスよく、データセットの規模に応じて使い分けます。
ホールドアウトはデータを train/test に1回だけ分けるので、分け方の運でスコアが大きくぶれます。K-fold は K 通りの分け方の平均を取るため、評価のばらつきが小さくなります。データが少ないほど K-fold の優位性が大きくなり、データが豊富なら単純なホールドアウトでも十分実用的です。
分類問題でクラス比が偏っているときに使います。各 fold のクラス比を全体と同じに保つ層化サンプリングで、評価のばらつきを抑えられます。通常の KFold だと少数クラスがある fold にほとんど含まれないこともあり、評価が不安定です。回帰でも目的変数の分布を層化することがあります。
同じ CV データで「ハイパーパラメータ選択」と「最終性能評価」を兼ねると、CV スコアに対するメタ過学習が起きます。実務では Nested CV(外側で評価、内側でチューニング)を使うか、別途取り分けたテストセットで最終評価します。本ツールは次数選びの可視化に特化しており、選んだ d* の本当の汎化性能はさらに別データで測るのが正しい手順です。

実世界での応用

機械学習モデルのハイパーパラメータ選択:scikit-learn の GridSearchCVRandomizedSearchCV は、内部で 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* の真の性能」ではないことに注意してください。