ブートストラップとテスト誤差の哲学

7.11-7.12 Bootstrap Methods & Conditional or Expected Test Error?

クロスバリデーションは「データを折り目で分けて使い回す」という発想だった。 ブートストラップはさらに大胆だ——「データを無限に水増しして、分布そのものを推定する」。

同じデータから何度でもサンプリングすることで、統計量の変動を直接観察できる。 しかしここには落とし穴がある。ブートストラップがモデル評価に使われるとき、 訓練データとテストデータが「重なってしまう」という問題が生じるのだ。

ブートストラップとは何か——「データの分身」を作る

データは有限だ。でも統計的な信頼性を測るには、同じ条件で何度も実験を繰り返したい。 そんな夢を叶える技術がブートストラップだ。

発想はシンプルだ。手持ちのデータから復元あり(replacement付き)サンプリングによって「仮想の新しいデータセット」を作り出す。 カードを一枚引いて戻す操作を繰り返すイメージだ。元のデータと同じN枚になるまで引き続ければ、似ているが少し違うデータセットの完成だ。

元データからブートストラップサンプルが複数生成されるプロセス

アニメーションが示すように、元データ(黄色)から複数のブートストラップサンプル(青)が生成される。 各サンプルは元データの一部が重複し、一部が欠落したものだ。 元のデータを $\mathbf{Z} = (z_1, z_2, \ldots, z_N)$ とすると、 ブートストラップでは N 個を復元抽出して新しいデータセット $\mathbf{Z}^{*b}$ を作る。 これを B 回繰り返すと、B 個の「ブートストラップサンプル」が得られる。

各サンプルでモデルを学習し、統計量 $S(\mathbf{Z})$(例えば、ある点 x での予測値)を計算する。 B 個の値 $S(\mathbf{Z}^{*1}), \ldots, S(\mathbf{Z}^{*B})$ばらつきが、元の統計量の変動を教えてくれる。

分散の推定は次の式で行う:

$$\widehat{\text{Var}}[S(\mathbf{Z})] = \frac{1}{B-1}\sum_{b=1}^{B}\left(S(\mathbf{Z}^{*b}) - \bar{S}^*\right)^2$$

ここで $\bar{S}^* = \frac{1}{B}\sum_b S(\mathbf{Z}^{*b})$ は B 個の平均値だ。 この考え方はモンテカルロシミュレーションに似ている。実際のデータの経験的分布から繰り返しサンプリングすることで、 任意の統計量の変動を直接観察できる。

63.2% の罠——ブートストラップの隠れた問題

ブートストラップで予測誤差を推定しようとすると、一つの自然なアイデアが浮かぶ。 「各ブートストラップサンプルでモデルを訓練し、元の訓練データで評価すればよいのでは?」

直感的な推定式は:

$$\widehat{\text{Err}}_{\text{boot}} = \frac{1}{B}\frac{1}{N}\sum_{b=1}^{B}\sum_{i=1}^{N}L(y_i, \hat{f}^{*b}(x_i))$$

しかし、これは深刻なバイアスを持つ。なぜか?

ブートストラップサンプルに含まれる元データの割合(63.2%)の可視化

問題の核心は「重なり(overlap)」だ。 ブートストラップサンプルで訓練したモデルを、元の訓練データで評価すると、モデルはすでにその点を「見ている」可能性が高い。 これは過学習の典型的な罠だ。

具体的に計算してみよう。観測 $i$ がブートストラップサンプル $b$含まれる確率は:

$$\Pr\{i \in \mathbf{Z}^{*b}\} = 1 - \left(1 - \frac{1}{N}\right)^N \approx 1 - e^{-1} \approx 0.632$$

N 個の枠のうち、1回の抽選で $i$ が選ばれない確率は $(1 - 1/N)$。 N 回とも選ばれない確率は $(1 - 1/N)^N$。 N が大きくなると $e^{-1} \approx 0.368$ に収束する。

つまり、各ブートストラップサンプルには平均 63.2% の元データが含まれる。 残り 36.8% のデータは「見たことのないテストデータ」として機能する。

