Analyse Discriminante Linéaire : Guide Complet — Principes, Exemples et Implémentation Python

Analyse Discriminante Linéaire : Guide Complet — Principes, Exemples et Implémentation Python

Analyse discriminante linéaire

Résumé — L’analyse discriminante linéaire (LDA) est une méthode statistique fondamentale qui combine classification supervisée et réduction de dimensionnalité. Ce guide explore en profondeur les principes mathématiques, l’intuition géométrique et l’implémentation pratique de l’analyse discriminante linéaire avec Python et scikit-learn. Vous apprendrez à maximiser la séparation entre les classes tout en minimisant la variation intra-classe, une approche élégante et efficace pour de nombreux problèmes de classification.


Principe mathématique

L’analyse discriminante linéaire repose sur une idée aussi simple qu’élégante formulée par Ronald Fisher en 1936 : trouver la projection linéaire qui sépare le mieux les classes. Cette séparation optimale s’exprime à travers le critère de Fisher, un rapport entre la variance inter-classes et la variance intra-classes.

Le critère de Fisher

Soit un espace de projection défini par un vecteur w. Le critère de Fisher s’écrit :

J(w) = wᵀ · S_B · w / (wᵀ · S_W · w)

où :

  • S_B est la matrice de covariance inter-classes (between-class scatter matrix), qui mesure la dispersion des centres de classes autour du centre global. Elle capture à quel point les classes sont éloignées les unes des autres.
  • S_W est la matrice de covariance intra-classes (within-class scatter matrix), qui mesure la dispersion des points autour de leur centre de classe respectif. Elle reflète la compacité de chaque classe.

L’objectif est de trouver le vecteur w qui maximise J(w). Intuitivement, on cherche une direction de projection où les classes sont bien séparées (S_B grand) et où les données de chaque classe sont resserrées (S_W petit).

Solution analytique

La maximisation du critère de Fisher admet une solution analytique fermée. Pour un problème à deux classes, le vecteur optimal s’exprime directement :

w = S_W⁻¹ · (μ₁ - μ₂)

où μ₁ et μ₂ sont les vecteurs moyens des deux classes. Pour K > 2 classes, on généralise en projetant sur un sous-espace de dimension au plus K – 1, obtenu par décomposition généralisée des valeurs propres.

Hypothèses fondamentales

L’analyse discriminante linéaire repose sur des hypothèses probabilistes précises :

  1. Distribution gaussienne : chaque classe suit une loi normale multidimensionnelle N(μ_k, Σ).
  2. Covariance commune : toutes les classes partagent la même matrice de covariance Σ. C’est cette hypothèse qui rend les frontières de décision linéaires (d’où le nom de la méthode).
  3. Indépendance conditionnelle : les observations sont indépendantes sachant leur classe.

Si l’hypothèse de covariance commune est violée, les frontières deviennent quadratiques et il faut alors se tourner vers l’analyse discriminante quadratique (QDA).


Intuition géométrique

Imaginez un nuage de points en deux dimensions appartenant à deux classes distinctes, par exemple des fleurs de deux espèces différentes. Chaque classe forme un amas de points.

L’idée centrale de l’analyse discriminante linéaire est la suivante : on projette toutes les données sur un axe unique (une droite) choisi de manière optimale. Cet axe doit satisfaire deux critères simultanés :

  • Maximiser la distance entre les centres projetés des classes (critère inter-classes). Plus les centres sont éloignés sur cet axe, plus il sera facile de distinguer les classes.
  • Minimiser la dispersion des points autour de chaque centre projeté (critère intra-classes). Plus les points d’une même classe sont regroupés, moins il y aura de confusion avec l’autre classe.

Visualisons cela en 2D : si vous dessinez deux nuages de points légèrement chevauchants, LDA trouve automatiquement la direction de projection qui réduit le chevauchement au minimum. Le seuil de décision se place alors naturellement au milieu des deux centres projetés (en tenant compte des priors).

Cette projection linéaire rend LDA particulièrement utile non seulement pour la classification, mais aussi pour la réduction de dimensionnalité : on passe d’un espace de grande dimension à un espace de dimension K – 1 tout en préservant au maximum l’information discriminante.


Implémentation Python

Voyons comment mettre en œuvre l’analyse discriminante linéaire avec scikit-learn, d’abord pour la classification puis pour la réduction de dimension.

Classification avec LinearDiscriminantAnalysis

Commençons par un exemple complet utilisant le jeu de données Iris :

import numpy as np
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import seaborn as sns

# Chargement des données
iris = load_iris()
X, y = iris.data, iris.target

# Séparation train/test
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# Création et entraînement du modèle LDA
lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)

# Prédictions
y_pred = lda.predict(X_test)

# Évaluation
accuracy = accuracy_score(y_test, y_pred)
print(f"Exactitude (accuracy) : {accuracy:.4f}")
print(f"\nMatrice de confusion :\n{confusion_matrix(y_test, y_pred)}")
print(f"\nRapport de classification :\n{classification_report(y_test, y_pred)}")

