ガウス過程回帰と分類

Beginner

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

はじめに

この実験では、回帰と確率的分類問題に使用される教師付き学習手法であるガウス過程(Gaussian Processes:GP)を探索します。ガウス過程は汎用性が高く、観測値を補間し、確率的予測を行い、さまざまな種類のカーネルを処理することができます。この実験では、scikit-learn ライブラリを使用してガウス過程回帰(Gaussian Process Regression:GPR)とガウス過程分類(Gaussian Process Classification:GPC)に焦点を当てます。

VM のヒント

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

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

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

ガウス過程回帰(Gaussian Process Regression:GPR)

GaussianProcessRegressor クラスは、回帰タスクに対してガウス過程を実装します。GP の事前分布(prior)、たとえば平均関数と共分散関数を指定する必要があります。カーネルのハイパーパラメータは、フィッティング(適合)プロセス中に最適化されます。回帰に GPR を使用する例を見てみましょう。

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

## RBF カーネルを持つ GPR モデルを作成する
kernel = RBF()
model = GaussianProcessRegressor(kernel=kernel)

## 学習データにモデルをフィッティングする
model.fit(X_train, y_train)

## 学習済みモデルを使って予測する
y_pred = model.predict(X_test)

GPR の例

ノイズレベル推定付きの GPR:この例は、データのノイズレベルを推定するための WhiteKernel を含む和カーネルを持つ GPR を示しています。

from sklearn.gaussian_process.kernels import WhiteKernel

## RBF カーネルと WhiteKernel を持つ GPR モデルを作成する
kernel = RBF() + WhiteKernel()
model = GaussianProcessRegressor(kernel=kernel)

## 学習データにモデルをフィッティングする
model.fit(X_train, y_train)

## 学習済みモデルを使って予測する
y_pred = model.predict(X_test)

GPR と Kernel Ridge 回帰の比較:Kernel Ridge 回帰(KRR)と GPR の両方は、「カーネルトリック」を使って目的関数を学習します。GPR は生成的な確率モデルを学習し、信頼区間を提供することができますが、KRR は予測のみを提供します。

from sklearn.kernel_ridge import KernelRidge

## Kernel Ridge 回帰モデルを作成する
krr_model = KernelRidge(kernel='rbf')

## KRR モデルを学習データにフィッティングする
krr_model.fit(X_train, y_train)

## KRR モデルを使って予測する
krr_y_pred = krr_model.predict(X_test)

## 結果を GPR と比較する
gpr_model = GaussianProcessRegressor(kernel=RBF())
gpr_model.fit(X_train, y_train)
gpr_y_pred = gpr_model.predict(X_test)

モアナロアの CO2 データに対する GPR:この例は、対数尤度に対する勾配上昇を使った複雑なカーネルエンジニアリングとハイパーパラメータ最適化を示しています。データは、ハワイのモアナロア天文台で収集された月平均大気 CO2 濃度で構成されています。目的は、時間の関数として CO2 濃度をモデル化することです。

from sklearn.gaussian_process.kernels import RBF, ExpSineSquared, RationalQuadratic, WhiteKernel

## 合成カーネルを持つ GPR モデルを作成する
kernel = 34.4**2 * RBF(length_scale=41.8) + 3.27**2 * RBF(length_scale=180) * ExpSineSquared(length_scale=1.44, periodicity=1) + 0.446**2 * RationalQuadratic(alpha=17.7, length_scale=0.957) + 0.197**2 * RBF(length_scale=0.138) + WhiteKernel(noise_level=0.0336)
model = GaussianProcessRegressor(kernel=kernel)

## データにモデルをフィッティングする
model.fit(X_train, y_train)

## 学習済みモデルを使って予測する
y_pred = model.predict(X_test)

ガウス過程分類(Gaussian Process Classification:GPC)

GaussianProcessClassifier クラスは、確率的分類に対して GPC を実装します。潜在関数に GP の事前分布を置き、それをリンク関数を通じてスカッシュ(圧縮)することでクラス確率を取得します。GPC は、one-versus-rest または one-versus-one に基づく学習と予測を行うことで多クラス分類をサポートします。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

X = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

from sklearn.gaussian_process import GaussianProcessClassifier
## RBF カーネルを持つ GPC モデルを作成する
kernel = RBF()
model = GaussianProcessClassifier(kernel=kernel)

## 学習データにモデルをフィッティングする
model.fit(X_train, y_train)

## 学習済みモデルを使って予測する
y_pred = model.predict(X_test)

GPC の例

GPC による確率的予測:この例は、異なるハイパーパラメータの選択による GPC の予測確率を示しています。

## RBF カーネルを持つ GPC モデルを作成する
kernel = RBF()
model = GaussianProcessClassifier(kernel=kernel)

## 学習データにモデルをフィッティングする
model.fit(X_train, y_train)

## テストデータのクラス確率を予測する
y_prob = model.predict_proba(X_test)

XOR データセットにおける GPC の例示:この例は、XOR データセットでの GPC の使用を示しています。静止的な等方性カーネル(RBF)と非静止的なカーネル(DotProduct)を使用した結果を比較しています。

## 異なるカーネルを持つ GPC モデルを作成する
isotropic_kernel = RBF(length_scale=1.0)
non_stationary_kernel = DotProduct(sigma_0=1.0)

## XOR データセットにモデルをフィッティングする
isotropic_model = GaussianProcessClassifier(kernel=isotropic_kernel)
non_stationary_model = GaussianProcessClassifier(kernel=non_stationary_kernel)
isotropic_model.fit(X_xor, y_xor)
non_stationary_model.fit(X_xor, y_xor)

## 学習済みモデルを使って予測する
isotropic_y_pred = isotropic_model.predict(X_test)
non_stationary_y_pred = non_stationary_model.predict(X_test)

アイリスデータセットにおける GPC:この例は、等方性 RBF カーネルと異方性 RBF カーネルを使用したアイリスデータセットでの GPC を示しています。異なるハイパーパラメータの選択が予測確率にどのように影響するかを示しています。

## 異なるカーネルを持つ GPC モデルを作成し、アイリスデータセットにフィッティングする
isotropic_kernel = RBF(length_scale=1.0)
anisotropic_kernel = RBF(length_scale=[1.0, 2.0])
isotropic_model = GaussianProcessClassifier(kernel=isotropic_kernel)
anisotropic_model = GaussianProcessClassifier(kernel=anisotropic_kernel)
isotropic_model.fit(X_train, y_train)
anisotropic_model.fit(X_train, y_train)

## クラス確率を予測する
isotropic_y_prob = isotropic_model.predict_proba(X_test)
anisotropic_y_prob = anisotropic_model.predict_proba(X_test)

まとめ

この実験では、ガウス過程(Gaussian Processes:GP)とその回帰および分類タスクへの応用を検討しました。scikit-learn からの GaussianProcessRegressor と GaussianProcessClassifier クラスをどのように使用するか、および GP に対して異なる種類のカーネルをどのように指定するかを学びました。また、回帰タスクに対する GPR と多クラス分類タスクに対する GPC の例も見て、ガウス過程の多様性と機能を示しました。