web-dev-qa-db-fra.com

Python scikit-learn: exportation d'un classificateur formé

J'utilise un DBN (réseau de croyances profondes) de nolearn basé sur scikit-learn.

J'ai déjà construit un réseau qui peut très bien classer mes données, maintenant je suis intéressé à exporter le modèle pour le déploiement, mais je ne sais pas comment (je forme le DBN chaque fois que je veux prédire quelque chose). Dans matlab je voudrais juste exporter la matrice de poids et l'importer dans une autre machine.

Est-ce que quelqu'un sait comment exporter le modèle/la matrice de poids à importer sans avoir besoin de former à nouveau le modèle entier?

42
jcdmb

Vous pouvez utiliser:

>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'my_model.pkl', compress=9)

Et puis plus tard, sur le serveur de prédiction:

>>> from sklearn.externals import joblib
>>> model_clone = joblib.load('my_model.pkl')

Il s'agit essentiellement d'un Python pickle avec une gestion optimisée pour les grands tableaux numpy. Il a les mêmes limitations que le changement de code wrt wrle normal: si la structure de classe de l'objet pickle change, vous pourriez ne plus être en mesure de décaper l'objet avec de nouvelles versions de nolearn ou scikit-learn.

Si vous voulez un moyen robuste à long terme de stocker vos paramètres de modèle, vous devrez peut-être écrire votre propre couche IO (par exemple en utilisant des outils de sérialisation au format binaire tels que les tampons de protocole ou avro ou un texte inefficace mais portable) Représentation/json/xml telle que PMML ).

61
ogrisel

Le pickling/unpickling a l'inconvénient de ne fonctionner qu'avec les versions python (versions majeures et éventuellement mineures) correspondantes et sklearn, versions de la bibliothèque joblib).

Il existe d'autres formats de sortie descriptifs pour les modèles d'apprentissage automatique, tels que développés par le Data Mining Group , tels que le langage de balisage des modèles prédictifs (PMML) et le format portable pour l'analyse (PFA). Des deux, PMML est beaucoup mieux pris en charge .

Vous avez donc la possibilité d'enregistrer un modèle de scikit-learn dans PMML (par exemple en utilisant sklearn2pmml ), puis de le déployer et de l'exécuter dans Java, spark ou Hive en utilisant jpmml = (bien sûr, vous avez plus de choix).

9
ben26941

La section .4. Persistance du modèle dans la documentation de scikit-learn couvre à peu près tout.

En plus de sklearn.externals.joblib ogrisel a souligné, il montre comment utiliser le paquet de cornichons ordinaire:

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf.fit(X, y)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0])
array([0])
>>> y[0]
0

et donne quelques avertissements tels que les modèles enregistrés dans une version de scikit-learn peuvent ne pas se charger dans une autre version.

3
Franck Dernoncourt