SVM à Noyau RBF : Guide Complet — Principes, Exemples et Implémentation Python

SVM à Noyau RBF : Guide Complet — Principes, Exemples et Implémentation Python

SVM à Noyau RBF : Guide complet — Principes, Exemples et Implémentation Python

Résumé

Le SVM à noyau RBF (Radial Basis Function, fonction à base radiale) est l’une des variantes les plus puissantes et les plus utilisées des machines à vecteurs de support. Contrairement au SVM linéaire qui ne sait tracer que des droites ou des hyperplans de séparation, le SVM RBF est capable de modéliser des frontières de décision hautement non linéaires grâce à l’astuce du noyau (kernel trick). Cette technique projette implicitement les données dans un espace de dimensions infinies où elles deviennent linéairement séparables. L’hyperparamètre gamma contrôle la portée de chaque vecteur de support : un gamma élevé produit des frontières très flexibles (risque de surapprentissage), tandis qu’un gamma faible génère des zones plus lisses. Dans ce guide, nous étudierons les fondements mathématiques du noyau RBF, son intuition visuelle, un exemple complet d’implémentation avec scikit-learn, et quatre cas d’usage concrets.

Principe mathématique du SVM à noyau RBF

L’astuce du noyau (Kernel Trick)

Le problème fondamental du SVM classique est qu’il recherche un hyperplan linéaire séparateur. Lorsque les données ne sont pas linéairement séparables dans l’espace d’origine — ce qui est fréquent dans les applications réelles — le SVM échoue.

L’idée de l’astuce du noyau est géniale dans sa simplicité : plutôt que de calculer explicitement les coordonnées des données dans un espace de plus haute dimension (ce qui serait coûteux, voire impossible), on calcule directement le produit scalaire entre les images des points dans cet espace transformé. Cette quantité s’exprime comme une fonction de noyau K(x, x’) qui opère directement dans l’espace d’origine.

Le noyau RBF : définition

Le noyau RBF, également appelé noyau gaussien, est défini par :

K(x, x') = exp(-γ ||x - x'||²)

où :
x et x’ sont deux vecteurs d’entrée dans l’espace d’origine,
||x – x’||² est le carré de la distance euclidienne entre ces deux points,
γ (gamma) est un paramètre positif qui contrôle la largeur de la fonction gaussienne.

Ce noyau possède une propriété remarquable : il correspond à un produit scalaire dans un espace de Hilbert à reproduire noyau (RKHS) de dimension infinie. Autrement dit, le noyau RBF projette implicitement chaque point de données dans un espace de features de dimension infinie, sans jamais avoir à calculer ces coordonnées explicitement. C’est la puissance de l’astuce du noyau.

Formulation duale avec le noyau RBF

Le problème d’optimisation dual du SVM s’écrit :

max(α)  Σ αᵢ - ½ ΣΣ αᵢ αⱼ yᵢ yⱼ K(xᵢ, xⱼ)

sous les contraintes 0 ≤ αᵢ ≤ C et Σ αᵢ yᵢ = 0.

Avec le noyau RBF, le terme K(xᵢ, xⱼ) remplace le produit scalaire classique du SVM linéaire. La fonction de décision finale devient :

f(x) = signe( Σ_{i ∈ SV} αᵢ yᵢ exp(-γ ||xᵢ - x||²) + b )

où SV désigne l’ensemble des vecteurs de support (les points pour lesquels αᵢ > 0). Seuls ces points contribuent à la classification, ce qui rend le modèle élégant et efficace.

Intuition : les bulles d’influence

Pour comprendre le noyau RBF de manière intuitive, imaginez que chaque vecteur de support émet une bulle d’influence autour de lui. La forme de cette bulle est gaussienne : l’influence est maximale au centre (sur le vecteur de support lui-même, où K = 1) et décroît exponentiellement avec la distance.

Le paramètre gamma détermine la taille de ces bulles :

  • Gamma élevé (γ ≫ 1) : les bulles sont petites et très localisées. Chaque vecteur de support n’influence qu’un voisinage très proche. La frontière de décision devient extrêmement sinueuse, pouvant épouser le moindre détail des données d’entraînement. Risque de surapprentissage élevé.
  • Gamma faible (γ ≪ 1) : les bulles sont larges et s’étendent loin. La frontière est plus lisse et plus générale, mais elle peut être trop simple pour capturer la structure réelle des données. Risque de sous-apprentissage.
  • Gamma modéré : c’est le « sweet spot ». Les bulles couvrent suffisamment de terrain pour capturer les motifs importants sans se perdre dans le bruit.

On peut aussi interpréter γ comme l’inverse de la variance de la gaussienne : γ = 1/(2σ²). Un grand γ correspond à une variance petite (bulles étroites), un petit γ à une variance grande (bulles larges).

Implémentation Python complète

Configuration de base et génération des données

