こちらのベイズ最適化を使ってみました。ちょっとだけ工夫が必要だったので、残しておきます。
maximizeしかない
optimizer.maximize(
init_points=2,
n_iter=3,
)
READMEより。
最適化のメソッドがmaximize
しか用意されていないように見えました。僕がやりたかったのが、検索ランキングの最適化(よりランキングの上位でヒットするようにしたい)だったので、単純に順位にマイナスをつけて最適化するということをしました。
optimizer = BayesianOptimization(
f=foo,
pbounds=pbounds,
)
このfoo
の返り値を負にしたということです。maximize
やoptimizer
側でやり口があるかもしれませんが、見つけられませんでした。
最適化対象の関数の引数が限定される
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)}
こうすることでうまくいきました。