Estoy tratando de cargar mi modelo guardado desde s3 usando joblib
import pandas as pd import numpy as np import json import subprocess import sqlalchemy from sklearn.externals import joblib ENV = 'dev' model_d2v = load_d2v('model_d2v_version_002', ENV) def load_d2v(fname, env): model_name = fname if env == 'dev': try: model=joblib.load(model_name) except: s3_base_path='s3://sd-flikku/datalake/doc2vec_model' path = s3_base_path+'/'+model_name command = "aws s3 cp {} {}".format(path,model_name).split() print('loading...'+model_name) subprocess.call(command) model=joblib.load(model_name) else: s3_base_path='s3://sd-flikku/datalake/doc2vec_model' path = s3_base_path+'/'+model_name command = "aws s3 cp {} {}".format(path,model_name).split() print('loading...'+model_name) subprocess.call(command) model=joblib.load(model_name) return modelPero me enfrentaba a este error:
from sklearn.externals import joblib ImportError: cannot import name 'joblib' from 'sklearn.externals' (C:\Users\prane\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\externals\__init__.py)Luego intenté instalar joblib directamente haciendo
import joblibpero me dio este error
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 8, in load_d2v_from_s3 File "/home/ec2-user/.local/lib/python3.7/site-packages/joblib/numpy_pickle.py", line 585, in load obj = _unpickle(fobj, filename, mmap_mode) File "/home/ec2-user/.local/lib/python3.7/site-packages/joblib/numpy_pickle.py", line 504, in _unpickle obj = unpickler.load() File "/usr/lib64/python3.7/pickle.py", line 1088, in load dispatch[key[0]](self) File "/usr/lib64/python3.7/pickle.py", line 1376, in load_global klass = self.find_class(module, name) File "/usr/lib64/python3.7/pickle.py", line 1426, in find_class __import__(module, level=0) ModuleNotFoundError: No module named 'sklearn.externals.joblib'¿Puedes decirme cómo resolver esto? Gracias por adelantado
Parece que su archivo guardado de pickle existente ( model_d2v_version_002 ) codifica un módulo de referencia en una ubicación no estándar: una biblioteca de sklearn.externals.joblib joblib lugar de en el nivel superior.
La documentación actual scikit-learn solo habla de un joblib de nivel superior, por ejemplo, en el ejemplo de persistencia 3.4.1 , pero veo una referencia en el problema anterior de otra persona a una advertencia de depreciación en la versión 0.21 de scikit-learn sobre un scikit.external.joblib la variante scikit.external.joblib desaparece:
Python37\lib\site-packages\sklearn\externals\joblib_init_.py:15: Advertencia de desuso: sklearn.externals.joblib está en desuso en 0.21 y se eliminará en 0.23. Importe esta funcionalidad directamente desde joblib, que se puede instalar con: pip install joblib. Si aparece esta advertencia al cargar modelos en escabeche, es posible que deba volver a serializar esos modelos con scikit-learn 0.21+.
'Obsoleto' significa marcar algo como desaconsejable para confiar, ya que es probable que se suspenda en una versión futura (a menudo, pero no siempre, con una nueva forma recomendada de hacer lo mismo).
Sospecho que su archivo model_d2v_version_002 se guardó de una versión anterior de scikit-learn , y ahora está usando scikit-learn (también conocido como sklearn ) versión 0.23+ que eliminó por completo la variación sklearn.external.joblib . Por lo tanto, su archivo no puede cargarse directa o fácilmente en su entorno actual.
Pero, según DeprecationWarning , probablemente pueda usar temporalmente una versión anterior scikit-learn para cargar el archivo de la forma anterior una vez y luego volver a guardarlo de la forma preferida ahora. Dada la información de advertencia, esto probablemente requiera la versión 0.21.x o 0.22.x scikit-learn , pero si sabe exactamente de qué versión se guardó su archivo model_d2v_version_002 , intentaría usarlo. Los pasos serían más o menos:
crear un entorno de trabajo temporal (o revertir su entorno de trabajo actual) con el antiguo sklearn
hacer importaciones algo como:
import sklearn.external.joblib as extjoblib import joblib extjoblib.load() su antiguo archivo como lo había planeado, pero luego inmediatamente re- joblib.dump() el archivo usando el joblib de nivel superior. (Es probable que desee usar un nombre distinto, para mantener el archivo anterior, por si acaso).
mueva/actualice a su entorno real y moderno, y solo import joblib (nivel superior) para usar joblib.load() - ya no tendrá referencias a `sklearn.external.joblib' ni en su código ni en sus archivos pickle almacenados.
Puede importar joblib directamente instalándolo como una dependencia y usando import joblib ,
En caso de que la ejecución/llamada a joblib esté dentro de otro programa .py en lugar del suyo (en tal caso, incluso si ha instalado joblib, todavía causa un error desde el programa de Python que llama a menos que cambie el código, pensé que sería complicado) , traté de crear un enlace duro:
(versión de Windows)
Python> importar joblib
luego dentro de su ruta de sklearn >......\Lib\site-packages\sklearn\externals
mklink /J ./joblib .....\Lib\site-packages\joblib
(Puede resolver lo anterior usando ! o %, !mklink....... o %mklink...... dentro de su cuaderno Python juptyter, o use el comando python OS...)
Esto crea efectivamente una carpeta virtual de joblib dentro de la carpeta "externos"
Observaciones: por supuesto, para ser más resistente a la versión, su código debe verificar que la versión de sklearn sea> = 0.23 nuevamente de antemano.
Esta sería una alternativa a cambiar la versión de sklearn.
Al recibir el error:
de sklearn.externals import joblib obsoleta la versión anterior.
Para la nueva versión siga:
Debes usar directamente
import jobliben lugar de
from sklearn.externals import joblibTal vez tu código esté desactualizado. Para cualquiera que pretenda usar fetch_mldata en un proyecto escrito a mano con dígitos, debería fetch_openml en su lugar. ( enlace )
En la versión antigua de sklearn:
from sklearn.externals import joblib mnist = fetch_mldata('MNIST original')En sklearn 0.23 (versión estable):
import sklearn.externals import joblib dataset = datasets.fetch_openml("mnist_784") features = np.array(dataset.data, 'int16') labels = np.array(dataset.target, 'int') Para obtener más información sobre la desaprobación de fetch_mldata consulte el documento de scikit-learn
Después de una larga investigación, dada la configuración de mi computadora, descubrí que se debía a que se requería un certificado SSL para descargar el conjunto de datos.
para este error, tuve que usar directamente lo siguiente y funcionó de maravilla:
import joblibSencillo