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