Classification Multi-classe OvA vs OvO
“Étendre les classifieurs binaires au multi-classes — tableaux de tournoi pour les algorithmes”
Stratégies One-vs-All et One-vs-One pour la classification multi-classe — frontières, scalabilité, SVM et Softmax.
Prérequis
Concepts Couverts
∑Formules Clés
Classificateurs OvA
K classificateurs binaires, un par classe contre toutes les autres — nécessite K fois le temps d'entraînement
Classificateurs OvO
Un classificateur binaire par paire de classes — K(K-1)/2 modèles, chacun entraîné sur 2 classes
Softmax
Normalise K logits en distribution de probabilité — la sortie naturelle pour la classification multi-classes
▶Simulation Interactive
⬡Architecture du Modèle
Le Problème Multi-Classes
De nombreux problèmes réels ont plus de 2 classes : reconnaissance de chiffres (10 classes), classification d'espèces (centaines), catégorisation de produits (milliers). Certains algorithmes (régression logistique, SVM) sont intrinsèquement binaires. Deux stratégies les étendent : OvA entraîne K classificateurs, chacun séparant la classe k de toutes les autres. OvO entraîne K(K-1)/2 classificateurs pour chaque paire. Les réseaux de neurones avec Softmax résolvent le multi-classes nativement.
OvA vs OvO vs Softmax
OvA : K classificateurs, chacun utilise toutes les données. Entraînement rapide. Déséquilibré (1 positif vs K-1 négatifs). Bon pour K grand.
OvO : K(K-1)/2 classificateurs, chacun utilisant seulement 2 classes. Équilibré mais lent pour K grand (100 classes = 4950 classificateurs).
Softmax (LR multinomiale) : modèle unique, K sorties, entraîné avec entropie croisée. Le plus efficace. Natif aux réseaux de neurones.
Convention SVM : OvO est le défaut dans sklearn (historiquement légèrement meilleur). Pour les réseaux de neurones, toujours Softmax.
Classification Multi-classes avec Softmax
import torch import torch.nn as nn from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.multiclass import OneVsRestClassifier, OneVsOneClassifier from sklearn.svm import SVC # ── Données d'exemple ────────────────────────────────────────────────── X_np, y_np = make_classification(n_samples=300, n_features=8, n_classes=3, n_informative=6, random_state=42) X_train_np, X_test_np, y_train_np, _ = train_test_split( X_np, y_np, test_size=0.2, random_state=42) # ── Multiclasse PyTorch ──────────────────────────────────────────────── K = 3; lot = 16 class ReseauSimple(nn.Module): def __init__(self): super().__init__(); self.fc = nn.Linear(8, K) def forward(self, x): return self.fc(x) modele = ReseauSimple() x = torch.randn(lot, 8) y = torch.randint(0, K, (lot,)) poids_classes = torch.tensor([1.0, 2.0, 1.5]) # pondérer les classes rares # Softmax + Entropie Croisée (combinées pour la stabilité numérique) critere = nn.CrossEntropyLoss( weight=poids_classes, # Pour les classes déséquilibrées label_smoothing=0.1 # Évite les prédictions trop confiantes ) # Le modèle produit des logits bruts (pas de softmax dans forward) logits = modele(x) # Forme : (lot, K) perte = critere(logits, y) # y contient les indices de classe print(f"Perte CE multi-classes : {perte.item():.4f}") # Prédictions probs = torch.softmax(logits, dim=-1) preds = probs.argmax(dim=-1) # Sklearn : stratégie OvR (OvA) ovr = OneVsRestClassifier(SVC(kernel='rbf', probability=True)) ovo = OneVsOneClassifier(SVC(kernel='rbf')) ovr.fit(X_train_np, y_train_np) print(f"Précision OvR : {ovr.score(X_test_np, _):.3f}")
?Vérification des Connaissances
La progression est sauvegardée dans votre navigateur — aucun compte requis.
Besoin d'un Data Scientist ou Ingénieur IA ?
Je construis des modèles ML sur mesure, des chatbots RAG, des pipelines de données et des APIs en production — de l'analyse au déploiement.