J'ai cette erreur en essayant de charger un modèle SVM enregistré. J'ai essayé de désinstaller sklearn, NumPy et SciPy, puis de réinstaller toutes les versions les plus récentes (en utilisant pip). Je reçois toujours cette erreur. Pourquoi?
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, en suivant ici , et
pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn
L'erreur a maintenant disparu, bien que je ne sache toujours pas pourquoi elle s'est produite en premier lieu ...
Ces avertissements sont visibles à chaque fois que vous importez scipy (ou un autre paquet ) Compilé avec un numpy plus ancien que celui installé.
et les contrôles sont insérés par Cython (sont donc présents dans tout module compilé avec lui).
En résumé, ces avertissements devraient être bénins dans le cas particulier de numpy
, et ces messages sont filtrés depuis numpy 1.8
(la branche sur laquelle cette validation est passée). Tant que scikit-learn 0.18.1
EST COMPIL&EACUTE; AVEC numpy 1.6.1
.
Pour filtrer vous-même ces avertissements, vous pouvez faire la même chose comme le fait le patch :
import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
Bien sûr, vous pouvez simplement recompiler tous les modules concernés à partir de la source avec votre numpy
locale avec pip install --no-binary :all:
¹ à la place si vous avez le des balles des outils pour ça.
Histoire plus longue: le promoteur du patch affirme il ne devrait y avoir de risque spécifique avec numpy
, et les packages tiers sont construits intentionnellement par rapport à des versions plus anciennes:
[Reconstruire tout ce qui est contre numpy actuel] n’est pas faisable solution, et ne devrait certainement pas être nécessaire. Scipy (comme beaucoup d'autres Packages) est compatible avec plusieurs versions de numpy. Alors, quand nous distribuons des binaires scipy, nous les construisons par rapport au plus bas supporté version numpy (1.5.1 à partir de maintenant) et ils fonctionnent avec 1.6.x, 1.7.x et Numpy Master aussi.
Le vrai correct serait que Cython n’émette des avertissements que lorsque La taille de dtypes/ufuncs a des modifications qui cassent le ABI et deviennent silencieux autrement.
En conséquence, les développeurs de Cython ont accepté de confier à la main de numpy le maintien de la compatibilité binaire . Nous pouvons donc nous attendre à ce que l’utilisation de versions comportant des modifications ABI inattendues génère une exception spécialement conçue ou un autre système d’affichage explicite.
¹L'option --no-use-wheel
précédemment disponible a été supprimée depuis pip 10.0.0
.
C'est la question de la nouvelle version de Numpy (1.15.0)
Vous pouvez rétrograder numpy et ce problème sera résolu:
Sudo pip uninstall numpy
Sudo pip install numpy==1.14.5
Enfin, numpy version 1.15.1 est disponible, les problèmes d’avertissement sont résolus.
Sudo pip install numpy == 1.15.1
Cela fonctionne ..
J'ai essayé les méthodes mentionnées ci-dessus, mais rien n'a fonctionné. Mais le problème avait disparu après avoir installé les bibliothèques via apt install,
Pour Python3,
pip3 uninstall -y numpy scipy pandas scikit-learn
Sudo apt update
Sudo apt install python3-numpy python3-scipy python3-pandas python3-sklearn
Pour Python2,
pip uninstall -y numpy scipy pandas scikit-learn
Sudo apt update
Sudo apt install python-numpy python-scipy python-pandas python-sklearn
J'espère que cela pourra aider.
si vous êtes dans un environnement anaconda, utilisez:
conda update --all
Il suffit de mettre à jour votre module numpy, il est actuellement 1.15.4. Pour les fenêtres
pip install numpy --upgrade
Cette erreur se produit car les packages installés ont été compilés selon une version différente de numpy.
Nous devons reconstruire scipy et scikit-learn par rapport à la variable locale numpy
.
Pour new pip
(dans mon cas, pip 18.0
), cela a fonctionné:
pip uninstall -y scipy scikit-learn
pip install --no-binary scipy,scikit-learn -I scipy scikit-learn
--no-binary
prend une liste de noms de packages pour lesquels vous souhaitez ignorer les fichiers binaires. Dans ce cas, nous avons passé --no-binary scipy,scikit-learn
qui ignorera les fichiers binaires des paquets scipy, scikit-learn . Ne m'a pas aidé
Notez que depuis la version 0.29 de cython, il existe une nouvelle option check_size qui élimine l’avertissement à la source. Par conséquent, aucune solution de rechange ne devrait être nécessaire une fois que cette version a été transférée dans les différents packages
Méta-informations: La manière recommandée d'installer sklearn
Si vous avez déjà une installation fonctionnelle de numpy et scipy, le fichier Le moyen le plus simple d'installer scikit-learn est d'utiliser
pip
pip install -U scikit-learn
ou
conda
:conda install scikit-learn
[... ne compilez pas depuis la source en utilisant pip]
Si vous ne possédez pas déjà d’installation python avec numpy et scipy, nous vous recommandons d’installer via votre gestionnaire de paquets ou via apythonbundle . Celles-ci viennent avec numpy, scipy, scikit-learn, matplotlib et de nombreuses autres bibliothèques scientifiques et informatiques utiles.