6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ベリサーブAdvent Calendar 2019

Day 4

PythonのBayesianOptimizationを使ってみた

Last updated at Posted at 2019-12-03

こちらのベイズ最適化を使ってみました。ちょっとだけ工夫が必要だったので、残しておきます。

maximizeしかない

optimizer.maximize(
    init_points=2,
    n_iter=3,
)

READMEより。
最適化のメソッドがmaximizeしか用意されていないように見えました。僕がやりたかったのが、検索ランキングの最適化(よりランキングの上位でヒットするようにしたい)だったので、単純に順位にマイナスをつけて最適化するということをしました。

optimizer = BayesianOptimization(
    f=foo,
    pbounds=pbounds,
)

このfooの返り値を負にしたということです。maximizeoptimizer側でやり口があるかもしれませんが、見つけられませんでした。

最適化対象の関数の引数が限定される

def foo(x, y):
    return -x ** 2 - (y - 1) ** 2 + 1

これが最適化対象の関数。

pbounds = {'x': (2, 4), 'y': (-3, 3)}

こんな感じで引数の範囲を与えて、その中で最適な値を探しに行くという仕組みです。僕のところではfoo(x, y, z)という感じでもう一つ引数を与えたいということがあって、そのままmaximizeに食わせたらエラーとなった、というお話です。対策としてはzをグローバル変数にして無理やり渡しました。正しいかはわかりません。

二つの値の合成比率を決めるときの注意

これはベイズ最適化関係ないのですけれど、xとyの最適な合成比率を決めるときに、最初以下のように書いていました。

def foo(a):
   return a*x+y 

で、

pbounds = {'a': (0, 100)}

なんてやっちゃってました。だめだめですね。

def foo(a):
   return a*x+(100-a)*y 

こうして

pbounds = {'a': (0, 100)}

こうすることでうまくいきました。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?