赤池情報量規準(AIC: Akaike Information Criterion)

赤池情報量規準(AIC: Akaike Information Criterion)とは?

赤池情報量規準(AIC: Akaike Information Criterion)とは、統計モデルの適合度と複雑さを評価するための指標です。AICは、モデルの良さ(フィットの良さ)と、モデルのパラメータ数(複雑さ)のバランスを取るために設計されています。

AICは以下の式で計算されます:

$$
AIC = 2k - 2\ln(L)
$$

  • $${k}$$ はモデルのパラメータ数、

  • $${L}$$ はモデルの対数尤度(log-likelihood)です。

AICが低いほど、そのモデルはデータに対してより良い適合を示すと考えられます。複数のモデルを比較する際には、AICが最も低いモデルが最も適していると判断されます。

この記事では、モデルを学習しAICを算出してみます。
環境はGoogle Corabです。

データセットの用意

今回、KaggleにあるTitanicのデータセットを利用したいと思います。このデータセットは、1912年に沈没したタイタニック号の乗客の情報を含んでおり、生存者を予測するためのモデルを構築することが目的となっています。

import pandas as pd
import numpy as np

df = pd.read_csv("./titanic.csv")

特徴量エンジニアリング

学習を行っていくために、数値特徴量やカテゴリカル特徴量に対して前処理を実施しています。

from sklearn.preprocessing import StandardScaler

def extract_cabin_number(cabin):
    if isinstance(cabin, str):
        cabin_number = "".join(filter(str.isdigit, cabin))
        if cabin_number:
            return int(cabin_number)
    return np.nan


df["Cabin"] = df["Cabin"].apply(extract_cabin_number)
df["Cabin"] = df["Cabin"].fillna(df["Cabin"].mean())
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Sex"] = df["Sex"].replace({"male": 1, "female": 0})
df["Embarked"] = df["Embarked"].replace({"S": 0, "C": 1, "Q": 2})
df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mean())

col = ["Age", "Fare", "Cabin"]
scaler = StandardScaler()
df[col] = scaler.fit_transform(df[col])

df.drop(columns=["Name", "PassengerId", "Ticket"], axis=1, inplace=True)

目的変数設定

X = df.drop(columns=['Survived'])
y = df['Survived']

訓練用とテスト用にデータを分割

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

ロジスティック回帰モデルの学習とAICの算出

statsmodelsにはAICの算出ができるAPIが備わっています。statsmodelsを使ってモデルを学習すると、学習したモデルに対してAICを取得することができます。

import statsmodels.api as sm

X = sm.add_constant(X)
model = sm.Logit(y, X).fit()

aic = model.aic

aic

803.4054457471418