Bamba news

ガウス過程回帰を実装してみよう!わかりやすく解説

【スマホからでも実行可能】Pythonでガウス過程回帰を実装する方法を初心者向けにわかりやすく解説します。機械学習のモデル構築や不確実性の可視化に興味がある方必見です。


はじめに

ガウス過程回帰は、少ないデータからでも精度の高い予測を可能にし、さらにその予測が「どれくらい確からしいか」という不確実性まで数値で示してくれる非常に優れた手法です。入門編、活用例編ではその概念や利点について解説してきました。

今回の実践編では、いよいよPythonを使ってガウス過程回帰を実際に動かしてみます。理論的な背景は少しだけ振り返りますが、主眼は「手を動かして結果を見て、理解を深める」ことに置きます。難解な数式は使わず、コードとその結果が何を意味するのかを一つひとつ丁寧に解説していきますので、プログラミングに慣れていない方でも安心して読み進めてください。

この記事を最後まで読めば、ガウス過程回帰の基本的な実装方法をマスターし、その強力な表現力を実感できるはずです。

記事の最後に、環境構築なしでスマホからでも即実行可能なGoogle Colabノートブックをご用意しています。


ガウス過程回帰とは?(実践のための要点整理)

実装に入る前に、ガウス過程回帰が何をするものだったか、実践に必要なポイントだけを簡単におさらいしましょう。

一言でいうと、ガウス過程回帰は 「入力されたデータ(点)の関係性を学習し、未知の点に対する予測値と、その予測の"自信のなさ(不確実性)"を同時に教えてくれるモデル」 です。

このモデルの挙動を決定づける重要な要素が「カーネル関数」です。

カーネル関数:データ点同士の「ものさし」

カーネル関数は、二つのデータ点(入力値)がどれくらい「似ているか」を測るための「ものさし」のようなものです。この「ものさし」をどう定義するかによって、ガウス過程回帰が生成する関数の滑らかさや形が決まります。

様々な種類のカーネル関数が存在しますが、最も一般的に使われるのが RBFカーネル(放射基底関数カーネル) です。これは「2つの点の距離が近ければ近いほど、似ている度合いは高い」という、非常に直感的で自然な考え方に基づいています。

実践では、このRBFカーネルに、データのばらつき(ノイズ)を表現するためのWhiteKernelを組み合わせて使うことがよくあります。これにより、現実世界のデータが持つ「滑らかな傾向+ランダムな誤差」という構造をうまくモデル化できます。

理論的な話はこのくらいにして、早速Pythonで実装の世界に飛び込んでいきましょう。


Pythonでガウス過程回帰を実装してみよう

今回は、機械学習の定番ライブラリであるscikit-learnを使って、非常にシンプルにガウス過程回帰を実装します。

ステップ1: 必要なライブラリのインポート

まずは、計算に必要なNumPy、グラフ描画のためのMatplotlib、そしてガウス過程回帰モデル本体であるscikit-learnをインポートします。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel

# グラフのスタイル設定(見栄えを良くするため)
plt.style.use('seaborn-v0_8-whitegrid')

ステップ2: 学習データの準備

ガウス過程回帰がどのように学習し、予測するかを分かりやすく見るために、人工的なデータを作成します。ここでは、sin関数に少しだけノイズ(ばらつき)を加えたデータを使います。

# 再現性のための乱数シード固定
rng = np.random.RandomState(1)

# 入力データ X を作成 (6点)
X_train = np.array([1., 3., 5., 6., 7., 8.]).reshape(-1, 1)

# 出力データ y を作成 (sin関数 + ノイズ)
y_train = np.sin(X_train).ravel() + rng.normal(0, 0.1, X_train.shape[0])

# 予測したい点の範囲を定義
x_pred = np.linspace(0, 10, 100).reshape(-1, 1)

# 作成した学習データをプロットして確認
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, c='red', s=50, zorder=10, edgecolors=(0, 0, 0), label='学習データ')
plt.title('学習データの分布')
plt.xlabel('入力 (x)')
plt.ylabel('出力 (y)')
plt.legend()
plt.show()

