¿Cuál es la forma recomendada de persistir (encurtir) las tuberías de sklearn personalizadas?

He construido una canalización de sklearn que combina un componente de regresión de vectores de soporte estándar con algunos transformadores personalizados que crean características. Esta tubería se coloca en un objeto que se entrena y luego se decapita ( parece ser la forma recomendada ). El objeto no seleccionado se utiliza para hacer predicciones.

Para la distribución, esto se convierte en un archivo ejecutable con pyinstaller .

Cuando llamo al objeto de regresión no seleccionado de una prueba unitaria, funciona bien.

Sin embargo, cuando bash usar el binario de PyInstaller para hacer predicciones, obtengo un largo seguimiento de stack que termina con:

module = loader.load_module(fullname) File "messagestream.pxd", line 5, in init scipy.optimize._trlib._trlib ImportError: No module named 'scipy._lib.messagestream' 

Esto se siente como una especie de error de decapado, probablemente debido a la interacción del decapado con pyinstaller. ¿Cómo puedo refactorizar mi código para que mi canalización personalizada se ejecute con la misma facilidad y robustez que un regresor sklearn estándar después de la eliminación?

De acuerdo, después de buscar en Google, parece ser que la causa principal no es el decapado, es simplemente un problema de “importaciones ocultas” de un instalador, pero por alguna razón, solo aparece cuando decapado (no me preguntes por qué).

Lo siguiente resolvió el problema inmediato para mí: edite el archivo .spec para agregar la siguiente importación oculta con Scipy :

  hiddenimports=['scipy._lib.messagestream'] 

También necesitaba algunas otras importaciones ocultas relacionadas con otras bibliotecas.

  hiddenimports=['sklearn.neighbors.typedefs', 'scipy._lib.messagestream', 'pandas._libs.tslibs.timedeltas' ] 

Si alguien solo quiere hacer esto a través del argumento CLI en lugar de hacerlo a través del archivo .spec como se presenta en la respuesta de Roko, esta es la syntax:

 pyinstaller --hidden-import scipy._lib.messagestream --onefile your_python_file_here.py