Pythonで機械学習をする際に有用なライブラリPyCaretの1機能であるinterpret_mode()
を使うと、SHAPを利用したモデルの解釈をPyCaretから実行できるようになります。
pip install pycaret
pip install shap
この2行(正確にはinterpret
も必要なプロットがあったりするけど)だけで、基本的にはPyCaretからSHAPが使えるようになるので非常に便利です。とくにNotebook上でPyCaretだけimport
すればよく、import shap
すら必要ありません。あとはinterpret_mode()
と記述して、create_model()
しておいたモデルについてプロットするだけです。
本来はそれだけのはずなのですが。
ええ、エラーになってしまったのですよ。
ImportError: numpy.core.multiarray failed to import
RuntimeError: module compiled against API version 0xe but this version of numpy is 0xd
interpret_mode()
を実行したところ、上記のようなエラーが発生しました。import
の実行でエラーになってしまい、これから先に進みません。
場合によっては、import
は実行できるもののinterpret_model()
を実行した箇所で似たようなエラーになるケースにも遭遇しました(ただし、こちらについては後述)。
さらに解せないのは、同じコードでつい数日前までは実行できていたことです。数日前にinterpret_model()
を正常に使っていたコンテナからDockerfileを持ってきて、それを元に新しくコンテナをビルドした環境で同じコードを実行したらエラーになる、という謎なシチュエーション。エラーメッセージを見るとNumPyが犯人っぽいけど・・・?
Numbaのバージョンアップのせい。
実はNumbaの更新履歴を見てみると、2021年8月21日にバージョン0.54がリリースされていることがわかります。これが直接の原因です。
PyCaretは、NumPyなら後述のようにバージョン指定していますが、Numbaについてはとくにバージョン指定がありません。そのため、PyCaretをインストールするとNumbaは最新版がインストールされます。現時点(2021年9月1日)では0.54がインストールされます。ところが、このバージョンでinterpret_model()
を実行すると、さっきのようなエラーが表示されてしまい、処理が異常終了してしまいます。
「数日前までは動いてた」ってのもコレが原因。たまたま8月21日以前にPyCaretの環境をDockerコンテナにて構築した際は、Numbaがバージョン0.53.1でインストールされたため問題なく動作していました。ところが、8月21日以降にPyCaretの環境を構築するとNumbaは最新バージョンをインストールしてしまいます。そのため、interpret_model()
が正常に動作していた環境とは厳密には異なる環境になっていたわけです。
なお、エラーメッセージからしてNumPyが悪いように見えますが、これは完全に濡れ衣です。PyCaretはNumPyのバージョン1.19.5を指定している(以上でも以下でもなく==
で指定)ため、少なくともフツーにpip
するならこれ以外のバージョンがインストールされることはありません。
インストールするNumbaのバージョンを指定すればいいわけです。単純ですね。
numba==0.53.1
自分は、上記のように0.53.1をインストール対象のバージョンとして指定しています。コンテナであれば、上記のようにバージョン指定したうえでコンテナをリビルドすれば問題なくinterpret_model()
が実行できるようになるはずです。
基本的には上記のようにインストールするNumbaのバージョンを指定すれば問題ないはずですが、そんなことをしなくてもエラーになったセルを再度実行することで、何事もなかったかのように処理が通るケースも確認しました。なんでやねん。とくにimport
部分ではなくinterpret_model()
のセルでエラーを吐いているケースでは、単純に再実行するだけで処置が通りました。なんでやねん。理由は謎です。
なお、import
部分でエラーになってしまうケースでは、この単純に再実行する方法は使えない(同じエラーが出続ける)ので、Numbaのバージョン指定を行うべきです。
いずれにせよ、なぜimport
部分でコケるケースとコケないケースが存在するのかは謎です。とはいえ、エラーになる条件がいまいちはっきりせず、仮に再実行で処理の継続は可能とは言っても毎回エラーの度に再実行するのは手間なので、基本的には前述の通りNumbaのバージョン指定することがベターだと思います。