ガウス過程分類

Beginner

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

はじめに

この実験では、Python 用の scikit - learn ライブラリでガウス過程分類 (GPC) をどのように使用するかを示します。目的は、GPC モデルを学習およびテストし、等確率線をプロットし、分類性能を評価する方法を示すことです。

VM のヒント

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

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

学習中に問題に直面した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。そうすれば、迅速に問題を解決します。

必要なライブラリをインポートする

まず、必要なライブラリをインポートする必要があります。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import DotProduct, ConstantKernel as C

データを準備する

分類用の合成データを生成します。分類対象の関数は以下のように定義されます。

def g(x):
    """The function to predict (classification will then consist in predicting
    whether g(x) <= 0 or not)"""
    return 5.0 - x[:, 1] - 0.5 * x[:, 0] ** 2.0

次に、実験のデザインと観測値を作成する必要があります。

## A few constants
lim = 8

## Design of experiments
X = np.array(
    [
        [-4.61611719, -6.00099547],
        [4.10469096, 5.32782448],
        [0.00000000, -0.50000000],
        [-6.17289014, -4.6984743],
        [1.3109306, -6.93271427],
        [-5.03823144, 3.10584743],
        [-2.87600388, 6.74310541],
        [5.21301203, 4.26386883],
    ]
)

## Observations
y = np.array(g(X) > 0, dtype=int)

モデルを学習する

データを分類するために GPC モデルを使用します。まず、カーネル関数を指定する必要があります。

kernel = C(0.1, (1e-5, np.inf)) * DotProduct(sigma_0=0.1) ** 2

次に、GPC モデルを作成して、データを使って学習させます。

gp = GaussianProcessClassifier(kernel=kernel)
gp.fit(X, y)

モデルを評価する

学習済みの GPC モデルの分類性能を評価します。点のグリッドを生成し、学習済みモデルを使って各点の予測確率を計算します。

## Evaluate real function and the predicted probability
res = 50
x1, x2 = np.meshgrid(np.linspace(-lim, lim, res), np.linspace(-lim, lim, res))
xx = np.vstack([x1.reshape(x1.size), x2.reshape(x2.size)]).T

y_true = g(xx)
y_prob = gp.predict_proba(xx)[:, 1]
y_true = y_true.reshape((res, res))
y_prob = y_prob.reshape((res, res))

結果をプロットする

GPC モデルの等確率線と分類境界をプロットします。

## Plot the probabilistic classification iso-values
fig = plt.figure(1)
ax = fig.gca()
ax.axes.set_aspect("equal")
plt.xticks([])
plt.yticks([])
ax.set_xticklabels([])
ax.set_yticklabels([])
plt.xlabel("$x_1$")
plt.ylabel("$x_2$")

cax = plt.imshow(y_prob, cmap=cm.gray_r, alpha=0.8, extent=(-lim, lim, -lim, lim))
norm = plt.matplotlib.colors.Normalize(vmin=0.0, vmax=0.9)
cb = plt.colorbar(cax, ticks=[0.0, 0.2, 0.4, 0.6, 0.8, 1.0], norm=norm)
cb.set_label(r"${\rm \mathbb{P}}\left[\widehat{G}(\mathbf{x}) \leq 0\right]$")
plt.clim(0, 1)

plt.plot(X[y <= 0, 0], X[y <= 0, 1], "r.", markersize=12)

plt.plot(X[y > 0, 0], X[y > 0, 1], "b.", markersize=12)

plt.contour(x1, x2, y_true, [0.0], colors="k", linestyles="dashdot")

cs = plt.contour(x1, x2, y_prob, [0.666], colors="b", linestyles="solid")
plt.clabel(cs, fontsize=11)

cs = plt.contour(x1, x2, y_prob, [0.5], colors="k", linestyles="dashed")
plt.clabel(cs, fontsize=11)

cs = plt.contour(x1, x2, y_prob, [0.334], colors="r", linestyles="solid")
plt.clabel(cs, fontsize=11)

plt.show()

まとめ

この実験では、Python の scikit-learn ライブラリを使ってガウス過程分類 (GPC) をどのように使用するかを学びました。GPC モデルを学習してテストし、等確率線をプロットし、分類性能を評価する方法を示しました。