この記事に書いてあること
pythonのベイズ最適化ライブラリであるbayesian-optimizationのコードを実行したとき、以下のエラーが出て詰まることがあります。
ValueError: array must not contain infs or NaNs
この記事では、このエラーを解消する方法について書いています。
結論を言えば、scikit-learnのバージョンが原因なので、これを適切なものに変更すれば良いです。
僕は「bayesian-optimization 1.2.0」「scikit-learn 0.24.2」で解消できました。
該当のエラーが生じるコード例
エラーが出るコードは、例えばbayesian-optimizationのadvanced-tourに記載されている以下のコードです。
詳しくいえば、17行めからのforループ2週めの next_point = optimizer.suggest(utility) です。
from bayes_opt import BayesianOptimization
def black_box_function(x, y):
return -x ** 2 - (y - 1) ** 2 + 1
optimizer = BayesianOptimization(
f=None,
pbounds={'x': (-2, 2), 'y': (-3, 3)},
verbose=2,
random_state=1,
)
from bayes_opt import UtilityFunction
utility = UtilityFunction(kind="ucb", kappa=2.5, xi=0.0)
for _ in range(5):
next_point = optimizer.suggest(utility)
target = black_box_function(**next_point)
optimizer.register(params=next_point, target=target)
print(target, next_point)
print(optimizer.max)
エラーの解決法
このサイトによると、下図のようにscikit-learnのバージョンが原因であることが示唆されています。
そこで私の環境に入っているscikit-learnのバージョンを確認したところ「0.23.2」でした。
ここで選択肢としては2つあります。
- さきほどの画像のように、現環境のscikit-learnのバージョンをダウングレードする。
- 新しく環境を作って、適切なバージョンをインストールする。
前者の方法では他のライブラリとの依存関係が壊れる可能性があると思いましたので、僕は後者の方法で進めることにしました。
新しく環境を作る方法は別サイトですぐに見つかります。例えばこのサイト。
そこで新しく作った環境でbayesian-optimizationをインストールしたところ、scikit-learnも自動的にインストールされました。それぞれのバージョンは「bayesian-optimization 1.2.0」「scikit-learn 0.24.2」でした。
scikit-learnのバージョンはさきほどの画像に記載されている0.22.xとは異なりますが、無事にエラーなく動作することができました。
まとめ
- bayesian-optimizationは、チュートリアルコードでもValue Errorが出ることがある。
- その原因はscikit-learnのバージョンである。
- 「bayesian-optimization 1.2.0」「scikit-learn 0.24.2」で解消できた。
コメント
Thnx