保存した SVM モデルをロードしようとすると、このエラーが発生します。sklearn、NumPy、SciPy をアンインストールし、最新バージョンをすべて再インストールしてみました (pip を使用)。それでもこのエラーが発生します。なぜでしょうか?
In [1]: import sklearn; print sklearn.__version__
0.18.1
In [3]: import numpy; print numpy.__version__
1.11.2
In [5]: import scipy; print scipy.__version__
0.18.1
In [7]: import pandas; print pandas.__version__
0.19.1
In [10]: clf = joblib.load('model/trained_model.pkl')
---------------------------------------------------------------------------
RuntimeWarning Traceback (most recent call last)
<ipython-input-10-5e5db1331757> in <module>()
----> 1 clf = joblib.load('sentiment_classification/model/trained_model.pkl')
/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in load(filename, mmap_mode)
573 return load_compatibility(fobj)
574
--> 575 obj = _unpickle(fobj, filename, mmap_mode)
576
577 return obj
/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in _unpickle(fobj, filename, mmap_mode)
505 obj = None
506 try:
--> 507 obj = unpickler.load()
508 if unpickler.compat_mode:
509 warnings.warn("The file '%s' has been generated with a "
/usr/lib/python2.7/pickle.pyc in load(self)
862 while 1:
863 key = read(1)
--> 864 dispatch[key](self)
865 except _Stop, stopinst:
866 return stopinst.value
/usr/lib/python2.7/pickle.pyc in load_global(self)
1094 module = self.readline()[:-1]
1095 name = self.readline()[:-1]
-> 1096 klass = self.find_class(module, name)
1097 self.append(klass)
1098 dispatch[GLOBAL] = load_global
/usr/lib/python2.7/pickle.pyc in find_class(self, module, name)
1128 def find_class(self, module, name):
1129 # Subclasses may override this
-> 1130 __import__(module)
1131 mod = sys.modules[module]
1132 klass = getattr(mod, name)
/usr/local/lib/python2.7/dist-packages/sklearn/svm/__init__.py in <module>()
11 # License: BSD 3 clause (C) INRIA 2010
12
---> 13 from .classes import SVC, NuSVC, SVR, NuSVR, OneClassSVM, LinearSVC, \
14 LinearSVR
15 from .bounds import l1_min_c
/usr/local/lib/python2.7/dist-packages/sklearn/svm/classes.py in <module>()
2 import numpy as np
3
----> 4 from .base import _fit_liblinear, BaseSVC, BaseLibSVM
5 from ..base import BaseEstimator, RegressorMixin
6 from ..linear_model.base import LinearClassifierMixin, SparseCoefMixin, \
/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py in <module>()
6 from abc import ABCMeta, abstractmethod
7
----> 8 from . import libsvm, liblinear
9 from . import libsvm_sparse
10 from ..base import BaseEstimator, ClassifierMixin
__init__.pxd in init sklearn.svm.libsvm (sklearn/svm/libsvm.c:10207)()
RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 80
アップデート:OK、次の手順に従ってここ、 そして
pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn
エラーはなくなりましたが、そもそもなぜエラーが発生したのかは未だにわかりません...
ベストアンサー1
によるとMAINT: dtype/ufunc サイズの変更に関する Cython の警告を黙らせます。 - numpy/numpy:
これらの警告は、インストールされている numpy よりも古いバージョンに対してコンパイルされた scipy (または別のパッケージ) をインポートするたびに表示されます。
チェックは Cython によって挿入されます (したがって、Cython でコンパイルされたすべてのモジュールに存在します)。
簡単に言うと、これらの警告は、特定のケースでは無害であるはずです。numpy
、 そしてこれらのメッセージはフィルタリングされるため、numpy 1.8
(このコミットが行われたブランチ)。scikit-learn 0.18.1
コンパイルされているnumpy 1.6.1
。
これらの警告を自分でフィルタリングするにはあなたも同じことができますパッチと同様に:
import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
もちろん、影響を受けるすべてのモジュールをソースからローカルに再コンパイルするだけで済みますnumpy
pip install --no-binary :all:
¹とその代わり
そのための勇気と
ツールがあれば 。
長い話:パッチの提唱者請求に特にリスクはないはずですnumpy
。サードパーティのパッケージは意図的に古いバージョンに対して構築されています。
[現在の numpy に対してすべてを再構築することは] 実現可能な解決策ではなく、確かに必要ではありません。Scipy (他の多くのパッケージと同様に) は、numpy の複数のバージョンと互換性があります。そのため、scipy バイナリを配布するときは、サポートされている最低の numpy バージョン (現時点では 1.5.1) に対してビルドし、1.6.x、1.7.x、および numpy マスターでも動作します。
本当に正しいのは、Cython が dtypes/ufuncs のサイズが ABI を破壊するような形で変更された場合にのみ警告を発し、それ以外の場合は何もしないことです。
その結果、Cythonの開発者たちはバイナリ互換性を手動で維持するためにNumPyチームを信頼することに同意したしたがって、ABI の変更が破壊的なバージョンを使用すると、特別に作成された例外やその他の明示的な障害が発生することが予想されます。
¹以前利用可能だった--no-use-wheel
オプションは削除されました以来pip 10.0.0
。