Leave-One-Out (LOO)

Fonctions :

  • LeaveOneOut()

    La fonction LeaveOneOut() (LOO) de sklearn.model_selection est une méthode de validation croisée où chaque observation du jeu de données sert tour à tour de jeu de test, tandis que toutes les autres observations servent de jeu d'entraînement. Cela signifie que le modèle est formé sur toutes les données sauf une, et testé sur cette donnée unique. Cette approche permet une évaluation de modèle très précise, mais peut être coûteuse en termes de calcul, surtout pour de grands jeux de données.

    Importation :

    from sklearn.model_selection import LeaveOneOut

    Attributs :

    Exemple de code :

    import numpy as np
    from sklearn.model_selection import LeaveOneOut
    from sklearn.linear_model import LogisticRegression
    from sklearn.datasets import load_iris
    from sklearn.metrics import accuracy_score
    
    # Chargement du jeu de données Iris
    data = load_iris()
    X = data.data
    y = data.target
    
    # Initialisation du LeaveOneOut
    loo = LeaveOneOut()
    
    # Liste pour stocker les scores de chaque itération
    loo_accuracies = []
    
    # Création du modèle
    model = LogisticRegression(max_iter=200)
    
    # Validation croisée Leave-One-Out
    for train_index, test_index in loo.split(X):
        # Séparation des données en train et test pour ce split
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
        
        # Entraînement du modèle
        model.fit(X_train, y_train)
        
        # Prédiction et évaluation
        y_pred = model.predict(X_test)
        accuracy = accuracy_score(y_test, y_pred)
        
        loo_accuracies.append(accuracy)
    
    # Affichage de la moyenne des accuracies
    print(f'Mean accuracy: {np.mean(loo_accuracies):.4f}')

    Explication du code :

    1. Chargement des données :

      • Le jeu de données Iris est chargé via load_iris(), qui contient des informations sur les fleurs d'iris avec quatre caractéristiques par échantillon et une variable cible représentant la classe de l'iris.

    2. Initialisation de LeaveOneOut :

      • LeaveOneOut() est initialisé sans argument de n_splits, car cela est déterminé automatiquement par le nombre d'échantillons dans X. Dans le cas de l'iris, cela signifie qu'il y aura 150 splits (un par échantillon).

    3. Boucle de validation croisée Leave-One-Out :

      • Nous utilisons loo.split(X) pour obtenir les indices de chaque division entre l'ensemble d'entraînement et l'échantillon de test. Pour chaque itération, un modèle de régression logistique est entraîné sur tous les échantillons sauf un, et testé sur cet échantillon unique.

    4. Entraînement et évaluation :

      • Le modèle est entraîné sur l'ensemble d'entraînement et évalué sur l'échantillon de test. La précision de la prédiction est calculée à chaque itération et ajoutée à la liste loo_accuracies.

    5. Calcul de la précision moyenne :

      • À la fin de la validation croisée, la moyenne des précisions obtenues lors de chaque itération est calculée et affichée.

    Points importants :

    • Coût computationnel élevé : LeaveOneOut() nécessite d'entraîner un modèle pour chaque échantillon du jeu de données. Cela peut être très coûteux en calcul, en particulier pour de grands ensembles de données.

    • Aucune donnée de test laissée de côté : Contrairement à des méthodes comme KFold, chaque échantillon est utilisé comme donnée de test au moins une fois, ce qui peut donner une estimation de performance très précise du modèle.

    • Surapprentissage potentiel : Étant donné que chaque modèle est testé sur un seul échantillon, le modèle peut s'adapter spécifiquement à cet échantillon, ce qui peut entraîner un surapprentissage (overfitting) si les données sont bruitées.

    Applications courantes :

    • Petits jeux de données : L'approche LOO est particulièrement utile pour les petits jeux de données où chaque observation compte et où une évaluation précise est nécessaire.

    • Estimation de performance du modèle : C'est une méthode idéale pour obtenir une estimation de la performance d'un modèle sur chaque échantillon du jeu de données.

    Paramètre
    Description
    n_splits Le nombre de splits. Par défaut, c'est égal au nombre d'échantillons dans le jeu de données. Il est généralement omis car il est implicitement défini par la taille des données.
    shuffle Si True, les données sont mélangées avant d'être divisées. Par défaut, False.
    random_state Permet de fixer la graine pour la génération aléatoire des folds lorsque shuffle=True.