上のコードを実行すると、6つの赤い点がプロットされたグラフが表示されます。これが今回モデルに学習させるデータです。我々の目的は、この6つの点だけを頼りに、0から10の範囲における未知の点の値を、その不確実性とともに予測することです。

ステップ3: カーネルの選択とモデルの構築

次に、ガウス過程回帰の「心臓部」であるカーネルとモデル本体を定義します。

先ほど説明したように、今回は「滑らかな関数」を表現するRBFカーネルと、「ノイズ」を表現するWhiteKernelを組み合わせます。

# カーネルの定義
# RBFカーネルで滑らかな傾向を、WhiteKernelでノイズをモデル化する
kernel = 1.0 * RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e3)) \
    + WhiteKernel(noise_level=1, noise_level_bounds=(1e-10, 1e1))

# ガウス過程回帰モデルのインスタンスを作成
# n_restarts_optimizer: カーネルのハイパーパラメータを最適化する際の試行回数
# alpha: 学習データに含まれるノイズの分散と仮定する値(今回はWhiteKernelで扱うため小さく設定)
gp = GaussianProcessRegressor(kernel=kernel,
                              alpha=0.0,
                              n_restarts_optimizer=10,
                              random_state=0)

少しコードが長く見えますが、やっていることはシンプルです。

  1. RBFWhiteKernel+で足し合わせて、今回使いたいカーネルを定義しています。length_scalenoise_levelといった値は、後の学習プロセスでデータに最もフィットするように自動で調整されます。
  2. GaussianProcessRegressorに、作成したカーネルを渡してモデルの「設計図」を作ります。n_restarts_optimizer=10という指定は、カーネルのパラメータを調整する際に、より良い値を見つけるために10回試行錯誤を繰り返す、という設定です。これにより、より安定して良いモデルが得られやすくなります。

ステップ4: モデルの学習

モデルの準備ができたので、いよいよ学習させます。scikit-learnの素晴らしい点は、この学習プロセスがたった1行のコードで完了することです。

# モデルの学習
gp.fit(X_train, y_train)

このfitメソッドを実行すると、モデルは内部で学習データ(X_train, y_train)とカーネルの定義を元に、最もデータに当てはまるようにカーネルのパラメータ(length_scalenoise_level)を自動的に最適化してくれます。

ステップ5: 未知のデータに対する予測

学習が完了したモデルを使って、未知のデータに対する予測を行います。ここでは、ステップ2で準備した0から10までの100個の点(x_pred)について予測してみましょう。

ガウス過程回帰の真価は、予測値(平均)と同時に不確実性(標準偏差)を返してくれる点にあります。predictメソッドの引数にreturn_std=Trueを指定することで、両方を一度に取得できます。

# 予測の実行
# return_std=True にすることで、予測値の平均(y_mean)と標準偏差(y_std)を取得できる
y_mean, y_std = gp.predict(x_pred, return_std=True)

これで、y_meanには各点の予測値が、y_stdにはその予測の不確実性(標準偏差)が格納されました。

ステップ6: 結果の可視化

最後に、予測結果をグラフにして見てみましょう。これがガウス過程回帰の最もエキサイティングな部分です。

# グラフの描画
plt.figure(figsize=(10, 6))

# 学習データをプロット
plt.scatter(X_train, y_train, c='red', s=50, zorder=10, edgecolors=(0, 0, 0), label='学習データ')

# 予測の平均値を線でプロット
plt.plot(x_pred, y_mean, 'k-', label='予測(平均)')

# 不確実性の範囲(95%信頼区間)を塗りつぶしてプロット
# 95%信頼区間は、おおよそ 平均 ± 1.96 * 標準偏差 で計算される
plt.fill_between(x_pred.ravel(),
                 y_mean - 1.96 * y_std,
                 y_mean + 1.96 * y_std,
                 alpha=0.2,
                 color='black',
                 label='95%信頼区間(不確実性)')

plt.title('ガウス過程回帰による予測結果')
plt.xlabel('入力 (x)')
plt.ylabel('出力 (y)')
plt.legend(loc='upper left')
plt.show()