この重なりのために、$\widehat{\text{Err}}_{\text{boot}}$ は真の誤差より大幅に低く(楽観的に)なってしまう。 正解率が 50% であるべき問題で、$0.5 \times 0.368 = 0.184$(18.4%)という誤った値が出てしまうこともある。 これが「63.2% の罠」だ。

Leave-One-Out ブートストラップ——自分が「不在」のときだけ評価する

クロスバリデーションが解決策を教えてくれる。「訓練に使ったデータで評価しない」というルールだ。 これをブートストラップに適用したのがLeave-One-Out ブートストラップ(LOO ブートストラップ)だ。

観測点 $i$ については、「$i$ を含まないブートストラップサンプル」で訓練したモデルのみで評価する。 まるで「自分がいない会議での評判」を聞くように——自分の存在が結果を歪めないように設計されている。

LOOブートストラップで点iを含まないサンプルのみで評価する様子

アニメーションで確認できるように、評価対象の点(赤い点 i)を含むサンプルはグレーアウトされ、 含まないサンプル(青)のみが評価に使われる。

$C^{-i}$ を「$i$ を含まないブートストラップサンプルの添字の集合」とすると:

$$\widehat{\text{Err}}^{(1)} = \frac{1}{N}\sum_{i=1}^{N}\frac{1}{|C^{-i}|}\sum_{b \in C^{-i}}L(y_i, \hat{f}^{*b}(x_i))$$

この推定量は $\widehat{\text{Err}}_{\text{boot}}$ の過学習問題を解決する。 しかし別の問題が生じる。

各ブートストラップサンプルには平均 $0.632 \cdot N$ 個の異なる観測点が含まれる。 LOO ブートストラップでの訓練サイズは、約 63.2% のデータで訓練した場合に相当する。

学習曲線(データ量と誤差の関係)に急な傾きがある場合、N 点で訓練したモデルと 0.632N 点で訓練したモデルの性能は大きく異なる。 そのため LOO ブートストラップは真の誤差より高め(悲観的)になりやすい。 この「バイアスの方向性」は、クロスバリデーションが抱える問題と同じだ。

.632 推定量——バイアスを半分ずつ取る妥協の美学

ここで2つの推定量の状況を整理しよう:

Efron(1983)は、この2つを「63.2% と 36.8%」という比率でブレンドする.632 推定量を提案した:

$$\widehat{\text{Err}}^{(.632)} = 0.368 \cdot \overline{\text{err}} + 0.632 \cdot \widehat{\text{Err}}^{(1)}$$
訓練誤差とLOOブートストラップを0.368/0.632の重みでブレンドする様子

アニメーションで見るように、左端の楽観的な推定(訓練誤差)と右端の悲観的な推定(LOO)の中間に、 .632 推定量(黄色)が出現する。なぜ 0.632 なのか? それは先ほどの「ブートストラップサンプルに含まれる確率」($\approx 0.632$)と一致する。 LOO ブートストラップが「実質的に 63.2% のデータで訓練した」ことを反映して、両者をブレンドするのだ。

しかし .632 推定量にも欠点がある。過学習が激しいケース(例:1-最近傍法)では破綻する。 1-最近傍法は訓練誤差 $\overline{\text{err}} = 0$ になることがあり、 その場合 .632 推定量は真の誤差の 63.2% を大きく下回ってしまう。

そこで登場するのが.632+ 推定量だ。過学習の程度に応じて、ブレンド比率を動的に調整する。 まず「無情報誤差率(no-information error rate)」$\hat{\gamma}$ を定義する。 これは「入力と出力が完全に独立だったときの誤差」——完全にでたらめなモデルの誤差だ。

相対過学習率を次のように定義する:

$$\hat{R} = \frac{\widehat{\text{Err}}^{(1)} - \overline{\text{err}}}{\hat{\gamma} - \overline{\text{err}}}$$

これは 0(過学習なし)から 1(無情報誤差まで過学習)の値を取る。 動的なブレンド重みを $\hat{w} = \frac{0.632}{1 - 0.368\hat{R}}$ とすると:

