AICを使ったモデル作成

赤池情報量規準(Akaike’s Information Criterion; AIC)は、元統計数理研究所所長の赤池弘次先生が考案した統計モデルの良さを評価するための指標です。小さいほど良いといえます。

AICの特徴として過学習を避けるしくみがあり、世界中で使われています。

AICを使うと、テストデータを用いず学習データだけで、汎化性能の高いモデルを選ぶことが(ある程度)可能になります。

AICの計算方法

scikit-learnにはAICを計算する関数はないので、自前で計算します。計算式は以下の通りです。

`AIC = -2 * log(L) + 2 * k`
ただし、Lは最大尤度、kは「説明変数と定数項」の数です。

最大尤度は、各データの起こりやすさの積になります。誤差が正規分布に従うものとして、次の式に置換えられます。

`AIC = n * (log(2 * π * MSE) + 1) + 2 * k`
ただし、nはデータ数、MSEは平均二乗誤差です。

AICは、2つの部分からなります。-2 * log(L)は当てはまりの良さを、2 * kはパラメーターの少なさを評価するものです。
パラメーターが多く過学習しやすいモデルではAICの値は悪くなります。

import pandas as pd
from sklearn.linear_model import LinearRegression

df = pd.read_csv("input/boston.csv")  # ボストン市の住宅価格データ一式
X, y = df.iloc[:, :-1], df.iloc[:, -1]
# AICの計算
def AIC(model, X, y):
    from sklearn.metrics import mean_squared_error
    from math import log, pi
    n = len(y)
    mse = mean_squared_error(y, model.predict(X))
    k = model.coef_.shape[0] + int(model.fit_intercept)
    d = max(1e-308, 2 * pi * mse)
    return n * (log(d) + 1) + 2 * k
  • model:回帰モデル
  • X:説明変数
  • y:目的変数
  • nにデータ数を入れます
  • mseに、真値(y)と予測値(model.predict(X))の平均二乗誤差を入れます
  • kに「説明変数と定数項」の数を入れます
    • int(model.fit_intercept)は、定数項がある場合に1、ない場合に0になります。
  • d2 * pi * mse1e-308の大きい方を入れます
    • dが0だとlog(d)がエラーになるので、1e-308以上にしています
  • n * (log(d) + 1) + 2 * kで、AICを計算して返します
# サンプルでAICの計算
lr1 = LinearRegression().fit(X, y)
aic1 = AIC(lr1, X, y)
aic1
3025.6085940755484
# ダミーデータでAICの計算
X2, y2 = [[2, -1, 3], [-1, 2, -2]], [1, 0]
lr2 = LinearRegression().fit(X2, y2)
aic2 = AIC(lr2, X2, y2)
aic2
-134.6577425070096

色々なライブラリーやツールでAICを計算できますが、値が異なることがあります。原因は、AICの定義が色々あるからです。AICは、相対的な値に意味があるので、同じライブラリーやツールを使っている限りは問題ありません。

コメント

タイトルとURLをコピーしました