Avec le jeu Iris, l’analyse discriminante linéaire atteint typiquement une exactitude supérieure à 97 %, grâce à la bonne séparabilité des espèces et au respect des hypothèses gaussiennes.

Décision et frontières

Le modèle expose plusieurs attributs utiles pour comprendre les décisions prises :

# Coefficients de la fonction discriminante
print("Coefficients (scalings) :\n", lda.scalings_)

# Moyennes par classe dans l'espace projeté
print("Moyennes projetées par classe :\n", lda.means_)

# Probabilités a posteriori pour le premier échantillon
probabilities = lda.predict_proba(X_test[:5])
print(f"\nProbabilités pour les 5 premières prédictions :\n{probabilities}")

Réduction de dimensionnalité avec LDA

L’analyse discriminante linéaire brille également comme technique de réduction de dimension. Pour le jeu Iris (4 dimensions, 3 classes), la projection LDA réduit à 2 dimensions au maximum :

# Projection LDA en 2D
lda_proj = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda_proj.fit_transform(X, y)

# Visualisation de la projection
plt.figure(figsize=(10, 7))
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1"]
labels = iris.target_names

for class_idx, color, label in zip(range(3), colors, labels):
    mask = y == class_idx
    plt.scatter(
        X_lda[mask, 0], X_lda[mask, 1],
        c=color, label=label, alpha=0.7, edgecolors="black", s=80
    )

# Ajout des centroïdes projetés
centroids = lda_proj.transform(lda_proj.means_)
plt.scatter(
    centroids[:, 0], centroids[:, 1],
    c="black", marker="X", s=200, label="Centroïdes"
)

plt.title("Projection LDA : réduction de dimension (Iris)", fontsize=14)
plt.xlabel("Composante discriminante 1")
plt.ylabel("Composante discriminante 2")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Cette visualisation révèle clairement comment l’analyse discriminante linéaire sépare les trois espèces d’iris dans un espace bidimensionnel optimal. Les centroïdes de chaque classe apparaissent bien distincts, ce qui traduit la qualité de la projection discriminante.

Comparaison avec des données synthétiques

Pour illustrer le comportement de LDA dans un cas à deux classes bien séparées :

from sklearn.datasets import make_classification

# Génération de données synthétiques à 2 classes
X_syn, y_syn = make_classification(
    n_samples=500, n_features=10, n_informative=5,
    n_redundant=2, n_classes=2, random_state=42
)

X_train_s, X_test_s, y_train_s, y_test_s = train_test_split(
    X_syn, y_syn, test_size=0.25, random_state=42
)

lda_syn = LinearDiscriminantAnalysis()
lda_syn.fit(X_train_s, y_train_s)

print(f"Accuracy synthétique : {lda_syn.score(X_test_s, y_test_s):.4f}")

Hyperparamètres

Le constructeur LinearDiscriminantAnalysis offre plusieurs hyperparamètres essentiels à maîtriser :

Hyperparamètre Valeurs possibles Description
solver "svd", "lsqr", "eigen" Algorithme de résolution. "svd" (défaut) ne calcule pas la covariance explicite et supporte la réduction de dimension. "lsqr" et "eigen" permettent le shrinkage.
shrinkage None, "auto", float ∈ [0, 1] Régularisation de la matrice de covariance. "auto" utilise le lemme de Ledoit-Wolf pour estimer automatiquement le taux optimal. Un float fixe le taux manuellement (ex. 0.5). Nécessaire pour solver="lsqr" ou "eigen".
n_components int (1 ≤ n ≤ K-1) Nombre de composantes pour la réduction de dimension. Par défaut, K – 1 où K est le nombre de classes. Ignoré si utilisé uniquement pour la classification avec solver="svd".
priors array-like ou None Probabilités a priori des classes. Si None, estimées à partir des fréquences d’entraînement. Utile en cas de déséquilibre connu des classes.
store_covariance True ou False Stocke la matrice de covariance calculée (covariance_). Activé automatiquement avec solver="svd", utile pour l’interprétation.
tol float (défaut 1e-4) Tolérance utilisée pour le seuillage dans solver="svd". Contrôle la précision du calcul des valeurs propres.

Quand utiliser le shrinkage ?

Le shrinkage est particulièrement utile dans les situations suivantes :

  • p >> n : le nombre de variables dépasse largement le nombre d’observations, rendant l’estimation de la covariance instable.
  • Colinéarité forte : variables hautement corrélées entre elles.
  • Données bruyantes : présence de bruit important dans les mesures.

Le shrinkage combine la matrice de covariance empirique avec une matrice cible (généralement diagonale), pondérée par le coefficient de retrait. Cela stabilise l’inversion de S_W et améliore la généralisation.

