Présentation de la recherche par grille

Ajustement des hyperparamètres en Python

Alex Scriven

Data Scientist

Automatiser 2 hyperparamètres

Votre travail précédent :

neighbors_list = [3,5,10,20,50,75]
accuracy_list = []
for test_number in neighbors_list:
    model = KNeighborsClassifier(n_neighbors=test_number)
    predictions = model.fit(X_train, y_train).predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    accuracy_list.append(accuracy)

Puis nous avons tout rassemblé dans un dataframe pour analyser.

Ajustement des hyperparamètres en Python

Automatiser 2 hyperparamètres

 

Et si on testait les valeurs de 2 hyperparamètres ?

Avec un algorithme GBM :

  • learn_rate [0.001, 0.01, 0.05]
  • max_depth [4,6,8,10]

On peut utiliser une boucle for (imbriquée) !

Ajustement des hyperparamètres en Python

Automatiser 2 hyperparamètres

D'abord, une fonction de création de modèle :

def gbm_grid_search(learn_rate, max_depth):
    model = GradientBoostingClassifier(
            learning_rate=learn_rate,
            max_depth=max_depth)

predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Ajustement des hyperparamètres en Python

Automatiser 2 hyperparamètres

 

Maintenant, parcourons nos listes d'hyperparamètres et appelons la fonction :

results_list = []

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        results_list.append(gbm_grid_search(learn_rate,max_depth))

Ajustement des hyperparamètres en Python

Automatiser 2 hyperparamètres

 

On peut aussi mettre ces résultats dans un DataFrame et l'afficher :

results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

tableau des résultats

Ajustement des hyperparamètres en Python

Combien de modèles ?

 

En ajoutant des hyperparamètres et des valeurs, on construit bien plus de modèles.

  • La relation n'est pas linéaire, elle est exponentielle
  • Une valeur de plus n'est pas _qu'_un seul modèle
  • 5 pour Hyperparamètre 1 et 10 pour Hyperparamètre 2, c'est 50 modèles !

Et la validation croisée ?

  • Une validation croisée à 10 plis donnerait 50x10 = 500 modèles !
Ajustement des hyperparamètres en Python

De 2 à N hyperparamètres

 

Et si on ajoutait plus d'hyperparamètres ?

On pourrait imbriquer nos boucles !

# Ajuster la liste des valeurs à tester
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
Ajustement des hyperparamètres en Python

De 2 à N hyperparamètres

Ajuster notre fonction :

def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
    model = GradientBoostingClassifier(
        learning_rate=learn_rate, 
        max_depth=max_depth,
        subsample=subsample,
        max_features=max_features)
    predictions = model.fit(X_train, y_train).predict(X_test)
    return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Ajustement des hyperparamètres en Python

De 2 à N hyperparamètres

Ajuster notre boucle for (imbriquée) :

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        for subsample in subsample_list:
            for max_features in max_features_list:
                results_list.append(gbm_grid_search(learn_rate,max_depth,
                                     subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
                         'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
Ajustement des hyperparamètres en Python

De 2 à N hyperparamètres

 

Combien de modèles maintenant ?

  • 7x9x5x2 = 630 (6 300 avec validation croisée !)

On ne peut pas imbriquer à l'infini !

De plus, si on voulait :

  • Détails sur les temps d'entraînement et les scores
  • Détails sur les scores de validation croisée
Ajustement des hyperparamètres en Python

Présentation de la recherche par grille

Créons une grille :

  • À gauche, toutes les valeurs de max_depth
  • En haut, toutes les valeurs de learning_rate

Tableau des combinaisons d'hyperparamètres

Ajustement des hyperparamètres en Python

Présentation de la recherche par grille

Parcourir chaque cellule de la grille :

tableau des combinaisons d'hyperparamètres

(4,0.001) revient à créer un estimateur ainsi :

GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
Ajustement des hyperparamètres en Python

Recherche par grille : pour et contre

 

Quelques avantages de cette approche :

Avantages :

  • Vous n'avez pas à écrire des milliers de lignes de code
  • Trouve le meilleur modèle dans la grille (note spéciale ici !)
  • Facile à expliquer
Ajustement des hyperparamètres en Python

Recherche par grille : pour et contre

 

Quelques inconvénients de cette approche :

  • Coûteuse en calcul ! Rappelez-vous à quelle vitesse nous avons créé 6 000+ modèles.
  • Elle est « non informée ». Les résultats d'un modèle n'aident pas à créer le suivant.

 

Nous verrons plus tard des méthodes « informées » !

Ajustement des hyperparamètres en Python

Passons à la pratique !

Ajustement des hyperparamètres en Python

Preparing Video For Download...