二乗誤差の分解#

式の変形の仕方によって

  1. MSEをBiasの二乗とVarianceに分解できること

  2. 二乗誤差に対する最適解(ベイズ規則 Bayes rule)が条件付き期待値であること

という異なる2つの説明ができる

二乗誤差のBias-Variance分解#

予測値E[y^]について引いて足す場合

ED[(y^,y)]=E[(yy^)2]=E[(yE[y^]+E[y^]y^)2](E[y^])=E[(yE[y^])2+2(yE[y^])(E[y^]y^)+(E[y^]y^)2]=E[(yE[y^])2]+2E[(yE[y^])(E[y^]y^)]=2E[yE[y^]yy^E[y^]2+E[y^]y^]=2(yE[y^]yE[y^]E[y^]2+E[y^]2)=0+E[(E[y^]y^)2]=(yE[y^])2+Var[y^]=Bias2+Variance
もっと丁寧に書くと…

目的変数Yが真の関数(信号成分)f(X)とノイズεの和 Y=f(X)+ε で構成されるとする。 また、データの分布について期待値をとる、つまり、訓練データを取得し直して推定するたびにばらつく分について期待値をとることをED[] で表すとする。

あるデータ点X=xについての真の関数f(x)と予測モデルf^(x)の二乗誤差{f(x)f^(x)}2ED[f^(x)]を足して引いて展開すると以下のように整理できる。

{f(x)f^(x)}2={f(x)ED[f^(x)]+ED[f^(x)]f^(x)}2={f(x)ED[f^(x)]}2+2{f(x)ED[f^(x)]}{ED[f^(x)]f^(x)}+{ED[f^(x)]f^(x)}2

これについて期待値をとったED[{f(x)f^(x)}2]について考えるとき、第2項は

2ED[{f(x)ED[f^(x)]}{ED[f^(x)]f^(x)}]=2ED[f(x)ED[f^(x)]f(x)f^(x)ED[f^(x)]2+ED[f^(x)]f^(x)]=2(ED[f(x)ED[f^(x)]]ED[f(x)f^(x)]ED[ED[f^(x)]2]+ED[ED[f^(x)]f^(x)])=2(ED[f(x)]ED[f^(x)]ED[f(x)]ED[f^(x)]ED[f^(x)]2+ED[f^(x)]2)=0

と消失するので、

ED[{f(x)f^(x)}2]=ED[{f(x)ED[f^(x)]}2]+2ED[{f(x)ED[f^(x)]}{ED[f^(x)]f^(x)}]+ED[{ED[f^(x)]f^(x)}2]={f(x)ED[f^(x)]}2+ED[{ED[f^(x)]f^(x)}2]=Bias2+Variance

参考:はじパタ 第1章、PRML上3.2

実際に等式が成り立つのか実証的に確認#

Hide code cell source
# 二乗誤差の期待値とBias^2 + Varianceが一致するか
import pandas as pd
import numpy as np

# データを取り直して予測値を出し直したと仮定
n = 1000
y_true = 3
# 正規分布に従ってばらついたと仮定(実際も中心極限定理により正規分布に従うはず)
np.random.seed(0)
df = pd.DataFrame({"y_hat": np.random.normal(loc=y_true, scale=1, size=n)})
df["y"] = y_true # ある一点の実測値
# display(df.tail(3))

bias = df["y"].mean() - df["y_hat"].mean()
variance = df["y_hat"].var()
epe = ((df["y"] - df["y_hat"])**2).mean()

print(f"""
- bias: {bias:.3f}
- variance: {variance:.3f}

二乗誤差の期待値とBias^2 + Varianceが一致するか
- 二乗誤差の期待値 EPE: {epe:.3f}
- Bias^2 + variance: {bias**2 + variance:.3f}
- 差分(EPE - bias^2 + variance): {epe - (bias**2 + variance):.3f}
""")
- bias: 0.045
- variance: 0.975

二乗誤差の期待値とBias^2 + Varianceが一致するか
- 二乗誤差の期待値 EPE: 0.976
- Bias^2 + variance: 0.977
- 差分(EPE - bias^2 + variance): -0.001

二乗誤差のベイズ規則#

実測値E[y]について引いて足す場合。

損失関数として二乗損失 (y^,y)=(y^y)2を利用するとき、

E[(y^,Y)]=E[(y^Y)2]=E[(y^E[Y]+E[Y]Y)2](E[Y])=E[(y^E[Y])2+2(y^E[Y])(E[Y]Y)+(E[Y]y)2]=E[(y^E[Y])2]=(y^E[Y])2+2E[(y^E[Y])(E[Y]Y)]=2E[y^E[Y]y^YE[Y]2+E[Y]Y]=2y^E[Y]2y^E[Y]2E[Y]2+2E[Y]2=0+E[(E[Y]Y)2]=(y^E[Y])2+Var[Y]

となる。よってy^=E[Y]とすれば予測誤差が最小になる。

この期待値を条件付き期待値に置き換えて考えると、ベイズ規則h0(X)

h0(X)=E[Y|X]

によって与えられる。