Save classifier to disk in scikit-learn Save classifier to disk in scikit-learn python python

Save classifier to disk in scikit-learn


Classifiers are just objects that can be pickled and dumped like any other. To continue your example:

import cPickle# save the classifierwith open('my_dumped_classifier.pkl', 'wb') as fid:    cPickle.dump(gnb, fid)    # load it againwith open('my_dumped_classifier.pkl', 'rb') as fid:    gnb_loaded = cPickle.load(fid)

Edit: if you are using a sklearn Pipeline in which you have custom transformers that cannot be serialized by pickle (nor by joblib), then using Neuraxle's custom ML Pipeline saving is a solution where you can define your own custom step savers on a per-step basis. The savers are called for each step if defined upon saving, and otherwise joblib is used as default for steps without a saver.


You can also use joblib.dump and joblib.load which is much more efficient at handling numerical arrays than the default python pickler.

Joblib is included in scikit-learn:

>>> import joblib>>> from sklearn.datasets import load_digits>>> from sklearn.linear_model import SGDClassifier>>> digits = load_digits()>>> clf = SGDClassifier().fit(digits.data, digits.target)>>> clf.score(digits.data, digits.target)  # evaluate training error0.9526989426822482>>> filename = '/tmp/digits_classifier.joblib.pkl'>>> _ = joblib.dump(clf, filename, compress=9)>>> clf2 = joblib.load(filename)>>> clf2SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,       fit_intercept=True, learning_rate='optimal', loss='hinge', n_iter=5,       n_jobs=1, penalty='l2', power_t=0.5, rho=0.85, seed=0,       shuffle=False, verbose=0, warm_start=False)>>> clf2.score(digits.data, digits.target)0.9526989426822482

Edit: in Python 3.8+ it's now possible to use pickle for efficient pickling of object with large numerical arrays as attributes if you use pickle protocol 5 (which is not the default).


What you are looking for is called Model persistence in sklearn words and it is documented in introduction and in model persistence sections.

So you have initialized your classifier and trained it for a long time with

clf = some.classifier()clf.fit(X, y)

After this you have two options:

1) Using Pickle

import pickle# now you can save it to a filewith open('filename.pkl', 'wb') as f:    pickle.dump(clf, f)# and later you can load itwith open('filename.pkl', 'rb') as f:    clf = pickle.load(f)

2) Using Joblib

from sklearn.externals import joblib# now you can save it to a filejoblib.dump(clf, 'filename.pkl') # and later you can load itclf = joblib.load('filename.pkl')

One more time it is helpful to read the above-mentioned links