🎓 レベル:発展 | 重要度:B(標準)
📎 前提:情報量規準WAICとDIC | 関連:訓練・検証・テストと交差検証(機械学習)
要点(BLUF)
- 交差検証は「データを抜いて予測」で予測性能を直接測ります。極限が一個抜き交差検証(LOO-CV)——1点ずつ抜いて、その点を予測。理想ですが 回の再フィットは重い。
- 重点サンプリング LOO(IS-LOO / PSIS-LOO):全データの事後を1回計算し、重み付けで各点の LOO 予測を近似。再フィット不要です。
- WAIC(情報量規準WAICとDIC)と漸近一致。実装で厳密 LOO = IS-LOO = WAIC の一致を確かめます。
1. 交差検証で予測性能を直接測る
情報量規準(情報量規準WAICとDIC)は予測性能を「当てはまり − 複雑さの罰」で近似しました。交差検証は、実際に一部を抜いて残りで学習し、抜いた分を予測して、予測性能を直接測ります。ベイズでは予測の良さを対数予測密度で測ります。
各点 を、それ以外 で学習した事後で予測した対数密度の和。大きいほど予測が良い。(LOO-IC)が WAIC と同じスケールで比較できます。
2. 再フィットの重さと、重点サンプリングの回避策
LOO を定義どおりやると、各点を抜いた事後 を 個求める= 回の再フィットで、MCMC では現実的でありません。そこで重点サンプリング(importance sampling):全データの事後 から取ったサンプルを、 を抜いた事後へ重み付けで流用します。重みは
「 をうまく当てるサンプルほど、 を抜いた事後では割り引く」という補正。全データの事後を1回計算するだけで全点の LOO が出ます。
3. コード:厳密 LOO = IS-LOO = WAIC
ベイズ線形回帰(2次)で、(a) 厳密 LOO(毎回再フィット)、(b) IS-LOO、(c) WAIC が一致することを確かめます。
import numpy as np
from scipy import stats
rng = np.random.default_rng(0)
n = 30; sigma = 0.5; alpha = 0.5
x = np.sort(rng.uniform(-1, 1, n))
y = 1.0 + 0.5*x - 1.5*x**2 + rng.normal(0, sigma, n)
Phi = np.vander(x, 3, increasing=True); beta = 1/sigma**2
def posterior(Ph, yy):
S_N = np.linalg.inv(alpha*np.eye(Ph.shape[1]) + beta*Ph.T@Ph)
return beta*S_N@Ph.T@yy, S_N
# (a) 厳密LOO:1点ずつ抜いて再フィット、抜いた点の対数予測密度
elpd_exact = 0.0
for i in range(n):
idx = np.arange(n) != i
m, S = posterior(Phi[idx], y[idx])
pm, pv = Phi[i]@m, sigma**2 + Phi[i]@S@Phi[i] # LOO予測 N(pm, pv)
elpd_exact += stats.norm(pm, np.sqrt(pv)).logpdf(y[i])
# (b) IS-LOO:全データ事後から重み 1/p(y_i|θ_s) で補正(再フィットなし)
m_N, S_N = posterior(Phi, y)
W = rng.multivariate_normal(m_N, S_N, 8000)
p_is = stats.norm(W@Phi.T, sigma).pdf(y[None,:]) # p(y_i|θ_s) (S,n)
elpd_isloo = np.sum(-np.log(np.mean(1/p_is, axis=0)))
# (c) WAIC
ll = np.log(p_is)
elpd_waic = np.sum(np.log(np.mean(p_is, axis=0))) - np.sum(np.var(ll, axis=0, ddof=1))
print(f"elpd(対数予測密度の和・大きいほど良い):")
print(f" 厳密LOO(再フィット) = {elpd_exact:.3f}")
print(f" IS-LOO(重点サンプリング)= {elpd_isloo:.3f}")
print(f" WAIC近似 = {elpd_waic:.3f}")
print(f" LOO-IC = {-2*elpd_isloo:.2f} (WAIC = {-2*elpd_waic:.2f})")
出力:
elpd(対数予測密度の和・大きいほど良い):
厳密LOO(再フィット) = -19.636
IS-LOO(重点サンプリング)= -19.618
WAIC近似 = -19.599
LOO-IC = 39.24 (WAIC = 39.20)
出力の意味:3つの elpd が 付近でぴたりと一致。IS-LOO は再フィットなし(全データ事後1回+重み付け)で、 回再フィットした厳密 LOO を再現しました。WAIC も漸近的に LOO に一致するため、ほぼ同じ値(LOO-IC と WAIC )。だから実務では、計算の軽い IS-LOO や WAIC で予測性能を比較できます。
4. PSIS-LOO と k 診断
素朴な IS-LOO の重み は、外れ値や影響の強い点で裾が重く不安定になります。これを PSIS(Pareto smoothed importance sampling) が安定化します——大きい重みに一般化パレート分布を当てて平滑化し、同時にその形状パラメータ を診断に使います。
- :IS-LOO の近似は信頼できる。
- :その点で近似が不安定。その点だけ厳密に再フィットするか、モデルを見直す合図。
PSIS-LOO は WAIC より頑健で、外れ値・影響点を で自動的に警告してくれる利点があります。実務では ArviZ の az.loo(PSIS-LOO)が定番です(API・既定は更新が速く要最新確認、確率的プログラミング概観)。
⚠️ よくある誤解
- 「LOO は必ず 回再フィットが要る」ではない:重点サンプリング(PSIS-LOO)で全データ事後1回から近似できます(§3)。
- 「WAIC と LOO は別物」ではない:漸近的に一致。LOO のほうが有限標本で頑健で 診断が付きます。
- 「IS-LOO はいつでも正確」ではない:影響の強い点で重みの裾が重くなり不安定。 なら要注意(§4)。
- 「交差検証は予測誤差そのもの」ではない:ベイズ LOO は対数予測密度 elpd で測り、不確実性込みで予測の良さを評価します(点予測の MSE とは別)。
関連ノート
- 情報量規準WAICとDIC
- ベイズファクターとモデル平均化(次のトピック・周辺尤度によるモデル比較)
- ベイズ線形回帰(LOO を計算した回帰モデル)
- 訓練・検証・テストと交差検証(機械学習・交差検証の基礎)
- 第8章 モデル評価と選択 目次
- ベイズ統計テキスト 全体目次