ML Learning Hub
Classificationintermédiaire

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.

30 min
6 diagrammes
6 Concepts Couverts

Prérequis

SVM
Logistic Regression

Concepts Couverts

Multi-classDecision BoundariesOvAOvOSoftmaxClass Imbalance

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

Loading visualization…

Architecture du Modèle

Loading visualization…
🎯

Le Problème Multi-Classes

motivation

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

comparison
1

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.

2

OvO : K(K-1)/2 classificateurs, chacun utilisant seulement 2 classes. Équilibré mais lent pour K grand (100 classes = 4950 classificateurs).

3

Softmax (LR multinomiale) : modèle unique, K sorties, entraîné avec entropie croisée. Le plus efficace. Natif aux réseaux de neurones.

4

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

code
python45 lines
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

class="tok-comment"># ── Données dclass="tok-str">'exemple ──────────────────────────────────────────────────
X_np, y_np = make_classification(n_samples=class="tok-num">300, n_features=class="tok-num">8,
                                   n_classes=class="tok-num">3, n_informative=class="tok-num">6, random_state=class="tok-num">42)
X_train_np, X_test_np, y_train_np, _ = train_test_split(
    X_np, y_np, test_size=class="tok-num">0.2, random_state=class="tok-num">42)

class="tok-comment"># ── Multiclasse PyTorch ────────────────────────────────────────────────
K = class="tok-num">3; lot = class="tok-num">16

class ReseauSimple(nn.Module):
    def __init__(self): super().__init__(); self.fc = nn.Linear(class="tok-num">8, K)
    def forward(self, x): return self.fc(x)

modele = ReseauSimple()
x = torch.randn(lot, class="tok-num">8)
y = torch.randint(class="tok-num">0, K, (lot,))
poids_classes = torch.tensor([class="tok-num">1.0, class="tok-num">2.0, class="tok-num">1.5])   class="tok-comment"># pondérer les classes rares

class="tok-comment"># Softmax + Entropie Croisée (combinées pour la stabilité numérique)
critere = nn.CrossEntropyLoss(
    weight=poids_classes,    class="tok-comment"># Pour les classes déséquilibrées
    label_smoothing=class="tok-num">0.1      class="tok-comment"># Évite les prédictions trop confiantes
)

class="tok-comment"># Le modèle produit des logits bruts (pas de softmax dans forward)
logits = modele(x)            class="tok-comment"># Forme : (lot, K)
perte = critere(logits, y)   class="tok-comment"># y contient les indices de classe
print(f"Perte CE multi-classes : {perte.item():.4f}")

class="tok-comment"># Prédictions
probs = torch.softmax(logits, dim=-class="tok-num">1)
preds = probs.argmax(dim=-class="tok-num">1)

class="tok-comment"># Sklearn : stratégie OvR (OvA)
ovr = OneVsRestClassifier(SVC(kernel='rbfclass="tok-str">', probability=True))
ovo = OneVsOneClassifier(SVC(kernel='rbf'))
ovr.fit(X_train_np, y_train_np)
print(fclass="tok-str">"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 ingénieur IA ou data scientist ?

Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.