Recherche aléatoire dans Scikit Learn

Ajustement des hyperparamètres en Python

Alex Scriven

Data Scientist

Comparaison avec GridSearchCV

 

Inutile de réinventer la roue. Rappelons les étapes d'une recherche par grille :

  1. Choisir un algorithme/estimateur
  2. Définir les hyperparamètres à ajuster
  3. Définir un éventail de valeurs pour chaque hyperparamètre
  4. Définir un schéma de validation croisée ; et
  5. Définir une fonction de pointage
  6. Inclure des infos ou fonctions utiles en plus
Ajustement des hyperparamètres en Python

Comparaison avec la recherche par grille

   

Il n'y a qu'une seule différence :

  • Étape 7 = Décider combien d'échantillons prendre (puis échantillonner)

 

C'est tout ! (ou presque)

Ajustement des hyperparamètres en Python

Comparer les modules Scikit Learn

Les modules sont semblables aussi :

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')

 

RandomizedSearchCV :

sklearn.model_selection.RandomizedSearchCV(estimator, 
        param_distributions, n_iter=10, 
        scoring=None, fit_params=None, 
        n_jobs=None, refit=True, 
        cv='warn', verbose=0, 
        pre_dispatch='2*n_jobs',
        random_state=None, 
        error_score='raise-deprecating', 
        return_train_score='warn')
Ajustement des hyperparamètres en Python

Différences clés

 

Deux différences clés :

  • n_iter, soit le nombre d'échantillons que la recherche aléatoire prélève dans votre grille. Dans l'exemple précédent, vous en avez pris 300.

  • param_distributions diffère légèrement de param_grid et permet de définir au besoin une distribution d'échantillonnage.

    • Par défaut, toutes les combinaisons ont la même probabilité d'être choisies.
Ajustement des hyperparamètres en Python

Créer un objet RandomizedSearchCV

Nous pouvons maintenant créer un objet de recherche aléatoire comme pour la recherche par grille, avec un petit changement :

# Définir l'espace d'échantillonnage
learn_rate_list = np.linspace(0.001,2,150)
min_samples_leaf_list = list(range(1,51))

# Créer la grille
parameter_grid = {
    'learning_rate' : learn_rate_list,
    'min_samples_leaf' : min_samples_leaf_list}

# Définir le nombre d'échantillons number_models = 10
Ajustement des hyperparamètres en Python

Créer un objet RandomizedSearchCV

Nous pouvons maintenant construire l'objet :

# Créer un objet de recherche aléatoire
random_GBM_class = RandomizedSearchCV(
    estimator = GradientBoostingClassifier(),
    param_distributions = parameter_grid,
    n_iter = number_models,
    scoring='accuracy',
    n_jobs=4, 
    cv = 10,
    refit=True, 
    return_train_score = True)
# Ajuster l'objet à nos données
random_GBM_class.fit(X_train, y_train)
Ajustement des hyperparamètres en Python

Analyser la sortie

La sortie est identique !

Comment voir les valeurs d'hyperparamètres choisies ?

Le dictionnaire cv_results_ (dans les colonnes param_ correspondantes) !

Extraire les listes :

rand_x = list(random_GBM_class.cv_results_['param_learning_rate'])
rand_y = list(random_GBM_class.cv_results_['param_min_samples_leaf'])
Ajustement des hyperparamètres en Python

Analyser la sortie

Construire notre visualisation :

# S'assurer de bien fixer les limites en X et Y
x_lims = [np.min(learn_rate_list), np.max(learn_rate_list)]
y_lims = [np.min(min_samples_leaf_list), np.max(min_samples_leaf_list)]

# Tracer les résultats de la grille plt.scatter(rand_y, rand_x, c=['blue']*10) plt.gca().set(xlabel='learn_rate', ylabel='min_samples_leaf', title='Random Search Hyperparameters') plt.show()
Ajustement des hyperparamètres en Python

Analyser la sortie

Un graphique semblable à tout à l'heure :

couverture du graphique aléatoire

Ajustement des hyperparamètres en Python

Passons à la pratique !

Ajustement des hyperparamètres en Python

Preparing Video For Download...