web-dev-qa-db-ja.com

RuntimeWarning:numpy.dtypeのサイズが変更されました。バイナリの非互換性がある可能性があります。

保存した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

UPDATE: OK、 here 、および

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn

最初にエラーが発生した理由はわかりませんが、エラーは発生しました。

125
Blue482

MAINT:dtype/ufuncサイズの変更に関するCythonの警告を黙らせる。-numpy/numpy

これらの警告は、インストールされている古いnumpyに対してコンパイルされたscipy(または別のパッケージ)をインポートするたびに表示されます。

そして、チェックはCythonによって挿入されます(したがって、Cythonでコンパイルされたモジュールに存在します)。

要するに、これらの警告はnumpyの特定のケースでは無害である必要があり、これらのメッセージはnumpy 1.8(このコミットが行われたブランチ)以来除外されます。 scikit-learn 0.18.1numpy 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:¹で代わりに ボール そのためのツール。


長い話:パッチの提唱者 Claimsnumpyには特にリスクがなく、サードパーティのパッケージは古いバージョンに対して意図的にビルドされます:

[現在のnumpyに対してすべてを再構築する]は実行可能なソリューションではなく、確かに必要ではありません。 Scipy(他の多くのパッケージと同様)は、numpyの多くのバージョンと互換性があります。そのため、scipyバイナリを配布する場合、サポートされている最も低いnumpyバージョン(現時点では1.5.1)に対してビルドし、1.6.x、1.7.x、numpy masterでも動作します。

本当に正しいのは、Cythonがdtypes/ufuncsのサイズがABIを壊すような方法で変更された場合にのみ警告を発行し、それ以外の場合は黙ることです。

その結果、Cythonの開発者は 手動でバイナリ互換性を維持することでnumpyチームを信頼することに同意しました 、したがって、ABIの変更を壊すバージョンを使用すると、特別に細工された例外またはその他の明示的なショーが生成されることが予想されます。ストッパー。


¹以前使用できた--no-use-wheelオプションは削除されました 以降pip 10.0.0

137
ivan_pozdeev

それは新しい派手なバージョンの問題です(1.15.0)

あなたはnumpyを格下げすることができ、この問題は修正されるでしょう:

Sudo pip uninstall numpy
Sudo pip install numpy==1.14.5

警告の問題が修正されたように最後に派手な1.15.1バージョンがリリースされています。

Sudo pip install numpy == 1.15.1

これは働いています..

36
Parthiban.S

私は上記の方法を試しましたが、何もうまくいきませんでした。しかし、apt installでライブラリをインストールした後、この問題は解決しました。

Python 3では、

pip3 uninstall -y numpy scipy pandas scikit-learn
Sudo apt update
Sudo apt install python3-numpy python3-scipy python3-pandas python3-sklearn 

Python 2の場合、

pip uninstall -y numpy scipy pandas scikit-learn
Sudo apt update
Sudo apt install python-numpy python-scipy python-pandas python-sklearn 

それが役立つことを願っています。

8

あなたがアナコンダ環境にいるならば:

conda update --all
5
H. Shad

あなたのnumpyモジュールをアップグレードするだけで、今は1.15.4です。窓用

pip install numpy --upgrade
2
satyam_sareen

このエラーは、インストールされているパッケージが異なるバージョンのnumpyでビルドされたために発生します。
私たちは地元のnumpyに対してscipyを再構築し、scikit-learnする必要があります。

新しいpip(私の場合はpip 18.0)の場合、これはうまくいきました。

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy,scikit-learn -I scipy scikit-learn

--no-binaryはバイナリを無視したいパッケージの名前のリストを取ります。この場合、パッケージscipy、scikit-learnのバイナリを無視する--no-binary scipy,scikit-learnを渡しました。私を助けませんでした

1
Temak

Cython 0.29では、新しい check_sizeオプション が出ているという警告をなくしているので、そのバージョンがさまざまなパッケージに浸透したら、回避策は必要ないはずです。

0
mattip

メタ情報: sklearnをインストールするためのお勧めの方法

既にnumpyとscipyがインストールされているのなら、scikit-learnをインストールする最も簡単な方法はpipを使うことです。

pip install -U scikit-learn 

またはconda

conda install scikit-learn

[... pipを使ってソースからコンパイルしない]

まだnumpyとscipyを使ったpythonをインストールしていない場合は、パッケージマネージャか apythonbundle からインストールすることをお勧めします。これらは、きたなく、scipy、scikit-learn、matplotlibそして他の多くの役に立つ科学的およびデータ処理ライブラリと共に来ます。

0
serv-inc