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 :

    1. 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.

    2. 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.

    3. Définition du modèle :

      • Nous choisissons un modèle SVM (SVC()) pour la classification des fleurs.

    4. Définition de l'espace de recherche :

      • Nous définissons l'espace de recherche pour les hyperparamètres. C et gamma sont recherchés dans des intervalles logarithmiques avec log-uniform, et kernel peut prendre les valeurs 'linear' et 'rbf'.

    5. Initialisation de BayesSearchCV :

      • Nous initialisons BayesSearchCV en spécifiant le modèle SVC(), l'espace de recherche des hyperparamètres, le nombre d'itérations n_iter=50, le nombre de splits pour la validation croisée (cv=5), la verbosité pour afficher les informations de progression (verbose=1), et un random_state pour assurer la reproductibilité des résultats.

    6. 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.

    7. Affichage des meilleurs paramètres :

      • bayes_search.best_params_ renvoie les meilleurs hyperparamètres trouvés pendant l'optimisation.

    8. É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 avec score().

    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.