Quand une droite ne suffit pas à séparer deux classes, la SVM à noyau travaille comme si les données étaient projetées dans un espace plus riche, où une frontière simple existe. Elle excelle sur des jeux de taille moyenne aux frontières complexes, au prix de réglages délicats et de calculs lourds.
Des billes rouges au centre d'une table, des bleues autour. Impossible de les séparer d'un trait de règle. Soulevez la nappe au centre : un plan horizontal les sépare.
Le noyau est une fonction de similarité. Le noyau gaussien (RBF) donne une valeur proche de 1 pour deux images presque identiques, proche de 0 pour deux images très différentes.
Grâce à l'astuce du noyau, la SVM trouve la frontière à marge maximale dans cet espace enrichi sans jamais calculer ses coordonnées, seulement des similarités.
Une nouvelle image est comparée aux exemples clés retenus, les vecteurs de support. Leur similarité pondérée décide de la classe.
Chaque chiffre est une petite image de 8 × 8 pixels, soit 64 niveaux de gris, avec le chiffre réel. Le cas type : la saisie automatique de montants ou de codes sur des formulaires papier.
Sur le jeu d'exemple, la SVM à noyau lit correctement 99,1 % des chiffres mis de côté, contre 97,8 % pour la même SVM sans noyau. Le modèle retient 527 images de support sur 1 257.
Sur une chaîne de saisie, chaque erreur coûte une correction manuelle. On regarde l'exactitude globale, puis la matrice de confusion pour repérer les paires confondues, comme 8 et 1, et fixer un seuil de renvoi vers un opérateur.
Noms donnés pour R (e1071) et Python (scikit-learn). C et gamma se règlent ensemble, par recherche en grille.
Forme du noyau. "radial" / "rbf" est le choix par défaut et le plus polyvalent. Le noyau polynomial sert quand on soupçonne des interactions d'un degré donné.
Tolérance aux erreurs d'entraînement. Grand C : frontière qui épouse les données, risque de surapprentissage. Petit C : frontière plus lisse.
Portée de chaque exemple. Grand gamma : chaque image n'influence que ses voisines immédiates, la frontière devient très découpée. Petit gamma : influence large, frontière douce. En Python, gamma="scale" part d'une valeur adaptée à l'échelle des données.
# Lecture de chiffres manuscrits : SVM à noyau en R
library(e1071)
chiffres <- read.csv("chiffres_manuscrits.csv")
X <- as.matrix(chiffres[, 1:64]) / 16 # pixels ramenés entre 0 et 1
y <- factor(chiffres$chiffre)
set.seed(42)
idx <- sample(nrow(X), round(0.7 * nrow(X)))
# Noyau gaussien : cost et gamma choisis par validation croisée (10 plis)
reglage <- tune(svm, train.x = X[idx, ], train.y = y[idx], kernel = "radial", scale = FALSE,
ranges = list(cost = c(1, 10, 100), gamma = c(0.01, 0.05, 0.1)))
print(reglage$best.parameters)
modele <- reglage$best.model
pred <- predict(modele, X[-idx, ])
cat("Exactitude test :", round(mean(pred == y[-idx]), 3), "\n")
cat("Vecteurs de support :", modele$tot.nSV, "sur", length(idx), "images\n")
# Pour comparaison : la même SVM sans noyau (frontières droites)
lineaire <- svm(X[idx, ], y[idx], kernel = "linear", scale = FALSE)
cat("SVM linéaire, exactitude test :", round(mean(predict(lineaire, X[-idx, ]) == y[-idx]), 3), "\n")
# Lecture de chiffres manuscrits : SVM à noyau en Python
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score
chiffres = pd.read_csv("chiffres_manuscrits.csv")
X = chiffres.drop(columns="chiffre") / 16 # pixels ramenés entre 0 et 1
y = chiffres["chiffre"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
# Noyau gaussien (RBF) : C et gamma choisis par validation croisée
grille = {"C": [1, 10, 100], "gamma": ["scale", 0.01, 0.1]}
recherche = GridSearchCV(SVC(kernel="rbf"), grille, cv=5).fit(X_train, y_train)
print("Meilleurs réglages :", recherche.best_params_)
modele = recherche.best_estimator_
pred = modele.predict(X_test)
print("Exactitude test :", round(accuracy_score(y_test, pred), 3))
print("Vecteurs de support :", modele.n_support_.sum(), "sur", len(X_train), "images")
# Pour comparaison : la même SVM sans noyau (frontières droites)
lineaire = SVC(kernel="linear").fit(X_train, y_train)
print("SVM linéaire, exactitude test :", round(lineaire.score(X_test, y_test), 3))
C'est le fait de calculer des similarités entre exemples comme s'ils étaient projetés dans un espace de dimension beaucoup plus grande, sans jamais faire cette projection. La SVM n'a besoin que de ces similarités pour trouver sa frontière. Le calcul reste donc faisable même quand l'espace implicite est de dimension infinie, comme avec le noyau gaussien.
Par recherche en grille avec validation croisée, sur des échelles logarithmiques (0,01, 0,1, 1, 10…). Les deux paramètres interagissent : un gamma élevé demande en général un C plus faible. Les données doivent être mises à l'échelle avant la recherche.
Sur quelques milliers d'exemples, une SVM à noyau bien réglée rivalise souvent avec un réseau de neurones et demande moins de travail. Sur des volumes importants ou des images de taille réelle, les réseaux de neurones l'emportent, car l'entraînement d'une SVM devient trop coûteux.
Même idée de marge avec une frontière droite. Bien plus rapide, suffisante sur le texte.
Voir la fiche → l'autre méthode par similaritéClasse par les exemples les plus ressemblants, sans rien apprendre. Simple, mais lent en prédiction.
Voir la fiche → le standard pour les imagesApprennent eux-mêmes les motifs visuels. Indispensables sur des images de taille réelle.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus