【ベイズ最適化】PHYSBOの使い方入門|コピペで動くPythonコード全文つき
こんにちは、かなめです。
プログラミングを覚えたてのころの話です。チュートリアルの通りに書いたはずのコードが、動かない。画面には英語のエラーが3行。時計を見ると23時で、研究室にはもう誰もいません。
あの夜いちばんこたえたのは、エラーそのものより「これで合っているのか誰にも聞けない」という心細さでした。
今日はコードの回です。なので先に約束します。この記事のコードは、コピペすればそのまま動きます(動かないときの処方箋も後半に書きます)。
そして私が実際にはまった穴を3つ、埋めずに残しておきます。あなたの23時が、少しでも早く終わりますように。
こんな人におすすめ
理屈はもういいから、手を動かして覚えたい方
PHYSBOの日本語の実践例を探していた方
過去にエラーで挫折して、Pythonと気まずい関係になっている方
前回のおさらい
第3回までで、ベイズ最適化の輪が完成しました。予測して、次の一手を提案して、実験して、学ぶ。今日はこの輪を、頭の中ではなくPythonで回します。
道具はPHYSBO。実験屋の言葉が通じるライブラリ
使うのはPHYSBO(フィズボ)というPythonライブラリです。東京大学物性研究所のプロジェクトで開発された国産ツールで、物理や材料の研究者を最初からターゲットに育てられてきました。無料で、日本語のマニュアルがあります。
私がPHYSBOを最初の一歩に薦める理由は、たったひとつです。
PHYSBOは「メニュー表から選ぶ」方式だから。
先に「試せる条件の一覧表(メニュー表)」を渡しておくと、PHYSBOはその中から「次はこれを試して」と選んでくれます。当たり前に聞こえるかもしれませんが、世の中の最適化ツールには「最適解は183.7264℃です」と返してくるタイプも多いんです。うちのホットプレートにそんな目盛りはありません。

実験の条件って、実際にはメニューなんですよね。ヒーターの設定は0.5℃刻み、使える溶媒は棚にある数種類、装置の回転数は決まった段階だけ。最初からメニューの中で戦ってくれるPHYSBOは、実験屋と話が合います。
コード全文(4ブロックだけ)
お題はもちろんホットケーキ。140℃から220℃まで0.5℃刻みで、メニューは161行です。この中から「世界一おいしい温度」を10枚で探します。
コードの登場人物は4つだけです。
①メニュー表
②焼いて採点する係
③店長(PHYSBO)
④結果発表。

import numpy as np
import physbo
# --- ① メニュー表を作る(140〜220℃、0.5℃刻みで161通り) ---
candidates = np.arange(140, 220.5, 0.5).reshape(-1, 1)
# --- ② 「1枚焼いて採点する係」を作る ---
rng = np.random.default_rng(42) # 乱数を固定(この記事と同じ結果になるように)
def bake_and_score(actions):
temp = candidates[actions[0], 0] # PHYSBOは「メニューの何番?」と番号で聞いてくる
score = (86 * np.exp(-((temp - 187) ** 2) / (2 * 13 ** 2))
+ 52 * np.exp(-((temp - 155) ** 2) / (2 * 9 ** 2))
- 30 * np.exp((temp - 214) / 6) + 8)
score += rng.normal(0, 2.2) # 味見のゆらぎ
print(f" {temp:5.1f}℃ で1枚 → {score:5.1f}点")
return score
# --- ③ 店長に任せる(まずランダム3枚 → AIの提案で7枚) ---
policy = physbo.search.discrete.Policy(test_X=candidates)
policy.set_seed(0)
policy.random_search(max_num_probes=3, simulator=bake_and_score)
policy.bayes_search(max_num_probes=7, simulator=bake_and_score,
score="EI", interval=1, num_rand_basis=500)
# --- ④ 結果発表 ---
best_scores, best_actions = policy.history.export_all_sequence_best_fx()
print(f"\nベスト: {candidates[int(best_actions[-1]), 0]:.1f}℃({best_scores[-1]:.1f}点)")
ブロックごとに、一言ずつ。
①メニュー表。実務ではここが「試せる組成の一覧」や「装置で設定できる条件表」に変わります。ExcelからCSVで読み込んでも大丈夫です。
②採点係。今回は「正解の式+味見のゆらぎ」で実験ごっこをしていますが、本番ではこの関数の中身が本物の実験と測定になります。1行目の「actions」だけ補足すると、PHYSBOはメニューの中身ではなく番号で会話します。「47番を試して」と番号が届くので、メニュー表から47番の温度を引いて、焼いて、点数を返す。それだけの係です。
③店長。最初の3枚がランダムなのは、データがゼロだと予測のしようがないから。畑でいう種まきです。
その後の7枚がAIの提案で、カッコの中の3つはこう読みます。score="EI"は第3回に出てきた獲得関数の名前。interval=1は「1枚焼くたびに学び直してね」。num_rand_basis=500は「計算を速くするための近似の細かさ」で、当面はこの値のままで困りません。
④結果発表。履歴から「その時点でのベスト」を取り出しています。
実行結果。3枚目、丸焦げ
私の環境の実行ログを、そのまま載せます。
--- まず3枚、ランダムに焼く ---
195.5℃ で1枚 → 76.7点
167.0℃ で1枚 → 53.4点
212.5℃ で1枚 → -1.2点
--- ここからAIの提案で焼く ---
145.0℃ で1枚 → 38.6点
164.5℃ で1枚 → 52.7点
186.0℃ で1枚 → 90.7点
188.0℃ で1枚 → 93.7点
188.5℃ で1枚 → 92.4点
189.0℃ で1枚 → 92.5点
189.5℃ で1枚 → 90.1点
ベスト: 188.0℃(93.7点)
まず笑ってほしいのが3枚目です。212.5℃、マイナス1.2点。丸焦げです。

