はじめに
この実験では、推定値の分散を低減するために収縮法などの正則化手法を用いて共分散推定を行う方法と、バイアス・バリアンストレードオフをどのように選択するかを示します。正則化パラメータを設定する 3 つのアプローチを比較します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。
サンプルデータの生成
40 個の特徴量と 20 個のサンプルでサンプルデータを生成します。正規分布を作成するためにnp.random.normal()関数を使用します。
import numpy as np
n_features, n_samples = 40, 20
np.random.seed(42)
base_X_train = np.random.normal(size=(n_samples, n_features))
base_X_test = np.random.normal(size=(n_samples, n_features))
coloring_matrix = np.random.normal(size=(n_features, n_features))
X_train = np.dot(base_X_train, coloring_matrix)
X_test = np.dot(base_X_test, coloring_matrix)
テストデータ上の尤度を計算する
sklearn.covarianceモジュールのShrunkCovarianceクラスとscipy.linalgモジュールのlog_likelihood関数を使用して、テストデータ上の負の対数尤度を計算します。縮小係数の可能な値の範囲を設定し、各値に対する尤度を計算します。
from sklearn.covariance import ShrunkCovariance, empirical_covariance, log_likelihood
from scipy import linalg
shrinkages = np.logspace(-2, 0, 30)
negative_logliks = [
-ShrunkCovariance(shrinkage=s).fit(X_train).score(X_test) for s in shrinkages
]
real_cov = np.dot(coloring_matrix.T, coloring_matrix)
emp_cov = empirical_covariance(X_train)
loglik_real = -log_likelihood(emp_cov, linalg.inv(real_cov))
正則化パラメータの設定方法を比較する
正則化パラメータの設定方法として、交差検証、Ledoit-Wolf、および OAS の 3 つのアプローチを比較します。
from sklearn.model_selection import GridSearchCV
from sklearn.covariance import LedoitWolf, OAS
tuned_parameters = [{"shrinkage": shrinkages}]
cv = GridSearchCV(ShrunkCovariance(), tuned_parameters)
cv.fit(X_train)
lw = LedoitWolf()
loglik_lw = lw.fit(X_train).score(X_test)
oa = OAS()
loglik_oa = oa.fit(X_train).score(X_test)
結果をプロットする
縮小パラメータの異なる値に対する未見のデータの尤度をプロットし、交差検証、LedoitWolf、および OAS 推定による選択肢を示します。
import matplotlib.pyplot as plt
fig = plt.figure()
plt.title("Regularized covariance: likelihood and shrinkage coefficient")
plt.xlabel("Regularization parameter: shrinkage coefficient")
plt.ylabel("Error: negative log-likelihood on test data")
plt.loglog(shrinkages, negative_logliks, label="Negative log-likelihood")
plt.plot(plt.xlim(), 2 * [loglik_real], "--r", label="Real covariance likelihood")
lik_max = np.amax(negative_logliks)
lik_min = np.amin(negative_logliks)
ymin = lik_min - 6.0 * np.log((plt.ylim()[1] - plt.ylim()[0]))
ymax = lik_max + 10.0 * np.log(lik_max - lik_min)
xmin = shrinkages[0]
xmax = shrinkages[-1]
plt.vlines(
lw.shrinkage_,
ymin,
-loglik_lw,
color="magenta",
linewidth=3,
label="Ledoit-Wolf estimate",
)
plt.vlines(
oa.shrinkage_, ymin, -loglik_oa, color="purple", linewidth=3, label="OAS estimate"
)
plt.vlines(
cv.best_estimator_.shrinkage,
ymin,
-cv.best_estimator_.score(X_test),
color="cyan",
linewidth=3,
label="Cross-validation best estimate",
)
plt.ylim(ymin, ymax)
plt.xlim(xmin, xmax)
plt.legend()
plt.show()
まとめ
この実験では、縮小法などの正則化手法を用いて共分散推定を行う方法を学びました。正則化パラメータの設定方法として、交差検証、Ledoit-Wolf、および OAS の 3 つのアプローチを比較しました。縮小パラメータの異なる値に対する未見のデータの尤度をプロットし、交差検証、LedoitWolf、および OAS 推定による選択肢を示しました。