このグラフが、ガウス過程回帰のすべてを物語っています。

  • 黒い実線(予測・平均): モデルが予測した最も確からしい値のラインです。学習データ(赤い点)の近くを滑らかに通っているのがわかります。
  • 灰色の塗りつぶし領域(95%信頼区間): これが不確実性です。この範囲が狭いほど、モデルはその予測に「自信がある」ことを意味し、広いほど「自信がない」ことを示しています。

注目すべきは、学習データ(赤い点)がある場所では、灰色の領域がキュッと狭くなっている点です。これは、モデルが「この辺りはデータがあるから、予測にはかなり自信があるよ」と主張していることを意味します。

一方で、学習データがない区間(例えばx=3とx=5の間や、x=8より大きい領域)では、灰色の領域が大きく広がっています。これは「この辺りはデータがないから、たぶんこの辺りだと思うけど、正直あまり自信がないな…」というモデルの"声"を可視化したものなのです。

このように、単に予測値を出すだけでなく、その予測がどれだけ信頼できるのかを明確に示してくれる点が、ガウス過程回帰が多くの分野で重宝される理由です。


まとめ

今回は、Pythonのscikit-learnライブラリを使って、ガウス過程回帰の実装を体験しました。わずかなコードで、データ点から滑らかな関数を予測し、さらにその不確実性まで見事に可視化できることを実感いただけたのではないでしょうか。

今回のポイント:

  • scikit-learnを使えば、ガウス過程回帰は手軽に実装できる。
  • カーネル関数(RBF + WhiteKernelなど)を定義し、モデルに渡すのが基本の流れ。
  • fitで学習し、predict(return_std=True)で予測値と不確実性を得る。
  • 結果を可視化することで、データがある場所では自信を持ち、ない場所では自信がなくなるモデルの挙動を直感的に理解できる。

ガウス過程回帰は、その不確実性を定量化できる特性から、実験計画法を効率化するベイズ最適化など、より高度な技術の基盤としても利用されています。今回マスターした実装スキルは、間違いなくあなたのデータ分析能力を一段階引き上げてくれるはずです。

ぜひ、ご自身のデータでも試してみてください。


ウェブ最適化ではじめる機械学習 ―A/Bテスト、メタヒューリスティクス、バンディットアルゴリズムからベイズ最適化まで

Pythonによるサンプルコードと、グラフィカルな図版で表現された数学的なモデルを組み合わせ、機械学習と統計学の基礎を丁寧に解説しています。

▶ Amazonで見る

環境構築なし
実行できるファイルはこちら!

このボタンからGoogle Colabを開き、すぐにコードをお試しいただけます。

関連する記事

ベイズ最適化を実装してみよう!わかりやすく解説

【スマホからでも実行可能】ベイズ最適化の実装方法をPythonコード付きで徹底解説。機械学習のハイパーパラメータチューニングを効率化したい方必見。サンプルコードを動かしながら、実践的に学べます。

エクストラツリー(ExtraTrees)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】この記事では、機械学習のアルゴリズムであるエクストラツリー(ExtraTrees)について、その仕組みからPythonによる実装方法までを丁寧に解説します。ランダムフォレストとの違いも理解しながら、実践的なスキルを身につけましょう。

勾配ブースティング木(Gradient Boosted Trees)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】勾配ブースティング木は、機械学習の分野で非常に強力な予測モデルの一つです。この記事では、その仕組みとPythonによる具体的な実装方法を、初心者にも分かりやすく解説します。実際にコードを動かしながら、この強力なアルゴリズムを体験してみましょう。

ランダムフォレストを実装してみよう!わかりやすく解説

【スマホからでも実行可能】ランダムフォレストの実装方法をPythonコード付きで丁寧に解説。機械学習のアンサンブル学習を実際に動かして理解を深めましょう。初心者にもわかりやすい実践ガイドです。

決定木(Decision Tree)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】決定木の実装方法をPythonコード付きでステップバイステップ解説。データの準備からモデル構築、可視化、評価、チューニングまで、実践的なスキルが身につきます。機械学習の基本である決定木をマスターしましょう。