Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the recommended way to persist (pickle) custom sklearn pipelines?

I have built an sklearn pipeline that combines a standard support vector regression component with some custom transformers that create features. This pipeline is then put into an object which is trained and then pickled (this seems to be the recommended way). The unpickled object is used to make predictions.

For distribution, this is turned into an executable file with pyinstaller.

When I call the unpickled regression object from a unit test, it works fine.

However, when I attempt to use the PyInstaller binary to make predictions, I get a long stack trace that ends with:

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

This feels like some kind of pickling error, probably due to the interaction of pickling with pyinstaller. How can I refactor my code so that my custom pipeline runs just as easily and robustly as a standard sklearn regressor after unpickling?

like image 787
Roko Mijic Avatar asked Oct 31 '17 16:10

Roko Mijic


People also ask

How do you pickle a pipeline?

There are three main methods of pickling gas pipe: Injection of highly odorized gas (>40 PPM) Slugging* Continuous injection of a controlled dosage of liquid odorant through the pipeline.


2 Answers

OK, after some googling around it seems to be the case that the root cause is not pickling, it is simply a pyinstaller "hidden imports" issue, but for some reason it only shows up when pickling (don't ask me why).

The following solved the immediate issue for me: edit the .spec file to add the following hidden import with Scipy:

 hiddenimports=['scipy._lib.messagestream']

I also needed some other hidden imports related to other libraries

 hiddenimports=['sklearn.neighbors.typedefs',
                'scipy._lib.messagestream',
                'pandas._libs.tslibs.timedeltas'   ]
like image 144
Roko Mijic Avatar answered Oct 20 '22 16:10

Roko Mijic


If anyone just wants to do this via CLI argument instead of through the .spec file as presented in Roko's answer, this is the syntax:

pyinstaller --hidden-import scipy._lib.messagestream --onefile your_python_file_here.py
like image 23
Braxvan Avatar answered Oct 20 '22 17:10

Braxvan