Nous utiliserons des données make_moons pour illustrer la supériorité du noyau RBF face à un SVM linéaire sur des problèmes non linéairement séparables.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_moons, make_circles
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import classification_report, accuracy_score
from sklearn.preprocessing import StandardScaler

# --- Génération des données ---
X, y = make_moons(n_samples=500, noise=0.15, random_state=42)

# Division entraînement / test
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# Standardisation (recommandée pour le SVM RBF)
scaler = StandardScaler()
X_train_sc = scaler.fit_transform(X_train)
X_test_sc = scaler.transform(X_test)

La standardisation est cruciale pour le SVM à noyau RBF. Puisque le noyau repose sur la distance euclidienne, des features sur des échelles différentes fausseraient complètement les calculs.

Comparaison : SVM linéaire vs SVM RBF

# SVM linéaire
svm_linear = SVC(kernel='linear', C=1.0, random_state=42)
svm_linear.fit(X_train_sc, y_train)
print(f"SVM Linéaire accuracy : {svm_linear.score(X_test_sc, y_test):.4f}")

# SVM à noyau RBF (paramètres par défaut)
svm_rbf = SVC(kernel='rbf', C=1.0, gamma='scale', random_state=42)
svm_rbf.fit(X_train_sc, y_train)
print(f"SVM RBF accuracy     : {svm_rbf.score(X_test_sc, y_test):.4f}")

Sur des données en forme de demi-lunes (moons), le SVM linéaire atteint typiquement ~85 % de précision car il ne peut tracer qu’une droite. Le SVM RBF, lui, dépasse souvent 95 % en épousant la courbe des données.

Tracé de la frontière de décision

def plot_decision_boundary(model, X, y, title, scaler_obj=None):
    # Trace la frontière de décision d'un classifieur 2D
    # Grille de points
    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
    xx, yy = np.meshgrid(
        np.linspace(x_min, x_max, 300),
        np.linspace(y_min, y_max, 300)
    )
    grid = np.c_[xx.ravel(), yy.ravel()]

    if scaler_obj is not None:
        grid = scaler_obj.transform(grid)

    Z = model.predict(grid).reshape(xx.shape)

    fig, ax = plt.subplots(figsize=(8, 6))
    ax.contourf(xx, yy, Z, levels=[-0.5, 0.5, 1.5],
                colors=['#66c2a5', '#fc8d62'], alpha=0.3)
    ax.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm',
               edgecolors='k', s=30, alpha=0.8)

    # Vecteurs de support
    sv = model.support_vectors_
    if scaler_obj is not None:
        sv = scaler_obj.inverse_transform(sv)
    ax.scatter(sv[:, 0], sv[:, 1], facecolors='none',
               edgecolors='gold', s=120, linewidths=1.5,
               label=f'Vecteurs de support ({len(sv)})')

    ax.set_title(title, fontsize=14, fontweight='bold')
    ax.set_xlabel('Feature 1')
    ax.set_ylabel('Feature 2')
    ax.legend()
    plt.tight_layout()
    plt.show()

# Visualisation
plot_decision_boundary(svm_linear, X_test, y_test,
                        'SVM Linéaire', scaler_obj=scaler)
plot_decision_boundary(svm_rbf, X_test, y_test,
                        'SVM à Noyau RBF', scaler_obj=scaler)

Optimisation des hyperparamètres par Grid Search

# Recherche sur grille de (C, gamma)
param_grid = {
    'C': [0.1, 1, 10, 100],
    'gamma': ['scale', 'auto', 0.01, 0.1, 1, 10]
}

grid = GridSearchCV(
    SVC(kernel='rbf', random_state=42),
    param_grid,
    cv=5,
    scoring='accuracy',
    n_jobs=-1
)
grid.fit(X_train_sc, y_train)

print(f"Meilleurs paramètres : {grid.best_params_}")
print(f"Meilleure accuracy CV  : {grid.best_score_:.4f}")

# Évaluation finale
best_model = grid.best_estimator_
test_acc = best_model.score(X_test_sc, y_test)
print(f"Accuracy test          : {test_acc:.4f}")

# Rapport détaillé
y_pred = best_model.predict(X_test_sc)
print("\nRapport de classification :")
print(classification_report(y_test, y_pred, target_names=['Classe 0', 'Classe 1']))

Le grid search explore systématiquement toutes les combinaisons de C et γ et retient celle qui maximise la performance en validation croisée à 5 plis. Cette approche est fortement recommandée en pratique.

Exemple avec make_circles

Le dataset make_circles offre un test encore plus visuel : deux cercles concentriques, impossibles à séparer linéairement.

X_circ, y_circ = make_circles(
    n_samples=600, noise=0.08, factor=0.4, random_state=42
)
Xc_train, Xc_test, yc_train, yc_test = train_test_split(
    X_circ, y_circ, test_size=0.3, random_state=42, stratify=y_circ
)

scaler_c = StandardScaler()
Xc_train_sc = scaler_c.fit_transform(Xc_train)
Xc_test_sc = scaler_c.transform(Xc_test)

