Cet article détaillera les méthodes d'optimisation d'hyperparamètres les plus courantes utilisées pour améliorer les résultats de l'apprentissage automatique.
Traducteur | Zhu Xianzhong
Réviseur | Sun Shujuan
Habituellement, lorsqu'on essaie d'améliorer un modèle d'apprentissage automatique, la première solution à laquelle les gens pensent est d'ajouter plus de données de formation. Des données supplémentaires sont souvent utiles (sauf dans certaines circonstances), mais générer des données de haute qualité peut s’avérer très coûteux. L'optimisation des hyperparamètres nous fait gagner du temps et des ressources en utilisant les données existantes pour obtenir les meilleures performances du modèle.
Comme son nom l'indique, l'optimisation des hyperparamètres est le processus de détermination de la meilleure combinaison d'hyperparamètres pour un modèle d'apprentissage automatique afin de satisfaire la fonction d'optimisation (c'est-à-dire maximiser les performances du modèle compte tenu de l'ensemble de données étudié). En d'autres termes, chaque modèle fournit plusieurs « boutons » de réglage d'options que nous pouvons modifier jusqu'à ce que nous obtenions une combinaison optimale d'hyperparamètres pour notre modèle. Quelques exemples de paramètres que nous pouvons modifier lors de l'optimisation des hyperparamètres peuvent être le taux d'apprentissage, l'architecture du réseau neuronal (par exemple, le nombre de couches cachées), la régularisation, etc.
Dans cet article, nous présenterons conceptuellement les trois méthodes d'optimisation d'hyperparamètres les plus courantes, à savoir la recherche par grille, la recherche aléatoire et l'optimisation bayésienne, puis les implémenterons une par une.
Je fournirai un tableau de comparaison de haut niveau au début de l'article pour référence du lecteur, puis j'explorerai, expliquerai et mettrai en œuvre plus en détail chaque élément du tableau de comparaison dans le reste de l'article.
Tableau 1 : Comparaison des méthodes d'optimisation des hyperparamètres
La recherche par grille est probablement la méthode la plus simple et la plus intuitive pour l'optimisation des hyperparamètres, qui implique une recherche dans un espace de recherche défini. la meilleure combinaison d'hyperparamètres. L'« espace de recherche » dans ce contexte correspond à l'ensemble des hyperparamètres et aux valeurs de ces hyperparamètres pris en compte lors de l'optimisation. Comprenons mieux la recherche par grille avec un exemple.
Supposons que nous ayons un modèle d'apprentissage automatique avec seulement trois paramètres. Chaque paramètre peut prendre la valeur fournie dans le tableau :
paramètre_1 = [1, 2, 3]
paramètre_2 = [a, b, c ]
paramètre_3 = [x, y, z]
Nous ne savons pas quelle combinaison de ces paramètres optimisera la fonction d'optimisation de notre modèle (c'est-à-dire fournira le meilleur résultat pour notre modèle d'apprentissage automatique). Dans la recherche par grille, nous essayons simplement chaque combinaison de ces paramètres, mesurons les performances du modèle pour chaque paramètre et choisissons simplement la combinaison qui donne les meilleures performances ! Dans cet exemple, le paramètre 1 peut prendre 3 valeurs (c'est-à-dire 1, 2 ou 3), le paramètre 2 peut prendre 3 valeurs (c'est-à-dire a, b et c) et le paramètre 3 peut prendre 3 valeurs. (c'est-à-dire x, y et z). En d’autres termes, il y a 3*3*3=27 combinaisons au total. La recherche de grille dans cet exemple impliquera 27 cycles d'évaluation des performances du modèle d'apprentissage automatique pour trouver la combinaison la plus performante.
Comme vous pouvez le constater, cette méthode est très simple (semblable à une tâche d'essais et d'erreurs), mais elle présente également certaines limites. Résumons les avantages et les inconvénients de cette méthode.
Parmi eux, les avantages incluent :
Afin d'implémenter la recherche par grille, nous utiliserons l'ensemble de données Iris dans scikit-learn pour créer un modèle de classification aléatoire des forêts. Cet ensemble de données comprend 3 longueurs différentes de pétales et de sépales d'iris et sera utilisé pour cet exercice de classification. Dans cet article, le développement de modèles est secondaire car l'objectif est de comparer les performances de diverses stratégies d'optimisation d'hyperparamètres. Je vous encourage à vous concentrer sur les résultats de l'évaluation du modèle et sur le temps requis pour chaque méthode d'optimisation des hyperparamètres pour atteindre l'ensemble d'hyperparamètres sélectionné. Je décrirai les résultats de l'exécution, puis fournirai un tableau de comparaison récapitulatif pour les trois méthodes utilisées dans cet article.
L'espace de recherche incluant toutes les valeurs d'hyperparamètres est défini comme suit :
search_space = {'n_estimators' : [10, 100, 500, 1000],
'max_degree' : [2, 10, 25, 50, 100],
'min_samples_split' : [2, 5, 10],
'min_samples_leaf' : [1, 5, 10]}
L'espace de recherche ci-dessus se compose de 4*5*3*3= 180 hyperparamètres de la combinaison totale. Nous utiliserons la recherche par grille pour trouver la combinaison qui optimise la fonction objectif comme suit :
# Importer des bibliothèques
depuis sklearn.model_selection import GridSearchCV
depuis sklearn.datasets import load_iris
depuis sklearn.ensemble import RandomForestClassifier
depuis sklearn.model_selection import cross_val_score
temps d'importation
# Charger l'ensemble de données Iris
iris = load_iris()
X, y = iris.data, iris.target
#Définir l'espace de recherche des hyperparamètres
search_space = {'n_estimators' : [10, 100, 500, 1000],
'max_degree' : [2 , 10, 25, 50, 100],
'min_samples_split' : [2, 5, 10],
'min_samples_leaf' : [1, 5, 10]}
#Définir un classificateur de forêt aléatoire
clf = RandomForestClassifier (random_state=1234)
# Générer un objet optimiseur
optimizer = GridSearchCV(clf, search_space, cv=5, scoring='accuracy')
#Stocker l'heure de démarrage afin qu'elle puisse être utilisée pour calculer la consommation totale Temps
start_time = time.time()
# Optimiseur sur l'ajustement des données
optimizer.fit(X, y)
# Stocke l'heure de fin afin qu'elle puisse être utilisée pour calculer la durée totale
end_time = time .time ()
# Imprime l'ensemble d'hyperparamètres optimaux et le score correspondant
print(f"hyperparameters sélectionnés:")
print(optimizer.best_params_)
print("")
print(f"best_score: {optimizer. best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1)}")
Le résultat du code ci-dessus est le suivant :
Ici, nous pouvons voir l'utilisation de la recherche de grille réseau sélectionne les valeurs d'hyperparamètres. Parmi eux, best_score décrit les résultats de l'évaluation à l'aide de l'ensemble d'hyperparamètres sélectionné, et elapsed_time décrit le temps qu'il a fallu à mon ordinateur portable local pour exécuter cette stratégie d'optimisation d'hyperparamètres. Lorsque vous passez à la méthode suivante, gardez à l’esprit les résultats de l’évaluation et le temps écoulé à des fins de comparaison. Passons maintenant à la discussion sur la recherche aléatoire.
Comme son nom l'indique, la recherche aléatoire est le processus d'échantillonnage aléatoire d'hyperparamètres à partir d'un espace de recherche défini. Contrairement à la recherche par grille, la recherche aléatoire sélectionne uniquement un sous-ensemble aléatoire de valeurs d'hyperparamètres pour un nombre prédéfini d'itérations (en fonction des ressources disponibles telles que le temps, le budget, les objectifs, etc.) et calcule le modèle d'apprentissage automatique pour chaque performance d'hyperparamètre, et puis choisissez les meilleures valeurs d'hyperparamètres.
Sur la base de l'approche ci-dessus, vous pouvez imaginer que la recherche aléatoire est moins coûteuse qu'une recherche sur grille complète, mais présente néanmoins ses propres avantages et inconvénients, comme suit :
Avantages :
Dans la méthode suivante, nous résoudrons la grille et l'inconvénient "sans mémoire" de la recherche aléatoire. Mais avant de discuter de cette méthode, implémentons la recherche aléatoire.
À l'aide de l'extrait de code ci-dessous, nous implémenterons l'optimisation des hyperparamètres de recherche aléatoire pour le même problème décrit dans l'implémentation de la recherche par grille.
# Importer la bibliothèque
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
# Créer un objet RandomizedSearchCV
optimizer = RandomizedSearchCV(clf, param_distributinotallow=search_space,
n_iter=50, cv= 5, scoring='accuracy',
random_state=1234)
# Stockez l'heure de début pour calculer la durée totale d'exécution
start_time = time.time()
# Ajustez l'optimiseur sur les données
optimizer . fit(X, y)
# Stocke l'heure de fin pour calculer la durée totale d'exécution
end_time = time.time()
# Imprime le meilleur ensemble d'hyperparamètres et le score correspondant
print(f"hyperparamètres sélectionnés :" )
print(optimizer.best_params_)
print("")
print(f"best_score: {optimizer.best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1) }" )
Le résultat du code ci-dessus est le suivant :
Résultats de recherche aléatoire
Ces résultats sont très intéressants par rapport aux résultats de la recherche par grille. best_score reste le même, mais elapsed_time diminue de 352,0 secondes à 75,5 secondes ! Comme c’est impressionnant ! En d’autres termes, l’algorithme de recherche aléatoire a réussi à trouver un ensemble d’hyperparamètres qui ont effectué la même performance que la recherche sur grille en environ 21 % du temps requis par la recherche sur grille ! Cependant, l’efficacité ici est bien supérieure.
Ensuite, passons à notre méthode suivante, appelée optimisation bayésienne, qui apprend de chaque tentative du processus d'optimisation.
L'optimisation bayésienne est une méthode d'optimisation d'hyperparamètres qui utilise un modèle probabiliste pour « apprendre » des tentatives précédentes et diriger la recherche vers la meilleure combinaison d'hyperparamètres dans l'espace de recherche, optimisant ainsi la fonction objective de l'apprentissage automatique. modèle.
La méthode d'optimisation bayésienne peut être divisée en 4 étapes, que je décrirai ci-dessous. Je vous encourage à lire ces étapes pour mieux comprendre le processus, mais aucune connaissance préalable n'est requise pour utiliser cette méthode.
Si vous souhaitez en savoir plus sur l'optimisation bayésienne, vous pouvez consulter l'article suivant :
"Algorithme d'optimisation bayésien dans l'apprentissage automatique", l'adresse est :
https://medium.com/@fmnobar/conceptual-overview-of-bayesian-optimization-for-parameter-tuning-in -machine-learning-a3b1b4b9339f .
Maintenant que nous comprenons le fonctionnement de l'optimisation bayésienne, examinons ses avantages et ses inconvénients.
Avantages :
Une fois les détails réglés, implémentons l'optimisation bayésienne et voyons les résultats.
Semblable à la section précédente, nous utiliserons l'extrait de code suivant pour implémenter l'optimisation des hyperparamètres bayésiens pour le même problème décrit dans l'implémentation de la recherche de grille.
# Importer une bibliothèque
à partir de skopt import BayesSearchCV
# Effectuer une optimisation bayésienne
optimizer = BayesSearchCV(estimator=RandomForestClassifier(),
search_spaces=search_space,
n_iter=10,
cv=5 ,
scoring='accuracy',
random_state=1234)
# Stockez l'heure de début pour calculer la durée totale d'exécution
start_time = time.time()
optimizer.fit(X, y)
# Stocker l'heure de fin pour calculer la durée totale d'exécution
end_time = time.time()
# Imprimer le meilleur ensemble d'hyperparamètres et le score correspondant
print(f"hyperparameters sélectionnés :")
print(optimizer.best_params_ )
print("")
print(f"best_score: {optimizer.best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1)}")
La sortie du code ci-dessus Comme suit :
Résultats de l'optimisation bayésienne
Un autre ensemble de résultats intéressants ! Le best_score est cohérent avec les résultats que nous avons obtenus avec la recherche par grille et aléatoire, mais le résultat n'a pris que 23,1 secondes contre 75,5 secondes pour la recherche aléatoire et 352,0 secondes pour la recherche par grille ! En d’autres termes, l’utilisation de l’optimisation bayésienne prend environ 93 % de temps en moins que la recherche sur grille. Il s’agit d’un énorme gain de productivité qui devient plus significatif dans des modèles et des espaces de recherche plus grands et plus complexes.
Notez que l'optimisation bayésienne n'a utilisé que 10 itérations pour obtenir ces résultats car elle peut apprendre des itérations précédentes (par opposition à la recherche aléatoire et à la grille).
Le tableau ci-dessous compare les résultats des trois méthodes discutées jusqu'à présent. La colonne « Méthodologie » décrit la méthode d'optimisation des hyperparamètres utilisée. Viennent ensuite les hyperparamètres sélectionnés à l’aide de chaque méthode. Le « Meilleur score » est le score obtenu à l'aide d'une méthode spécifique, puis le « Temps écoulé » représente le temps qu'il a fallu pour que la stratégie d'optimisation s'exécute sur mon ordinateur portable local. La dernière colonne, Efficacité gagnée, prend la recherche par grille comme référence, puis calcule l'efficacité gagnée par chacune des deux autres méthodes par rapport à la recherche par grille (en utilisant le temps écoulé). Par exemple, étant donné que la recherche aléatoire prend 75,5 secondes et la recherche par grille 352,0 secondes, l'efficacité de la recherche aléatoire par rapport à la référence de recherche par grille est calculée comme étant de 1 à 75,5/352,0 = 78,5 %.
Tableau 2 - Tableau de comparaison des performances des méthodes
Deux conclusions principales du tableau de comparaison ci-dessus :
Dans cet article, nous avons discuté de ce qu'est l'optimisation des hyperparamètres et présenté les trois méthodes les plus couramment utilisées pour cet exercice d'optimisation. Nous présentons ensuite chacune de ces trois méthodes en détail et les mettons en œuvre dans un exercice de classification. Enfin, nous comparons les résultats de la mise en œuvre des trois méthodes. Nous constatons que des méthodes telles que l'optimisation bayésienne apprises lors de tentatives précédentes peuvent améliorer considérablement l'efficacité, ce qui peut être un facteur important dans les grands modèles complexes tels que les réseaux neuronaux profonds, où l'efficacité peut être un facteur déterminant.
Zhu Xianzhong, rédacteur en chef de la communauté 51CTO, blogueur expert 51CTO, conférencier, professeur d'informatique dans une université de Weifang et vétéran de l'industrie de la programmation indépendante.
Titre original : Optimisation des hyperparamètres — Introduction et implémentation de la recherche en grille, de la recherche aléatoire et de l'optimisation bayésienne, auteur : Farzad Mahmoodinobar
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!