Recherche par grille avec Scikit Learn

Optimisation des hyperparamètres en Python

Alex Scriven

Data Scientist

Objet GridSearchCV

 

Présentation d'un objet GridSearchCV :

sklearn.model_selection.GridSearchCV(
    estimator,
    param_grid, scoring=None, fit_params=None,
    n_jobs=None, refit=True, cv='warn',
    verbose=0, pre_dispatch='2*n_jobs',
    error_score='raise-deprecating',
    return_train_score='warn')
Optimisation des hyperparamètres en Python

Étapes d'une recherche par grille

 

Étapes d'une recherche par grille :

  1. Un algorithme dont on règle les hyperparamètres (souvent appelé « estimateur »)
  2. Définir quels hyperparamètres seront ajustés
  3. Définir un éventail de valeurs pour chaque hyperparamètre
  4. Choisir un schéma de validation croisée ; et
  5. Définir une fonction de score pour choisir la meilleure case de la grille
  6. Inclure des infos ou fonctions utiles en plus
Optimisation des hyperparamètres en Python

Entrées d'un objet GridSearchCV

Les entrées importantes sont :

  • estimator
  • param_grid
  • cv
  • scoring
  • refit
  • n_jobs
  • return_train_score
Optimisation des hyperparamètres en Python

GridSearchCV « estimator »

 

L'entrée estimator :

  • C'est essentiellement notre algorithme
  • Vous avez déjà utilisé KNN, Random Forest, GBM, Régression logistique

 

À retenir :

  • Un seul estimateur par objet GridSearchCV
Optimisation des hyperparamètres en Python

GridSearchCV « param_grid »

L'entrée param_grid :

  • Définit quels hyperparamètres et quelles valeurs tester

Plutôt qu'une liste :

max_depth_list = [2, 4, 6, 8]
min_samples_leaf_list = [1, 2, 4, 6]

On écrira plutôt :

param_grid = {'max_depth': [2, 4, 6, 8],
              'min_samples_leaf': [1, 2, 4, 6]}
Optimisation des hyperparamètres en Python

GridSearchCV « param_grid »

L'entrée param_grid :

À retenir : les clés du dictionnaire param_grid doivent être des hyperparamètres valides.

Par exemple, pour un estimateur de régression logistique :

# Incorrect
param_grid = {'C': [0.1,0.2,0.5],
              'best_choice': [10,20,50]}
ValueError: Invalid parameter best_choice for estimator LogisticRegression
Optimisation des hyperparamètres en Python

GridSearchCV « cv »

L'entrée cv :

  • Choix de la méthode de validation croisée
  • Une valeur entière applique une validation croisée en k plis ; 5 ou 10 est courant

k-fold wikipedia

Optimisation des hyperparamètres en Python

GridSearchCV « scoring »

 

L'entrée scoring :

  • Quel score utiliser pour choisir la meilleure case (modèle)
  • Utilisez le vôtre ou le module metrics de Scikit Learn

Pour lister les fonctions de score intégrées :

from sklearn import metrics
sorted(metrics.SCORERS.keys())
Optimisation des hyperparamètres en Python

GridSearchCV « refit »

 

L'entrée refit :

  • Ajuste les meilleurs hyperparamètres sur les données d'entraînement
  • Permet d'utiliser l'objet GridSearchCV comme estimateur (pour la prédiction)
  • Très pratique !
Optimisation des hyperparamètres en Python

GridSearchCV « n_jobs »

L'entrée n_jobs :

  • Aide à l'exécution en parallèle
  • Permet d'entraîner plusieurs modèles en même temps, plutôt que séquentiellement

Code pratique :

import os
print(os.cpu_count())

Attention à ne pas utiliser tous vos cœurs si vous faites autre chose en parallèle !

Optimisation des hyperparamètres en Python

GridSearchCV « return_train_score »

 

L'entrée return_train_score :

  • Enregistre des statistiques sur les entraînements effectués
  • Utile pour analyser le compromis biais–variance, mais plus coûteux
  • N'aide pas à choisir le meilleur modèle ; sert à l'analyse uniquement
Optimisation des hyperparamètres en Python

Créer un objet GridSearchCV

 

Construire notre propre objet GridSearchCV :

# Create the grid
param_grid = {'max_depth': [2, 4, 6, 8], 'min_samples_leaf': [1, 2, 4, 6]}

#Get a base classifier with some set parameters. rf_class = RandomForestClassifier(criterion='entropy', max_features='auto')
Optimisation des hyperparamètres en Python

Créer un objet GridSearchCv

 

Assembler les éléments :

grid_rf_class = GridSearchCV(
    estimator = rf_class,
    param_grid = parameter_grid,
    scoring='accuracy',
    n_jobs=4,
    cv = 10,
    refit=True,
    return_train_score=True)
Optimisation des hyperparamètres en Python

Utiliser un objet GridSearchCV

 

Comme refit est défini à True, on peut utiliser l'objet directement :

#Fit the object to our data
grid_rf_class.fit(X_train, y_train)

# Make predictions
grid_rf_class.predict(X_test)
Optimisation des hyperparamètres en Python

Passons à la pratique !

Optimisation des hyperparamètres en Python

Preparing Video For Download...