機械学習モデルが「dtype mismatch」で読み込めない。
'ValueError: Buffer dtype mismatch, expected 'SIZE_t' but got 'long long''
Pythonで上のようなエラーが出る理由について紹介する。
現象
scikit-learn
のRandomForestRegressor
でモデルを学習- 学習させたモデルを
pickle
でバイナリファイルとして保存 - モデルファイルを別のPCで読み込み
この作業を行うと以下のエラーが発生する。
'ValueError: Buffer dtype mismatch, expected 'SIZE_t' but got 'long long''
pickleとは
pickleとはPythonの変数やクラスインスタンスをファイルに書き出して、別のpythonプログラムで使えるようにできる機能。
Python: オブジェクトを漬物 (Pickle) にする - CUBE SUGAR CONTAINER
エラー内容
dtype mismatch, expected 'SIZE_t' but got 'long long'
つまりSIZE_t
型だと思って読み込もうとしたらlong long
型が来たので型が合わなくてエラーになっている。
エラー原因
原因は学習させたPCとモデルを読み込んだPCのOSのバージョンが違うこと。
以下のサイトを読むに、RandomForestRegressor
は32bitと64bitで異なる型を使っていることわかる。
64bit版で学習したモデルは32bit版とは異なる型のデータなので、32bit版で読み込もうとした際に型が合わずにエラーになったわけである。
This occurs because the random forest code uses different types for indices on 32-bit and 64-bit machines.
machine learning - Scikits-Learn RandomForrest trained on 64bit python wont open on 32bit python - Stack Overflow
まとめ
- 同じようなクラスでも32bit版と64bit版で内部の型が違うことがある
- 内部の型が異なると
pickle
でシリアライズしても再利用できない
というより32bit版Windowsではメモリも十分に使えないので64bit版に切り替えるべきである。