SMTorg / smt

Surrogate Modeling Toolbox
https://smt.readthedocs.io/en/stable
BSD 3-Clause "New" or "Revised" License
669 stars 201 forks source link

Save and reload trained models #156

Open ArioBattolla opened 5 years ago

ArioBattolla commented 5 years ago

How can I save and reload trained models? I tried to pickle them, but it does not work. I would like to train once and then use the trained model in another python file to predict data points. Thank you very much, your package is incredible!

relf commented 5 years ago

Could you show your code for pickling? Have you got an error?

ArioBattolla commented 5 years ago

I did:

sm = models[model](**par)
sm.set_training_values(X_train, y_train)
sm.train()
with open("best_models.pickle", "wb") as handle:
        pickle.dump(sm, handle)

I got this error: PicklingError: Can't pickle <class 'function'>: attribute lookup function on builtins failed

relf commented 5 years ago

Ok. That was fixed recently for Kriging based surrogates at least (see #154). So you have to install SMT from GitHub.

ArioBattolla commented 5 years ago

Ah ok, thank you very much. What can I do for other models, such as RBF or IDW?

relf commented 5 years ago

I've just released SMT 0.3.3, you can try it with:

pip install -U smt

Regarding, IDW and RBF, do you get an error? I am not sure but I think it had worked for me.

ArioBattolla commented 5 years ago

It gives me this error:

File "W:/17_Users/trainees/Battolla/manda\regression.py", line 647, in AutoInterpolation pickle.dump(best_models, handle)

File "stringsource", line 2, in smt.surrogate_models.rbfclib.PyRBF.__reduce_cython__

TypeError: no default reduce due to non-trivial cinit

I have no clue what is about

relf commented 5 years ago

My bad. Indeed it does not work for IDW and RBF and other surrogates using a Cython extensions. Those require special handling (see stackoverflow related question).

ArioBattolla commented 5 years ago

But if I save KPLS, do I need to retrain the model or can I load directly to predict new points? Because I am not able to do that.

bouhlelma commented 5 years ago

Hi, If you have questions about SMT, please open a new detailed issue on smt GitHub here https://github.com/SMTorg/SMT/issues https://github.com/SMTorg/SMT/issues It will be more useful for you because there are other SMT developers who can answer your questions as well.

Thank you, Mohamed

On Jul 24, 2019, at 2:53 PM, ArioBattolla notifications@github.com wrote:

But if I save KPLS, do I need to retrain the model or can I load directly to predict new points? Because I am not able to do that.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/SMTorg/smt/issues/156?email_source=notifications&email_token=AEOLWT6KI53LLC3MZFXIXGLQBBNGNA5CNFSM4H4DU2NKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD2WM7SY#issuecomment-514641867, or mute the thread https://github.com/notifications/unsubscribe-auth/AEOLWTZH66LXF2SKZTRTBPLQBBNGNANCNFSM4H4DU2NA.

relf commented 5 years ago

But if I save KPLS, do I need to retrain the model or can I load directly to predict new points? Because I am not able to do that.

What is going on? After the dump, you should be able to load the KPLS surrogate using pickle.load() and retrieve the trained surrogate.

ldallen-crrel commented 4 years ago

Hello @relf , Is there an accepted method to saving trained surrogates that do use Cython? I followed the link you posted above, but I am still confused about how it is implemented. Specifically, I am trying to save an IDW model.

My bad. Indeed it does not work for IDW and RBF and other surrogates using a Cython extensions. Those require special handling (see stackoverflow related question).

My code is nearly the same as the OP, though I get a different error: TypeError: no default __reduce__ due to non-trivial __cinit__

Thanks

relf commented 4 years ago

@ldallen-crrel No, we have not work specifically on surrogates dump, I've just referenced the link I found after a 2-minutes search. I've started to make pickling work for kriging-based ones but as I said Cython extensions require special handling. I've not planned to work on that, but it would be a great contribution to SMT. What do you mean by OP?

ldallen-crrel commented 4 years ago

Thank you for the reply. By OP, I only meant the original poster (ArioBattolla).

petrmanek commented 4 years ago

Bumping this after some time passed. Has this been resolved? Or has anyone found a workaround? I still get the following error when saving some models (e.g. RBF): TypeError: no default __reduce__ due to non-trivial __cinit__

relf commented 4 years ago

Nothing has evolved on this point. You get an error as it is not implemented (hence the open status of this issue). As far as I am concerned, I do not work on this but I will be happy to integrate a PR on this topic.

relf commented 3 years ago

Bumping on this again, for future reference, note that even if they can not be pickled directly, RBF, IDW, RMTS (like QP and LS) training operation can be cached.

These surrogates have a data_dir option which allows to specify a directory to cache relevant data for each method. Provided you initialize the method with the same training data, cached data is loaded back from the previous run without running training operation again.

relf commented 3 years ago

A section on this topic is added to the documentation.