でもこの丸焦げ、無駄になっていません。「高温側は絶望的」と学んだAIは、以降いっさい高温側に近寄らなくなりました。失敗した実験も、ちゃんとデータなんです。
そのあとの7枚は、3幕構成になっています。
4〜5枚目(偵察):まだ何も知らない低温側を2枚だけ試す。第3回の言葉でいう「探索」です
6枚目(発見):186.0℃で90.7点の大当たり
7〜10枚目(追い込み):当たりの周辺を0.5℃刻みで細かく試す「活用」に切り替え、7枚目の188.0℃・93.7点がベストに



種明かしをすると、私が仕込んだ正解は187℃でした。161通りのメニューから、10枚でほぼ的中です。第1回で「5℃刻みの総当たりなら17枚」と書きましたが、今回は0.5℃刻みという10倍細かいメニューで探して、10枚。ページを3回さかのぼるより、この2つの数字を並べるほうが、ベイズ最適化の価値は伝わる気がします。
かなめの実験ノート・拡大版(今日は3連発)

穴その1:インストールしたのに動かない。
PHYSBOはNumPyのバージョンと相性が出ることがあります。
これは公式の講習会資料にも載っている定番のつまずきで、処方箋は「NumPyを更新してから、PHYSBOを入れ直す」。環境構築という沼を、丸ごと迂回できます。
穴その2:大きくしたいのか、小さくしたいのか。
PHYSBOは点数を「大きくする」道具です。
でも実務では「不良率を下げたい」「コストを下げたい」も多いですよね。私は昔この向きを間違えたまま回して、最悪の条件を全力で探索させたことがあります。小さくしたい量には、マイナスを付けて渡す。それだけで解決します。
穴その3:結果が毎回変わって「壊れた」と騒ぐ。
ベイズ最適化は途中で乱数を使うので、何もしないと実行のたびに提案が変わります。壊れていません。コードにset_seedなどの「乱数固定」が2箇所入っているのはこのためで、記事の再現や検証のときは固定、本番の探索では外す、と使い分けます。
先週公開した「さわれるベイズ最適化」で遊んでからこのコードを読むと、あの画面の裏で何が起きていたかが繋がるはずです。
今日の一冊と、学びの入口
『Pythonで学ぶ実験計画法入門 ベイズ最適化によるデータ解析』(金子弘昌 著、講談社)
第1回で紹介した本の再登場です。ホットケーキを卒業して自分の実データでやるなら、この本のサンプルコードが最短ルートです。データの前処理からベイズ最適化までが、一冊で地続きになっています。
Udemy『【キカガク流】人工知能・機械学習 脱ブラックボックス講座 -初級編-』
「コードは動いたけど、中で何が起きているのか不安」という方はこちらへ。動いたあとに学ぶほうが、吸収は段違いにいいです。
おわりに
10枚のログを眺めていて、しみじみ思いました。丸焦げの3枚目も、遠回りに見えた偵察の4枚目も、ぜんぶ188.0℃への道だったんですよね。ベイズ最適化は、失敗をなかったことにしない道具です。人間はつい、失敗した実験をノートの隅に小さく書いてしまいますけど。

よかったらコメントで教えてください。Colabで回してみた結果、エラーで詰まった箇所(必ず誰かの役に立ちます)、それから、あなたの「23時のエラー」の思い出でも。
さて、ホットケーキはおいしく焼けるようになりました。ところが次回、上司(仮)がこう言います。「おいしくて、焦げにくくもして」。……点数が2種類になった瞬間、「最適」という言葉の意味そのものが変わります。次回は多目的最適化。材料開発でいちばん現実に近い回です。
最後まで読んでくださって、ありがとうございました。
かなめ
このシリーズはマガジン【とことんやさしいベイズ最適化】にまとめています。
