はじめに
この実験では、RBF カーネルと異なるハイパーパラメータの選択を用いたガウス過程分類 (GPC) を探索します。データを生成し、固定および最適化されたハイパーパラメータで GPC モデルを学習し、事後分布と対数尤度の地形をプロットします。また、モデルの精度と対数損失を評価します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお尋ねください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
この実験に必要なライブラリをインポートします。
import numpy as np
from matplotlib import pyplot as plt
from sklearn.metrics import accuracy_score, log_loss
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
データの生成
NumPy を使ってデータを生成します。0 から 5 の間の一様分布で 100 個のデータポイントを生成します。閾値を 2.5 に設定し、ブール演算を使ってラベルを生成します。最初の 50 個のデータポイントを学習データとし、残りをテストデータとします。
train_size = 50
rng = np.random.RandomState(0)
X = rng.uniform(0, 5, 100)[:, np.newaxis]
y = np.array(X[:, 0] > 2.5, dtype=int)
モデルの学習
固定されたハイパーパラメータと最適化されたハイパーパラメータの両方を使って GPC モデルを学習します。モデルの対数尤度、精度、対数損失を表示します。
## Fixed Hyperparameters
gp_fix = GaussianProcessClassifier(kernel=1.0 * RBF(length_scale=1.0), optimizer=None)
gp_fix.fit(X[:train_size], y[:train_size])
## Optimized Hyperparameters
gp_opt = GaussianProcessClassifier(kernel=1.0 * RBF(length_scale=1.0))
gp_opt.fit(X[:train_size], y[:train_size])
## Results
print("Log Marginal Likelihood (initial): %.3f" % gp_fix.log_marginal_likelihood(gp_fix.kernel_.theta))
print("Log Marginal Likelihood (optimized): %.3f" % gp_opt.log_marginal_likelihood(gp_opt.kernel_.theta))
print("Accuracy: %.3f (initial) %.3f (optimized)" % (accuracy_score(y[:train_size], gp_fix.predict(X[:train_size])), accuracy_score(y[:train_size], gp_opt.predict(X[:train_size]))))
print("Log-loss: %.3f (initial) %.3f (optimized)" % (log_loss(y[:train_size], gp_fix.predict_proba(X[:train_size])[:, 1]), log_loss(y[:train_size], gp_opt.predict_proba(X[:train_size])[:, 1])))
事後分布のプロット
固定されたハイパーパラメータと最適化されたハイパーパラメータの両方を使って GPC モデルの事後分布をプロットします。学習データ、テストデータ、およびクラス 1 の予測確率をプロットします。また、プロットにラベルを付けます。
## Plot posteriors
plt.figure()
plt.scatter(X[:train_size, 0], y[:train_size], c="k", label="Train data", edgecolors=(0, 0, 0))
plt.scatter(X[train_size:, 0], y[train_size:], c="g", label="Test data", edgecolors=(0, 0, 0))
X_ = np.linspace(0, 5, 100)
plt.plot(X_, gp_fix.predict_proba(X_[:, np.newaxis])[:, 1], "r", label="Initial kernel: %s" % gp_fix.kernel_)
plt.plot(X_, gp_opt.predict_proba(X_[:, np.newaxis])[:, 1], "b", label="Optimized kernel: %s" % gp_opt.kernel_)
plt.xlabel("Feature")
plt.ylabel("Class 1 probability")
plt.xlim(0, 5)
plt.ylim(-0.25, 1.5)
plt.legend(loc="best")
対数事後尤度の地形をプロットする
異なるハイパーパラメータの選択を使って GPC モデルの対数事後尤度の地形をプロットします。前のプロットで使用されたハイパーパラメータを強調表示します。また、プロットにラベルを付けます。
## Plot LML landscape
plt.figure()
theta0 = np.logspace(0, 8, 30)
theta1 = np.logspace(-1, 1, 29)
Theta0, Theta1 = np.meshgrid(theta0, theta1)
LML = [[gp_opt.log_marginal_likelihood(np.log([Theta0[i, j], Theta1[i, j]])) for i in range(Theta0.shape[0])] for j in range(Theta0.shape[1])]
LML = np.array(LML).T
plt.plot(np.exp(gp_fix.kernel_.theta)[0], np.exp(gp_fix.kernel_.theta)[1], "ko", zorder=10)
plt.plot(np.exp(gp_opt.kernel_.theta)[0], np.exp(gp_opt.kernel_.theta)[1], "ko", zorder=10)
plt.pcolor(Theta0, Theta1, LML)
plt.xscale("log")
plt.yscale("log")
plt.colorbar()
plt.xlabel("Magnitude")
plt.ylabel("Length-scale")
plt.title("Log-marginal-likelihood")
まとめ
この実験では、RBF カーネルと異なるハイパーパラメータの選択を用いたガウス過程分類 (GPC) を検討しました。データを生成し、固定されたハイパーパラメータと最適化されたハイパーパラメータの両方を使って GPC モデルを学習し、事後分布と対数事後尤度の地形をプロットしました。また、モデルの精度と対数損失を評価しました。