# Exemple avec shrinkage automatique
lda_regularized = LinearDiscriminantAnalysis(
    solver="lsqr",
    shrinkage="auto"
)
lda_regularized.fit(X_train, y_train)
print(f"Shrinkage estimé : {lda_regularized.shrinkage_:.4f}")
print(f"Accuracy avec shrinkage : {lda_regularized.score(X_test, y_test):.4f}")

Avantages et Limites

Comme toute méthode, l’analyse discriminante linéaire présente des atouts et des contraintes qu’il convient de bien comprendre.

Avantages

  • Efficacité computationnelle : la solution analytique fermée rend l’entraînement extrêmement rapide, même sur de grands jeux de données. Pas d’optimisation itérative nécessaire.
  • Peu de risque de surapprentissage : avec peu de paramètres à estimer (moyennes par classe + covariance commune), LDA généralise bien même avec un échantillon d’entraînement modeste.
  • Réduction de dimension intégrée : LDA projette naturellement les données dans un espace à K – 1 dimensions, offrant une visualisation immédiate de la séparabilité.
  • Probabilités calibrées : les probabilités a posteriori estimées par LDA sont bien calibrées (contrairement à certaines méthodes comme SVM), ce qui facilite l’analyse des seuils de décision.
  • Interprétabilité : les coefficients de projection (scalings_) indiquent directement le poids de chaque variable dans la discrimination, rendant le modèle facile à expliquer.
  • Robustesse avec shrinkage : la régularisation intégrée permet de traiter des cas où p > n, une situation fréquente en génomique et en traitement du signal.

Limites

  • Hypothèse gaussienne : si les distributions réelles s’écartent fortement de la normalité, les performances de l’analyse discriminante linéaire peuvent se dégrader significativement.
  • Covariance commune : l’hypothèse d’une même covariance pour toutes les classes est restrictive. Lorsque les classes ont des formes très différentes (ellipsoïdes de tailles ou orientations différentes), QDA ou d’autres méthodes sont préférables.
  • Frontières linéaires uniquement : LDA ne peut pas apprendre des frontières de décision non linéaires complexes. Pour des problèmes non linéairement séparables, il faut recourir à des méthodes à noyau ou des réseaux de neurones.
  • Sensibilité aux valeurs aberrantes : comme les estimateurs de moyenne et de covariance sont sensibles aux outliers, un prétraitement rigoureux des données est essentiel.
  • Dimension maximale de projection limitée : la projection LDA ne peut produire que K – 1 composantes. Pour un problème binaire, on obtient une seule dimension, ce qui peut être restrictif pour la visualisation.

Cas d’usage

L’analyse discriminante linéaire trouve des applications remarquables dans de nombreux domaines scientifiques et industriels.

1. Reconnaissance faciale et biométrie

Dans les systèmes de reconnaissance faciale, l’analyse discriminante linéaire est utilisée via l’algorithme Fisherfaces, une variante directe de LDA appliquée aux images de visages. Chaque pixel (ou caractéristique extraite) constitue une dimension, et LDA trouve les directions qui maximisent la séparation entre les individus tout en minimisant la variation intra-personne (expressions, éclairage). Cette approche est historiquement compétitive avec les méthodes dites des Eigenfaces (basées sur la PCA), car elle cible explicitement la discrimination entre identités plutôt que la reconstruction.

2. Diagnostic biomédical assisté

LDA est largement employé dans l’aide au diagnostic médical. Par exemple, on peut entraîner un modèle LDA pour distinguer des tumeurs bénignes de tumeurs malignes à partir de mesures cliniques (taille, texture, régularité des contours). Les probabilités a posteriori fournissent un score de confiance que le médecin peut utiliser pour prioriser les cas ambigus. La transparence des coefficients LDA aide également à identifier les variables biomédicales les plus discriminantes, apportant une valeur explicative au diagnostic.

3. Classification de documents et filtrage de texte

En traitement automatique du langage, l’analyse discriminante linéaire peut classer des documents textuels après vectorisation TF-IDF ou plongements lexicaux (embeddings). Bien que les méthodes neuronales modernes dominent aujourd’hui, LDA reste une référence pertinente pour des tâches à petit volume de données : détection de spam, catégorisation thématique, filtrage de contenu. Sa rapidité d’entraînement et sa robustesse en font un excellent baseline à battre.

4. Analyse de microarrays génétiques et génomique

La génomique moderne produit des données à très haute dimension : des milliers de gènes mesurés sur quelques dizaines d’échantillons (p >> n). L’analyse discriminante linéaire avec shrinkage est particulièrement adaptée à ce contexte, car la régularisation de la matrice de covariance stabilise l’estimation malgré le faible nombre d’observations. Les chercheurs l’utilisent pour classifier des types de cancers à partir de profils d’expression génique, identifier des biomarqueurs discriminants, et visualiser la structure des sous-types moléculaires dans l’espace réduit à K – 1 dimensions.


Voir aussi


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.