svm_circles = SVC(kernel='rbf', C=10, gamma=1.0, random_state=42)
svm_circles.fit(Xc_train_sc, yc_train)
print(f"Cercles - accuracy test : {svm_circles.score(Xc_test_sc, yc_test):.4f}")

plot_decision_boundary(svm_circles, Xc_test, yc_test,
                        'SVM RBF sur Cercles Concentriques', scaler_obj=scaler_c)

Nombre de vecteurs de support

Un indicateur utile du comportement du SVM RBF est le nombre de vecteurs de support :

n_sv = svm_rbf.n_support_
print(f"Vecteurs de support par classe : {n_sv}")
print(f"Total : {n_sv.sum()}")
print(f"Proportion : {n_sv.sum() / len(X_train_sc):.2%}")

Un pourcentage très élevé (> 60 %) suggère que le modèle mémorise les données (surapprentissage). Un pourcentage très faible peut indiquer un sous-apprentissage.

Hyperparamètres du SVM RBF

C : paramètre de régularisation

C contrôle le compromis entre une marge large et un faible nombre d’erreurs de classification sur l’ensemble d’entraînement.

Valeur de C Comportement Risque
Petit (0,01) Marge très large, tolère les erreurs Sous-apprentissage
Modéré (1-10) Équilibre marge / erreurs Généralement optimal
Grand (100-1000) Marge étroite, minimise les erreurs Surapprentissage

Gamma : portée d’influence

Valeur de gamma Bulles d’influence Frontière Risque
Faible (0,001) Très larges Très lisse Sous-apprentissage
Modéré (0,1-1) Taille adaptée Flexible Équilibré
Élevé (10-100) Très petites Très sinueuse Surapprentissage

Valeurs spéciales dans scikit-learn :
'scale' (défaut) : γ = 1 / (n_features × Var(X))
'auto' : γ = 1 / n_features

Autres paramètres pertinents

  • degree : non utilisé avec le noyau RBF (pertinent uniquement pour le noyau polynomial).
  • kernel : doit être 'rbf' dans notre cas.
  • max_iter : nombre maximal d’itérations de l’optimiseur SMO. La valeur -1 (absence de limite) est recommandée.

Avantages et limites du SVM à noyau RBF

Avantages

  • Puissance expressive : grâce à la projection en dimension infinie, le SVM RBF peut approximer n’importe quelle frontière de décision continue avec une précision arbitraire (théorème de Stone-Weierstrass généralisé).
  • Robustesse au surapprentissage : malgré sa flexibilité, le principe de maximisation de la marge et la régularisation par C offrent une bonne généralisation.
  • Efficace en haute dimension : performant même lorsque le nombre de features excède le nombre d’échantillons.
  • Pas d’hypothèse sur la distribution : méthode non paramétrique, aucune hypothèse de normalité nécessaire.
  • Solution globale : le problème d’optimisation est convexe, garantissant l’atteinte du minimum global (contrairement aux réseaux de neurones).

Limitations

  • Coût computationnel : la complexité d’entraînement est en O(n²) à O(n³), où n est le nombre d’échantillons. Impraticable au-delà de ~50 000 échantillons.
  • Sensibilité au scaling : nécessite une standardisation rigoureuse des features.
  • Difficile à interpréter : la frontière de décision dans l’espace original n’est pas directement lisible.
  • Pas de probabilités natives : les scores de décision ne sont pas des probabilités (bien que predict_proba soit disponible via calibrage Platt).
  • Sensible aux outliers : les points aberrants peuvent devenir des vecteurs de support et déformer la frontière.

4 cas d’usage concrets

1. Diagnostic médical

Classification de tumeurs bénignes vs malignes à partir de caractéristiques morphologiques de cellules (dataset Breast Cancer de Wisconsin). Les relations entre features sont souvent non linéaires, ce qui rend le noyau RBF particulièrement adapté pour capturer ces interactions complexes.

2. Reconnaissance d’écriture manuscrite

Distinction entre chiffres manuscrits (dataset digits de scikit-learn ou MNIST). Chaque pixel est une feature, et les patterns visuels créent des frontières hautement non linéaires dans l’espace des pixels. Le SVM RBF atteint des performances compétitives sur ces tâches.

3. Détection de fraude financière

Identification de transactions frauduleuses parmi des millions d’opérations légitimes. Les signaux de fraude sont subtils et non linéaires : montants inhabituels, horaires atypiques, combinaisons de caractéristiques géographiques. Le SVM RBF modélise bien ces interactions complexes.

4. Classification de texte (catégorisation)

Affectation de documents à des catégories thématiques (sport, politique, technologie…) à partir de représentations TF-IDF ou bag-of-words. Avec des milliers de features creuses, le SVM RBF offre une bonne capacité de généralisation et est souvent le modèle de référence en classification de texte avant l’avènement des transformers.

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.