ガウス過程

PHYSBOではガウス過程回帰を実行しながらベイズ最適化を行なっています。

そのため、学習データが与えられた際にガウス過程回帰を実行することもでき、学習済みモデルを利用したテストデータの予測も行うことができます。

ここでは、その手順について紹介します。

探索候補データの準備

これまでのマニュアルでも利用していたs5-210.csvを用いてガウス過程を実行します。

[1]:
import physbo

import os
import urllib2
import ssl
import numpy as np

ssl._create_default_https_context = ssl._create_unverified_context

def load_data():
    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
    X = A[:,0:3]
    t  = -A[:,3]
    return X, t

X, t = load_data()
X = physbo.misc.centering( X )

学習データの定義

対象データのうち、ランダムに選んだ1割をトレーニングデータとして利用し、別のランダムに選んだ1割をテストデータとして利用します。

[2]:
N = len(t)
Ntrain = int(N*0.1)
Ntest = min(int(N*0.1), N-Ntrain)

id_all   = np.random.choice(N, N, replace=False)
id_train  = id_all[0:Ntrain]
id_test = id_all[Ntrain:Ntrain+Ntest]

X_train = X[id_train]
X_test = X[id_test]

t_train = t[id_train]
t_test = t[id_test]

print "Ntrain =", Ntrain
print "Ntest =", Ntest
Ntrain = 1798
Ntest = 1798

ガウス過程の学習と予測

以下のプロセスでガウス過程を学習し、テストデータの予測を行います。

  1. ガウス過程のモデルを生成します。
  2. X_train(学習データのパラメータ), t_train(学習データの目的関数値)を用いてモデルを学習します。
  3. 学習されたモデルを用いてテストデータ(X_test)に対する予測を実行します。

共分散の定義(ガウシアン)

[3]:
cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )

平均の定義

[4]:
mean = physbo.gp.mean.const()

尤度関数の定義(ガウシアン)

[5]:
lik = physbo.gp.lik.gauss()

ガウス過程モデルの生成

[6]:
gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)
config = physbo.misc.set_config()

ガウス過程モデルを学習

[7]:
gp.fit(X_train, t_train, config)
Start the initial hyper parameter searching ...
Done

Start the hyper parameter learning ...
0 -th epoch marginal likelihood 16805.225990633342
50 -th epoch marginal likelihood 5353.525281891333
100 -th epoch marginal likelihood 3005.100784225642
150 -th epoch marginal likelihood 1590.9517857305727
200 -th epoch marginal likelihood 246.9563975152605
250 -th epoch marginal likelihood -566.216332288157
300 -th epoch marginal likelihood -1173.7954898625985
350 -th epoch marginal likelihood -1548.6217728092386
400 -th epoch marginal likelihood -1736.39439620689
450 -th epoch marginal likelihood -1829.1302788508322
500 -th epoch marginal likelihood -1866.3124105898187
Done

学習されたガウス過程におけるパラメタを出力

[8]:
gp.print_params()


likelihood parameter =   [-2.93775312]
mean parameter in GP prior:  [-1.06002832]
covariance parameter in GP prior:  [-0.86850454 -2.48529293]


テストデータの平均値(予測値)および分散を計算

[9]:
gp.prepare(X_train, t_train)
fmean = gp.get_post_fmean(X_train, X_test)
fcov = gp.get_post_fcov(X_train, X_test)

予測の結果

[10]:
fmean
[10]:
array([-1.05105624, -1.01027414, -1.00525062, ..., -0.99285067,
       -0.97720778, -0.99763675])

分散の結果

[11]:
fcov
[11]:
array([0.00052229, 0.00039968, 0.00052004, ..., 0.00039218, 0.00044258,
       0.00033381])

予測値の平均二乗誤差の出力

[12]:
np.mean((fmean-t_test)**2)
[12]:
0.004274437799555673

訓練済みモデルによる予測

学習済みモデルのパラメタをgp_paramsとして読み出し、これを用いた予測を行います。

gp_paramsおよび学習データ(X_train, t_train)を記憶しておくことで、訓練済みモデルによる予測が可能となります。

学習されたパラメタを準備(学習の直後に行う必要あり)

[13]:
#学習したパラメタを1次元配列として準備
gp_params =  np.append(np.append(gp.lik.params, gp.prior.mean.params), gp.prior.cov.params)

gp_params
[13]:
array([-2.93775312, -1.06002832, -0.86850454, -2.48529293])

学習に利用したモデルと同様のモデルをgpとして準備

[14]:
#共分散の定義 (ガウシアン)
cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )

#平均の定義
mean = physbo.gp.mean.const()

#尤度関数の定義 (ガウシアン)
lik = physbo.gp.lik.gauss()

#ガウス過程モデルの生成
gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)

学習済みのパラメタをモデルに入力し予測を実行

[15]:
#学習済みのパラメタをガウス過程に入力
gp.set_params(gp_params)


#テストデータの平均値(予測値)および分散を計算
gp.prepare(X_train, t_train)
fmean = gp.get_post_fmean(X_train, X_test)
fcov = gp.get_post_fcov(X_train, X_test)

予測の結果

[16]:
fmean
[16]:
array([-1.05105624, -1.01027414, -1.00525062, ..., -0.99285067,
       -0.97720778, -0.99763675])

分散の結果

[17]:
fcov
[17]:
array([0.00052229, 0.00039968, 0.00052004, ..., 0.00039218, 0.00044258,
       0.00033381])

予測値の平均二乗誤差の出力

[18]:
np.mean((fmean-t_test)**2)
[18]:
0.004274437799555673