web-dev-qa-db-fra.com

Quelle est la méthode recommandée pour persister (décaper) les pipelines Sklearn personnalisés?

J'ai construit un sklearn pipeline qui combine un composant de régression vectorielle de support standard avec des transformateurs personnalisés qui créent des fonctionnalités. Ce pipeline est ensuite placé dans un objet formé, puis décapé (_ ​​ cela semble être la méthode recommandée ). L'objet non piqué est utilisé pour faire des prédictions.

Pour la distribution, ceci est transformé en un fichier exécutable avec pyinstaller .

Lorsque j'appelle l'objet de régression non piqué d'un test unitaire, cela fonctionne correctement.

Cependant, lorsque j'essaie d'utiliser le binaire PyInstaller pour faire des prédictions, je reçois un long trace de pile qui se termine par:

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

Cela ressemble à une sorte d'erreur de décapage, probablement due à l'interaction du décapage avec pyinstaller. Comment puis-je refactoriser mon code afin que mon pipeline personnalisé s'exécute aussi facilement et de manière robuste qu'un régresseur Sklearn standard après la suppression de la sélection?

7
Roko Mijic

D'accord, après quelques recherches sur Google, il semble que la cause première ne soit pas le marinage, il s'agit simplement d'un problème "d'importation cachée", mais pour une raison quelconque, il n'apparaît que lors du marinage (ne me demandez pas pourquoi). 

Ce qui suit a résolu le problème immédiat pour moi: éditez le fichier .spec pour ajouter l'importation cachée suivante avec Scipy:

 hiddenimports=['scipy._lib.messagestream']

J'avais aussi besoin d'autres importations cachées liées à d'autres bibliothèques

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

Si quelqu'un veut simplement faire cela via un argument CLI au lieu du fichier .spec présenté dans la réponse de Roko, voici la syntaxe:

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