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
ОБНОВЛЕНИЕ: ОК, следуя здесь, и
pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn
Ошибка исчезла, хотя я до сих пор не знаю, почему это произошло в первую очередь...
Ответы
Ответ 1
Согласно MAINT: тишина Cython предупреждает об изменениях размера dtype/ufunc. - numpy/numpy:
Эти предупреждения видны всякий раз, когда вы импортируете scipy (или другой пакет), который был скомпилирован против более старого numpy, чем установлен.
и проверки вставляются 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 приведет к созданию специально созданного исключения или некоторого другого явного show-stopper.
¹ Ранее доступная опция pip 10.0.0
--no-use-wheel
была удалена с момента pip 10.0.0
.
Ответ 2
Это проблема новой версии numpy (1.15.0)
Вы можете понизить значение numpy, и эта проблема будет исправлена:
sudo pip uninstall numpy
sudo pip install numpy==1.14.5
Наконец выпущена версия numpy 1.15.1, поэтому исправлены проблемы с предупреждением.
sudo pip install numpy == 1.15.1
Это работает.
Ответ 3
Я пробовал вышеупомянутые способы, но ничего не получилось. Но проблема исчезла после того, как я установил библиотеки через apt install,
Для Python3,
pip3 uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python3-numpy python3-scipy python3-pandas python3-sklearn
Для Python2,
pip uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python-numpy python-scipy python-pandas python-sklearn
Надеюсь, это поможет.
Ответ 4
если вы находитесь в среде anaconda, используйте:
conda update --all
Ответ 5
Эта ошибка возникает из-за того, что установленные пакеты были построены с другой версией numpy.
Нам нужно перестроить scipy и scikit-learn против локального numpy
.
Для нового pip
(в моем случае pip 18.0
) это сработало:
pip uninstall -y scipy scikit-learn
pip install --no-binary scipy,scikit-learn -I scipy scikit-learn
--no-binary
принимает список имен пакетов, для которых вы хотите игнорировать двоичные файлы. В этом случае мы прошли --no-binary scipy,scikit-learn
который будет игнорировать двоичные файлы для пакетов scipy, scikit-learn. Не помог мне
Ответ 6
Мета-информация: рекомендуемый способ установки sklearn
Если у вас уже есть рабочая установка numpy и scipy, самый простой способ установки scikit-learn - использовать pip
pip install -U scikit-learn
или conda
:
conda install scikit-learn
[... не компилироваться из источника с помощью pip]
Если вы не уже есть установка питона с NumPy и SciPy, мы рекомендуем установить либо с помощью менеджера пакетов или с помощью в питона пачке. Они поставляются с numpy, scipy, scikit-learn, matplotlib и многими другими полезными научными библиотеками и библиотеками обработки данных.
Ответ 7
Моя среда - Python 2.7.15
я попробую
pip uninstall
pip install --no-use-wheel
Но это не работает. Он показывает ошибку:
нет такой опции: --no-use-wheel
Затем я пытаюсь:
pip uninstall
pip install --user --install-option="--prefix=" -U scikit-learn
И это работает: бесполезные предупреждения не показывают.
Ответ 8
При импорте scipy информация об ошибках показывает: RuntimeWarning: builtin.type size changed, может указывать на двоичную несовместимость. Ожидаемый zd, получил zd
Я решил эту проблему, обновив версию python с версии 2.7.2 до 2.7.13