Bayesian Optimization
Fonctions :
-
BayesSearchCV()
La fonction BayesSearchCV() est une recherche d'hyperparamètres basée sur des méthodes bayésiennes d'optimisation. Contrairement à GridSearchCV() et RandomizedSearchCV(), qui effectuent une recherche exhaustive ou aléatoire sur un espace d'hyperparamètres, BayesSearchCV() utilise l'optimisation bayésienne pour trouver les meilleures combinaisons d'hyperparamètres. Cette méthode est plus efficace car elle ajuste de manière plus intelligente les hyperparamètres, en tenant compte des essais précédents pour guider la recherche. Elle est disponible dans le module skopt (scikit-optimize), une bibliothèque externe pour l'optimisation bayésienne.
Importation :
from skopt import BayesSearchCVAttributs :
Paramètre
Description
estimatorLe modèle à ajuster (par exemple, un classificateur ou un régression). C'est l'objet qui sera optimisé avec les hyperparamètres. search_spacesUn dictionnaire définissant les espaces de recherche pour chaque hyperparamètre. Les valeurs peuvent être des intervalles numériques ou des listes d'options discrètes. n_iterLe nombre d'itérations pour l'optimisation. Plus ce nombre est élevé, plus la recherche est fine, mais cela prend plus de temps. cvLe nombre de splits pour la validation croisée. Par défaut, il est défini à 5. scoringLa méthode de scoring à utiliser pour évaluer les performances du modèle. Par défaut, il est défini à None.n_jobsLe nombre de processus à utiliser pour la recherche en parallèle. Par défaut, il est défini à 1. verboseLe niveau de verbosité du processus de recherche. Par défaut, il est défini à 0 (pas de sortie). refitSi True, le modèle sera réajusté avec les meilleurs hyperparamètres trouvés. Par défaut, il est défini àTrue.random_stateGénérateur de nombres aléatoires pour le contrôle des tirages aléatoires dans la recherche. Cela permet de reproduire les résultats. Exemple de code :
from skopt import BayesSearchCV from sklearn.svm import SVC from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # Chargement du jeu de données Iris data = load_iris() X = data.data y = data.target # Division des données en train et test X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # Définition du modèle à optimiser model = SVC() # Définition de l'espace de recherche pour les hyperparamètres search_spaces = { 'C': (1e-6, 1e+6, 'log-uniform'), # Recherche logarithmique pour C 'gamma': (1e-6, 1e+1, 'log-uniform'), # Recherche logarithmique pour gamma 'kernel': ['linear', 'rbf'] # Valeurs possibles pour kernel } # Initialisation de BayesSearchCV bayes_search = BayesSearchCV(estimator=model, search_spaces=search_spaces, n_iter=50, cv=5, verbose=1, random_state=42) # Ajustement du modèle avec la recherche bayésienne bayes_search.fit(X_train, y_train) # Affichage des meilleurs hyperparamètres print(f"Meilleurs hyperparamètres : {bayes_search.best_params_}") # Évaluation du modèle avec les meilleurs paramètres best_model = bayes_search.best_estimator_ accuracy = best_model.score(X_test, y_test) print(f"Précision sur le jeu de test : {accuracy:.4f}")Explication du code :
-
Chargement des données :
-
Le jeu de données Iris est chargé avec
load_iris()et contient des informations sur des fleurs d'iris avec des caractéristiques comme la longueur et la largeur des pétales et des sépales.
-
-
Séparation des données :
-
Les données sont divisées en ensembles d'entraînement et de test à l'aide de
train_test_split(). 70 % des données sont utilisées pour l'entraînement et 30 % pour le test.
-
-
Définition du modèle :
-
Nous choisissons un modèle SVM (
SVC()) pour la classification des fleurs.
-
-
Définition de l'espace de recherche :
-
Nous définissons l'espace de recherche pour les hyperparamètres.
Cetgammasont recherchés dans des intervalles logarithmiques aveclog-uniform, etkernelpeut prendre les valeurs'linear'et'rbf'.
-
-
Initialisation de BayesSearchCV :
-
Nous initialisons
BayesSearchCVen spécifiant le modèleSVC(), l'espace de recherche des hyperparamètres, le nombre d'itérationsn_iter=50, le nombre de splits pour la validation croisée (cv=5), la verbosité pour afficher les informations de progression (verbose=1), et unrandom_statepour assurer la reproductibilité des résultats.
-
-
Ajustement du modèle :
-
bayes_search.fit()ajuste le modèle sur les données d'entraînement, en utilisant l'optimisation bayésienne pour tester différentes combinaisons d'hyperparamètres.
-
-
Affichage des meilleurs paramètres :
-
bayes_search.best_params_renvoie les meilleurs hyperparamètres trouvés pendant l'optimisation.
-
-
Évaluation avec les meilleurs paramètres :
-
Nous utilisons le modèle avec les meilleurs paramètres (
bayes_search.best_estimator_) pour effectuer des prédictions sur le jeu de test et calculer la précision avecscore().
-
Points importants :
-
Optimisation bayésienne : Contrairement à la recherche aléatoire ou exhaustive, l'optimisation bayésienne guide la recherche des hyperparamètres en fonction des performances des combinaisons précédentes. Cela permet de trouver des combinaisons optimales plus rapidement et avec moins d'itérations.
-
Espaces de recherche définis : L'utilisateur définit l'espace de recherche des hyperparamètres sous forme de distributions, permettant une recherche plus sophistiquée qu'avec les méthodes traditionnelles. Par exemple, on peut utiliser
log-uniformpour spécifier que les valeurs doivent être tirées d'un intervalle logarithmique. -
Efficacité : L'optimisation bayésienne est particulièrement efficace lorsque l'espace des hyperparamètres est grand et que chaque évaluation est coûteuse (par exemple, dans le cas de modèles complexes ou de très grands ensembles de données).
Applications courantes :
-
Optimisation d'hyperparamètres : Lorsque vous avez un grand nombre d'hyperparamètres à optimiser et que vous souhaitez gagner du temps tout en obtenant de bonnes performances.
-
Réduction du coût de calcul : Utile pour les situations où l'évaluation du modèle est coûteuse, par exemple pour l'entraînement de modèles sur de grandes quantités de données.
-