Python 機械学習

機械学習モデルが「dtype mismatch」で読み込めない

機械学習モデルが「dtype mismatch」で読み込めない

機械学習モデルが「dtype mismatch」で読み込めない。
'ValueError: Buffer dtype mismatch, expected 'SIZE_t' but got 'long long''
Pythonで上のようなエラーが出る理由について紹介する。


現象

  • scikit-learnRandomForestRegressorでモデルを学習
  • 学習させたモデルを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版に切り替えるべきである。


コチラもオススメ

KRSW

駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

役に立ったらシェアしてくれると励みになります。

にほんブログ村 IT技術ブログへ

-Python, 機械学習
-,

Translate »

Copyright© ITips , 2020 All Rights Reserved.