インタラクティブに実行する¶
以下の流れで、PHYSBO をインタラクティブに実行することができます。
- PHYSBO から次に実行するパラメータを得ます。
- PHYSBO の外部で評価値を得ます。
- 評価値をPHYSBOに登録します。
例えば、以下の様な場合に適しています。
- 人手による実験を行い、その評価値をPHYSBOに与えたい。
- simulator の実行を別プロセスで行うなど、柔軟に実行制御を行いたい。
探索候補データの準備¶
これまでのマニュアルでも利用していた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)
simulator の定義¶
[2]:
class simulator:
def __init__( self ):
_, self.t = load_data()
def __call__( self, action ):
return self.t[action]
最適化の実行¶
[3]:
# policy のセット
policy = physbo.search.discrete.policy(test_X=X)
# シード値のセット
policy.set_seed( 0 )
各探索ステップでは以下の処理を行っています。
max_num_probes=1, simulator=None
として random_search または bayes_search を実行して action ID (パラメータ)を得る。t = simulator(actions)
により評価値(の array) を得る。policy.write(actions, t)
により action ID (パラメータ) に対する評価値を登録する。physbo.search.utility.show_search_results
により履歴を表示する。
以下では、ランダムサンプリングを2回(1st, and 2nd steps)、ベイズ最適化による提案を2回(3rd, and 4th steps)を行います。
[ ]:
simulator = simulator()
''' 1st step (random sampling) '''
actions = policy.random_search(max_num_probes=1, simulator=None)
t = simulator(actions)
policy.write(actions, t)
physbo.search.utility.show_search_results(policy.history, 10)
''' 2nd step (random sampling) '''
actions = policy.random_search(max_num_probes=1, simulator=None)
t = simulator(actions)
policy.write(actions, t)
physbo.search.utility.show_search_results(policy.history, 10)
''' 3rd step (bayesian optimization) '''
actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)
t = simulator(actions)
policy.write(actions, t)
physbo.search.utility.show_search_results(policy.history, 10)
''' 4-th step (bayesian optimization) '''
actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)
t = simulator(actions)
policy.write(actions, t)
physbo.search.utility.show_search_results(policy.history, 10)
中断と再開¶
以下の predictor, training, history を外部ファイルに保存することで、最適化プロセスを中断し、途中から再開することができます。
- predictor: 目的関数の予測モデル
- training: predictor の学習に用いるデータ (
physbo.variable
オブジェクト) - history: 最適化実行の履歴 (
physbo.search.discrete.results.history
オブジェクト)
[5]:
import pickle
with open('predictor.dump', 'wb') as f:
pickle.dump(policy.predictor, f)
policy.training.save('training.npz')
policy.history.save('history.npz')
[ ]:
# policy を削除
del policy
# 保存した policy をロード
policy = physbo.search.discrete.policy(test_X=X)
policy.load('history.npz', 'training.npz', 'predictor.dump')
''' 5-th step (bayesian optimization) '''
actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)
t = simulator(actions)
policy.write(actions, t)
physbo.search.utility.show_search_results(policy.history, 10)
# predictor と training を個別に指定することも可
''' 6-th step (bayesian optimization) '''
actions = policy.bayes_search(max_num_probes=1,
predictor=policy.predictor, training=policy.training,
simulator=None, score='EI', interval=0, num_rand_basis = 5000)
t = simulator(actions)
policy.write(actions, t)
physbo.search.utility.show_search_results(policy.history, 10)