La persistance des modèles de Machine Learning

L’entraînement des modèles de Machine est souvent une tâche lourde et surtout extrêmement chronophage. Il s’agit donc d’un travail qui doit pouvoir être sérialisé quelque part afin que les programmes l’utilisant n’ait plus à ré-effectuer cette longue opération. C’est ce que l’on appelle la persistance, et les frameworks tels que Scikit-Learn, XGBoost ainsi que les autres prévoient bien sur ce type d’opération.

Avec Scikit-Learn

Si vous utilisez Scikit-Learn, rien n’est plus simple. il vous faudra utiliser les méthodes dump et load et le tour sera joué. Suivez le guide…

Tout d’abord nous allons entraîner un modèle simple (une bonne vieille régression linéaire) :

import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
data = pd.read_csv("./data/univariate_linear_regression_dataset.csv")
plt.scatter (data.col2, data.col1)
X = data.col2.values.reshape(-1, 1)
y = data.col1.values.reshape(-1, 1)
regr = linear_model.LinearRegression()
regr.fit(X, y)

Ensuite nous allons tester notre modèle ainsi entraîné avec la méthode fit()

regr.predict([[30]])

On obtient une prévision de 22.37707681

Faisons maintenant un dump de notre modèle. Nous allons ainsi le sauvegarder dans un fichier (ici monpremiermodele.modele) :

from joblib import dump, load
dump(regr, 'monpremiermodele.modele') 

Le modèle entrainé est ainsi sauvegardé dans un fichier binaire. On peut maintenant imaginer éteindre notre ordinateur, et le rallumer par exemple. Nous allons réactiver notre modèle via la méthode load() combinée avec le fichier précédemment sauvegardé sur disque :

regr2 = load('monpremiermodele.modele')
regr2.predict([[30]])

Si on re-teste la prédiction avec la même valeur que juste après l’entraînement on obtient – non pas par magie – exactement le même résultat.

Comme d’habitude vous trouverez le code intégral sur Github.

Avec XGBoost

Nous l’avons déjà vu dans l’article traitant XGBoost, mais voici un petit récapitulatif. La librairie XBoost (en mode standalone) inclu bien sur la possibilité de sauvegarder et recharger un modèle:

boost._Booster.save_model('titanic.modele')

Chargement d’un modèle sauvegardé :

boost = xgb.Booster({'nthread': 4}) boost.load_model('titanic.modele')

Vous remarquerez que si les principes de sauvegarde et chargement sont les mêmes, les noms des méthodes diffèrent, attention donc !

Avec CatBoost

Nous n’avons pas évoqué cet aspect là dans l’article qui présentait l’algorithme CatBoost. Nous allons remédiez à cette lacune d’autant qu’évidemment nous procéderons encore d’une manière différente (enfin sur quelques détails …).

Pour sauvegarder un modèle Catboost:

cb.CatBoost.save_model(clf, 
                       "catboost.modele", 
                       format="cbm", 
                       export_parameters=None, 
                       pool=None)

vous remarquez que nous avons beaucoup plus de paramètres et donc de possibilités pour sauvegarder le modèle (format, export des paramètres, données d’entrainement, etc.). N’hésitez pas à consulter la documentation pour voir le descriptif de ces paramètres.

Et pour recharger un modèle existant (à partir du fichier) :

from catboost import CatBoostClassifier
clf2 = CatBoostClassifier()
clf2.load_model(fname="catboost.modele", format="cbm")

La nuance ici c’est que c’est l’objet modèle (clf2) qui appelle la méthode load_model() et non l’objet CatBoost.

Et voilà maintenant vous allez pouvoir préparer vos modèles pour pouvoir les réutiliser directement (c’est à dire sans entraînement) à partir de vos programmes ou API.

Partager cet article

One Reply to “La persistance des modèles de Machine Learning”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.