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 BayesSearchCV
Attributs :
Paramètre
Description
estimator
Le modèle à ajuster (par exemple, un classificateur ou un régression). C'est l'objet qui sera optimisé avec les hyperparamètres. search_spaces
Un 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_iter
Le nombre d'itérations pour l'optimisation. Plus ce nombre est élevé, plus la recherche est fine, mais cela prend plus de temps. cv
Le nombre de splits pour la validation croisée. Par défaut, il est défini à 5. scoring
La méthode de scoring à utiliser pour évaluer les performances du modèle. Par défaut, il est défini à None
.n_jobs
Le nombre de processus à utiliser pour la recherche en parallèle. Par défaut, il est défini à 1. verbose
Le niveau de verbosité du processus de recherche. Par défaut, il est défini à 0 (pas de sortie). refit
Si True
, le modèle sera réajusté avec les meilleurs hyperparamètres trouvés. Par défaut, il est défini àTrue
.random_state
Gé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.
C
etgamma
sont recherchés dans des intervalles logarithmiques aveclog-uniform
, etkernel
peut prendre les valeurs'linear'
et'rbf'
.
-
-
Initialisation de BayesSearchCV :
-
Nous initialisons
BayesSearchCV
en 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_state
pour 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-uniform
pour 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.
-