$$\widehat{\text{Err}}^{(.632+)} = (1 - \hat{w}) \cdot \overline{\text{err}} + \hat{w} \cdot \widehat{\text{Err}}^{(1)}$$

$\hat{R} = 0$(過学習なし)のとき $\hat{w} = 0.632$(通常の .632 推定量)、$\hat{R} = 1$(最大過学習)のとき $\hat{w} = 1$(LOO ブートストラップのみ)になる。 過学習が激しいほど、LOO ブートストラップへの重みが増す——これが「動的な妥協」だ。

条件付き誤差 vs 期待誤差——「このデータセット」への問いか「平均的なデータセット」への問いか

これまで「テスト誤差を推定する」と言ってきたが、実は重要な哲学的問いが隠れている。 「どのデータセットに対するテスト誤差を推定しているのか?」

2種類の「テスト誤差」を区別しよう:

条件付きテスト誤差(Conditional Test Error): 「この特定の訓練データ $\mathcal{T}$ から学習したモデルが、新しいデータに対してどれくらい間違えるか」

$$\text{Err}_{\mathcal{T}} = \text{E}_{X^0, Y^0}\left[L(Y^0, \hat{f}(X^0)) \mid \mathcal{T}\right]$$

期待テスト誤差(Expected Test Error): 「ランダムな訓練データから学習した場合の、平均的な汎化誤差はいくらか」

$$\text{Err} = \text{E}_{\mathcal{T}}\left[\text{Err}_{\mathcal{T}}\right] = \text{E}_{\mathcal{T}}\text{E}_{X^0, Y^0}\left[L(Y^0, \hat{f}(X^0)) \mid \mathcal{T}\right]$$

実用的には、手元の訓練データは固定されているので、$\text{Err}_{\mathcal{T}}$ が知りたいのが自然だ。 しかし実験結果は衝撃的な事実を示す。

異なる訓練セットによる条件付き誤差の分布と期待誤差。散布図が負の相関を示す

アニメーションの上段を見ると、5つの訓練セットそれぞれに対する $\text{Err}_{\mathcal{T}}$ は異なる高さの棒になる。 赤い水平線がその平均(期待誤差 $\text{Err}$)だ。

下段の散布図が驚くべきパターンを示す。横軸が真の条件付き誤差 $\text{Err}_{\mathcal{T}}$、 縦軸が CV 推定値だ。点が負の相関を示しているのがわかるか?

「CV 誤差が高い訓練セットほど、本当の条件付き誤差も高いはず」と思いたくなる。 ところが実際には、CV 誤差が高い訓練セットは必ずしも本当の条件付き誤差が高いわけではない。

なぜか?CV はデータを分割して互いに評価するが、特定の訓練セットの「独自の難しさ」を捉えにくい。 運悪く難しいデータが多い訓練セットでは、CV もそれを反映してしまう。

重要な結論:クロスバリデーションや .632 ブートストラップは、期待誤差 Err の推定には有効だが、 「この特定の訓練データに対する条件付き誤差」の推定には適していない。 条件付き誤差を正確に推定したければ、独立したテストセットが必要だ。

まとめ——ブートストラップが教える「正直さ」

ここまでの旅を振り返ろう。ブートストラップとクロスバリデーション、モデル選択のための強力なツールを2つ学んだ。

ブートストラップの進化の歴史:

AIC・CV・Bootstrapの3手法による誤差推定精度の比較

実験的に、AIC・クロスバリデーション・ブートストラップはモデル選択(どのモデルが最もよいかを選ぶ)においてはほぼ同等の性能を持つ。 しかし誤差の絶対値の推定では差が出る:

決定木のような複雑な適応的手法では、AIC は使えない。クロスバリデーションかブートストラップが唯一の選択肢だ。

そして最後の教訓:自分の手持ちのデータへの条件付き誤差は、そのデータだけからは推定できない。 クロスバリデーションや .632 ブートストラップで測っているのは「期待誤差」——多数の訓練セットにわたる平均的な性能だ。

特定の訓練セットへの真の意味での「信頼性」を知りたければ、独立したテストセットが必要だ。 これが統計的学習の「正直さ」——ツールの限界を知ることが、ツールを正しく使う第一歩だ。