Tuning des hyper-paramètres de Machine Learning

Les hyper-paramètres  !

Votre modèle de Machine Learning est prêt. Vous avez bien ajusté les caractéristiques afin de bien coller aux besoins métier et surtout vous les avez affinés afin qu’ils soient mieux pris en compte par l’algorithme de votre choix. Malheureusement, votre travail de DataScientiste n’est pas terminé et après la casquette métier vous allez devoir enfiler celle du statisticien. C’est en effet dans cette phase d’optimisation que vous allez devoir ajuster l’exécution de l’algorithme de votre choix. En bref, vous aller devoir choisir les hyper-paramètres  qui vous donnerons le meilleur résultat.

Ne vous y trompez pas, ce choix est loin d’être anodin et aura de grandes conséquences sur les prédictions ultérieures.

Mais qu’est-ce que les hyper-paramètres  ?

Les hyper-paramètres  sont en fait les paramètres d’ajustements des différents algorithmes de Machine Learning (SVC, Random Forest, Regression, KMeans, etc.). Ils sont évidemment différents selon l’algorithme que vous utilisez.

A titre d’exemple si vous utilisez l’algorithme de classification Gradient Boosting de Scikit-Learn vous aurez un certain nombre d’hyper-paramètres  à définir. Bien entendu un certain nombre sont définis avec des valeurs par défaut mais il va être indispensable de « challenger » ces valeurs 😉

class sklearn.ensemble.GradientBoostingClassifier(
loss=’deviance’,
learning_rate=0.1,
n_estimators=100,
subsample=1.0,
criterion=’friedman_mse’,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_depth=3,
min_impurity_decrease=0.0,
min_impurity_split=None,
init=None,
random_state=None,
max_features=None,
verbose=0,
max_leaf_nodes=None,
warm_start=False,
presort=’auto’)

Évidemment, rien de vaut la documentation officielle pour connaitre l’utilité de tel ou tel hyper-paramètre (learning_rate, n_estimators, etc.). Mais de là à trouver l’ajustement parfait qui vous donnera le meilleur score … c’est une autre affaire.

Tuning des hyper-paramètres

Une première approche consiste à utiliser la recherche par quadrillage(Grid Search). L’idée est plutôt simple en réalité : vous positionnez une liste de possibilités pour chacun des hyper-paramètres et pour chacune des combinaisons vous aller entrainer votre modèle puis calculer son score. A la fin bien sur vous ne conserverez que le meilleur paramétrage.

C’est une technique intéressante et performante mais qui a un très gros inconvénient. Vous allez devoir être patient car votre modèle va devoir être entrainé sur toutes les combinaisons, ce qui peut constituer un grand nombre d’essais. D’un autre coté, vous ne devrez faire cela qu’une seule fois !

Pour faire ces tests vous pouvez coder simplement vous même, ou utiliser la librairie scikit-learn qui founit la fonction GridSearchCV. Prenons maintenant un exemple avec le RandomForest et cherchons les 3 meilleurs hyper-parametres: n_estimators, max_features et random_state.

Pour faire ce « grid-search » avec Scikit-Learn cela il suffit de créer un dictionnaire Python (ici param_grid_rf ) avec les hyper-paramètres a paramétrer et surtout les valeurs que vous voulez tester. Ensuite il suffit d’entrainer la classe GridSearchCV comme n’importe quel autre algorithme (avec la méthode fit).

param_grid_rf = { 'n_estimators' : [800, 1000],
               'max_features' : [1, 0.5, 0.2],
               'random_state' : [3, 4, 5]}
grid_search_rf = GridSearchCV(RandomForestClassifier(), param_grid_rf, cv=5)
grid_search_rf.fit(Xtrain, y)

L’objet grid_search_rf va conserver le bon parametrage et peut directement faire appel à la fonction predict() par exemple. Vous pouvez aussi regarder quel paramétrage a été élu via les propriétés best_params_ et best_estimator_. Bien sur la méthode score vous donne le meilleur score obtenu avec la meilleure combinaison.

print ("Score final : ", round(grid_search_rf.score(Xtrain, y) *100,4), " %")
print ("Meilleurs parametres: ", grid_search_rf.best_params_)
print ("Meilleure config: ", grid_search_rf.best_estimator_)

NB : Une autre alternative (mais qui convient mieux au Deep Learning) est d’utiliser un quadrillage aléatoire via la classe RandomizedSearchCV.

Mode opératoire

Alors bien sur cet outil aussi pratique qu’il soit n’est pas magique et ne pourra se substituer au savoir faire et l’expérience. Pour une raison évidente : vous ne pouvez pas lui passer tous les paramètres possibles! Maintenant si ce dernier ne vous permet pas de trouver d’emblée les bons paramètres (car trop de combinaisons comme cité plus haut) je vous recommande une approche par palier :

  • Prenez tout d’abord les paramètres important (en commençant bien sur par les paramètres obligatoires), ajustez par la suite les paramètres facultatifs.
  • Ayez une approche par dichotomie : prenez tout d’abord des valeurs espacées, puis réduisez l’écart.

Mais surtout … laissez place à votre intuition et votre expérience 😉

Partager cet article

3 Replies to “Tuning des hyper-paramètres 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.