ガウス過程を用いた非線形予測モデリング

Machine LearningMachine LearningBeginner
オンラインで実践に進む

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

ガウス過程回帰は、入力変数に基づいて目的変数の結果を予測するために使用される統計モデリング技術です。この技術は、目的変数の分布をガウス過程としてモデル化します。ガウス過程は、任意の有限個の変数が共分散ガウス分布を持つ、確率変数の集合です。この技術は、入力変数と目的変数の関係が非線形である場合に特に役立ちます。

この実験では、scikit-learn ライブラリを使用して、Python でノイズレベル推定付きのガウス過程回帰を使用する方法を学びます。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

データ生成

このステップでは、正弦関数を使って単一の特徴量を持つデータを生成します。

import numpy as np

def target_generator(X, add_noise=False):
    target = 0.5 + np.sin(3 * X)
    if add_noise:
        rng = np.random.RandomState(1)
        target += rng.normal(0, 0.3, size=target.shape)
    return target.squeeze()

X = np.linspace(0, 5, num=30).reshape(-1, 1)
y = target_generator(X, add_noise=False)

データ可視化

このステップでは、生成したデータを可視化します。

import matplotlib.pyplot as plt

plt.plot(X, y, label="Expected signal")
plt.legend()
plt.xlabel("X")
_ = plt.ylabel("y")

ノイズの追加

このステップでは、生成したデータにいくらかのノイズを追加して、より現実的な学習データセットを作成します。

rng = np.random.RandomState(0)
X_train = rng.uniform(0, 5, size=20).reshape(-1, 1)
y_train = target_generator(X_train, add_noise=True)

データ可視化

このステップでは、ノイズ付きの学習データセットと期待信号を一緒に可視化します。

plt.plot(X, y, label="Expected signal")
plt.scatter(
    x=X_train[:, 0],
    y=y_train,
    color="black",
    alpha=0.4,
    label="Observations",
)
plt.legend()
plt.xlabel("X")
_ = plt.ylabel("y")

ガウス過程回帰

このステップでは、RBF と WhiteKernel カーネルを加えた加算型カーネルを使用してガウス過程回帰器を作成します。WhiteKernel は、データに含まれるノイズの量を推定できるカーネルであり、RBF は、データとターゲットの間の非線形性を適合させるために役立ちます。

from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel

kernel = 1.0 * RBF(length_scale=1e-1, length_scale_bounds=(1e-2, 1e3)) + WhiteKernel(
    noise_level=1e-2, noise_level_bounds=(1e-10, 1e1)
)
gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.0)
gpr.fit(X_train, y_train)
y_mean, y_std = gpr.predict(X, return_std=True)

データ可視化

このステップでは、ガウス過程回帰器によって行われた予測を可視化します。

plt.plot(X, y, label="Expected signal")
plt.scatter(x=X_train[:, 0], y=y_train, color="black", alpha=0.4, label="Observations")
plt.errorbar(X, y_mean, y_std)
plt.legend()
plt.xlabel("X")
plt.ylabel("y")
_ = plt.title(
    (
        f"Initial: {kernel}\nOptimum: {gpr.kernel_}\nLog-Marginal-Likelihood: "
        f"{gpr.log_marginal_likelihood(gpr.kernel_.theta)}"
    ),
    fontsize=8,
)

対数事後確率

このステップでは、局所的な最小値を把握するために、異なるハイパーパラメータに対するガウス過程回帰器の対数事後確率(LML)を調べます。

from matplotlib.colors import LogNorm

length_scale = np.logspace(-2, 4, num=50)
noise_level = np.logspace(-2, 1, num=50)
length_scale_grid, noise_level_grid = np.meshgrid(length_scale, noise_level)

log_marginal_likelihood = [
    gpr.log_marginal_likelihood(theta=np.log([0.36, scale, noise]))
    for scale, noise in zip(length_scale_grid.ravel(), noise_level_grid.ravel())
]
log_marginal_likelihood = np.reshape(
    log_marginal_likelihood, newshape=noise_level_grid.shape
)

vmin, vmax = (-log_marginal_likelihood).min(), 50
level = np.around(np.logspace(np.log10(vmin), np.log10(vmax), num=50), decimals=1)
plt.contour(
    length_scale_grid,
    noise_level_grid,
    -log_marginal_likelihood,
    levels=level,
    norm=LogNorm(vmin=vmin, vmax=vmax),
)
plt.colorbar()
plt.xscale("log")
plt.yscale("log")
plt.xlabel("Length-scale")
plt.ylabel("Noise-level")
plt.title("Log-marginal-likelihood")
plt.show()

まとめ

この実験では、scikit-learn ライブラリを使って、Python でノイズレベル推定付きのガウス過程回帰をどのように使用するかを学びました。シングルフィーチャーのデータを正弦関数を使って生成し、生成したデータにノイズを追加してより現実的な学習データセットを作成し、生成したデータを可視化しました。RBF と WhiteKernel カーネルを加えた加算型カーネルを使ってガウス過程回帰器を作成し、ガウス過程回帰器によって行われた予測を可視化しました。また、局所的な最小値を把握するために、異なるハイパーパラメータに対するガウス過程回帰器の対数事後確率(LML)を調べました。

まとめ

おめでとうございます!あなたはガウス過程回帰の実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習することができます。