赤池情報量基準(AIC: Akaike Information Criterion)は、統計モデルの良さを評価するための指標です。参考書や論文でモデル選択の話題になると必ず登場する概念ですが、なぜこの式でモデルの良さが測れるのか、直感的にわかりにくい部分もあります。
本記事では、AICの定義とその背景にある考え方を丁寧に解説し、Pythonでの実装を通じて理解を深めます。
本記事の内容
- AICの定義と直感的な理解
- KLダイバージェンスとの関係
- AICの数学的な導出
- Pythonでのモデル選択の実装
前提知識
この記事を読む前に、以下の概念を理解しておくと読みやすくなります。
- 最尤推定の基本的な考え方
- 対数尤度の定義
AICとは
AIC(赤池情報量基準)は、1973年に赤池弘次によって提案されたモデル選択基準です。複数の候補モデルがある場合に、どのモデルがデータを最もよく説明するかを比較するために使います。
大雑把に言うと、AICは「モデルの当てはまりの良さ」と「モデルの複雑さ」のバランスを取る指標です。パラメータを増やせば当てはまりは良くなりますが、過学習のリスクが高まります。AICはこのトレードオフを定量的に評価します。
AICの数学的定義
AICは次のように定義されます。
$$ \begin{equation} \text{AIC} = -2 \ln L(\hat{\theta}) + 2k \end{equation} $$
ここで、
- $L(\hat{\theta})$:最大尤度(最尤推定量 $\hat{\theta}$ における尤度関数の値)
- $k$:モデルのパラメータ数
AICが小さいモデルほど良いモデルと判断します。
AICの直感的な理解
AICの式を分解して考えてみましょう。
$$ \text{AIC} = \underbrace{-2 \ln L(\hat{\theta})}_{\text{当てはまりの悪さ}} + \underbrace{2k}_{\text{複雑さへのペナルティ}} $$
第1項 $-2 \ln L(\hat{\theta})$ は対数尤度の $-2$ 倍です。対数尤度が大きい(当てはまりが良い)ほど、この項は小さくなります。つまり、この項は「当てはまりの悪さ」を表しています。
第2項 $2k$ はパラメータ数に比例するペナルティ項です。パラメータが多い(モデルが複雑な)ほど、この項は大きくなります。
この2つの項のバランスによって、「適度に当てはまりが良く、かつ複雑すぎないモデル」を選ぶことができます。
KLダイバージェンスとの関係
AICの理論的な背景には、KL(Kullback-Leibler)ダイバージェンスがあります。
真のデータ生成分布を $g(x)$、モデルによる分布を $f(x|\theta)$ とすると、KLダイバージェンスは次のように定義されます。
$$ \begin{equation} D_{\text{KL}}(g \| f) = \int g(x) \ln \frac{g(x)}{f(x|\theta)} dx \end{equation} $$
これを展開すると、
$$ \begin{align} D_{\text{KL}}(g \| f) &= \int g(x) \ln g(x) \, dx – \int g(x) \ln f(x|\theta) \, dx \\ &= -H(g) – E_g[\ln f(x|\theta)] \end{align} $$
ここで $H(g)$ は真の分布のエントロピーで、モデルに依存しない定数です。したがって、KLダイバージェンスを最小化するモデルを選ぶことは、$E_g[\ln f(x|\theta)]$ を最大化するモデルを選ぶことと等価です。
AICは、この期待対数尤度 $E_g[\ln f(x|\hat{\theta})]$ の推定量として導出されます。最尤推定量 $\hat{\theta}$ を使って計算した対数尤度は、期待対数尤度を過大評価するバイアスを持ちます。赤池は、このバイアスがおおよそパラメータ数 $k$ に等しいことを示しました。
$$ \begin{equation} E_g\left[\ln f(x|\hat{\theta})\right] \approx \frac{1}{n} \ln L(\hat{\theta}) – \frac{k}{n} \end{equation} $$
この関係を $-2n$ 倍して整理すると、AICの式が得られます。
導出の概略
データ $x_1, x_2, \dots, x_n$ が真の分布 $g(x)$ から独立に生成されたとします。モデル $f(x|\theta)$ に対する対数尤度は次のようになります。
$$ \begin{equation} \ln L(\theta) = \sum_{i=1}^{n} \ln f(x_i|\theta) \end{equation} $$
最尤推定量 $\hat{\theta}$ を求めた後、新しいデータ $y$ に対する期待対数尤度を考えます。
$$ \begin{equation} E_g[\ln f(y|\hat{\theta})] \end{equation} $$
訓練データに対する対数尤度 $\frac{1}{n}\ln L(\hat{\theta})$ は、この期待値の楽観的な推定になっています。赤池はテイラー展開を用いて、正則条件の下でバイアスの期待値が近似的に
$$ \begin{equation} E\left[\frac{1}{n}\ln L(\hat{\theta}) – E_g[\ln f(y|\hat{\theta})]\right] \approx \frac{k}{n} \end{equation} $$
であることを導きました。したがって、バイアスを補正した推定量は
$$ \begin{equation} \frac{1}{n}\ln L(\hat{\theta}) – \frac{k}{n} \end{equation} $$
となり、$-2n$ を掛けると
$$ \begin{equation} \text{AIC} = -2 \ln L(\hat{\theta}) + 2k \end{equation} $$
が得られます。
具体例:多項式回帰でのモデル選択
ここでは、多項式回帰の次数を変えてAICを比較し、最適なモデルを選択する例を示します。
真のデータ生成過程として $y = \sin(x) + \varepsilon$ ($\varepsilon \sim N(0, 0.3^2)$) を考え、1次〜8次の多項式モデルで当てはめます。
Pythonでの実装
import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import polynomial as P
# 再現性のための乱数シード
np.random.seed(42)
# データ生成: y = sin(x) + ノイズ
n = 30
x = np.linspace(0, 2 * np.pi, n)
y_true = np.sin(x)
y = y_true + np.random.normal(0, 0.3, n)
def compute_aic(y_obs, y_pred, k):
"""AICを計算する関数
Parameters
----------
y_obs : 観測値
y_pred : モデルの予測値
k : パラメータ数
Returns
-------
aic : AICの値
"""
n = len(y_obs)
# 残差の分散(最尤推定)
rss = np.sum((y_obs - y_pred) ** 2)
sigma2_mle = rss / n
# 対数尤度(正規分布を仮定)
log_likelihood = -n / 2 * np.log(2 * np.pi * sigma2_mle) - n / 2
# AIC
aic = -2 * log_likelihood + 2 * k
return aic
# 多項式の次数を変えてAICを計算
degrees = range(1, 9)
aic_values = []
for deg in degrees:
# 多項式フィッティング
coeffs = np.polyfit(x, y, deg)
y_pred = np.polyval(coeffs, x)
# パラメータ数 = 係数の数 + 分散パラメータ
k = deg + 1 + 1
aic = compute_aic(y, y_pred, k)
aic_values.append(aic)
# 最適な次数
best_deg = degrees[np.argmin(aic_values)]
print(f"最適な多項式の次数: {best_deg}")
print(f"各次数のAIC: {dict(zip(degrees, [f'{a:.2f}' for a in aic_values]))}")
# 可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左: AICの比較
axes[0].bar(degrees, aic_values, color='steelblue', alpha=0.8)
axes[0].bar(best_deg, aic_values[best_deg - 1], color='orangered', alpha=0.9)
axes[0].set_xlabel('Polynomial Degree')
axes[0].set_ylabel('AIC')
axes[0].set_title('AIC vs Polynomial Degree')
axes[0].set_xticks(list(degrees))
# 右: データと最適モデルのフィッティング
x_plot = np.linspace(0, 2 * np.pi, 200)
axes[1].scatter(x, y, color='black', s=20, label='Observed data', zorder=5)
axes[1].plot(x_plot, np.sin(x_plot), 'g--', label='True function (sin x)', linewidth=2)
for deg in [1, best_deg, 8]:
coeffs = np.polyfit(x, y, deg)
y_plot = np.polyval(coeffs, x_plot)
label = f'Degree {deg}' + (' (Best AIC)' if deg == best_deg else '')
axes[1].plot(x_plot, y_plot, label=label, linewidth=1.5)
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].set_title('Polynomial Fitting')
axes[1].legend()
axes[1].set_ylim(-2, 2)
plt.tight_layout()
plt.show()
このコードでは、1次〜8次の多項式回帰モデルそれぞれについてAICを計算し、最もAICが小さい次数を最適モデルとして選択しています。左のグラフではAICの値を棒グラフで比較し、右のグラフでは実データとフィッティング結果を可視化しています。
次数が低すぎるとデータの構造を捉えられず(アンダーフィッティング)、次数が高すぎるとノイズまで拾ってしまいます(オーバーフィッティング)。AICはこのバランスを自動的に判断してくれます。
AICとBICの比較
AICと並んでよく使われるモデル選択基準にBIC(ベイズ情報量基準)があります。
$$ \begin{equation} \text{BIC} = -2 \ln L(\hat{\theta}) + k \ln n \end{equation} $$
AICとの違いはペナルティ項です。
| 基準 | ペナルティ項 | 特徴 |
|---|---|---|
| AIC | $2k$ | 予測精度を重視。サンプル数に依存しない |
| BIC | $k \ln n$ | $n > 7$ で AIC より強いペナルティ。よりシンプルなモデルを選ぶ傾向 |
一般的に、予測が目的ならAIC、真のモデルの特定が目的ならBICが推奨されます。
まとめ
本記事では、AIC(赤池情報量基準)について解説しました。
- AICは $\text{AIC} = -2 \ln L(\hat{\theta}) + 2k$ で定義され、モデルの当てはまりと複雑さのバランスを評価する
- AICの背景にはKLダイバージェンスの最小化という理論がある
- 最尤推定の対数尤度が持つ楽観的バイアスを、パラメータ数で補正する仕組みである
- AICが小さいモデルほど良いモデルと判断する
- Pythonで多項式回帰の次数選択に適用し、過学習と未学習のバランスを確認した
次のステップとして、以下の記事も参考にしてください。
- BIC(ベイズ情報量基準) — AICとよく比較されるモデル選択基準
- 最尤推定 — AICの基盤となる推定法