SVM Linéaire : Guide complet — Principes, Exemples et Implémentation Python
Résumé — Le SVM linéaire (Support Vector Machine linéaire) est un algorithme de classification supervisée qui recherche l’hyperplan optimal séparant deux classes avec la marge la plus large possible. Il repose sur un principe de minimisation de la norme du vecteur de poids sous contraintes, avec un paramètre de régularisation C contrôlant le compromis biais-variance. Ce guide couvre les fondements mathématiques, l’intuition géométrique, l’implémentation Python complète avec scikit-learn, l’analyse des hyperparamètres et les cas d’usage pratiques.
Qu’est-ce qu’un SVM linéaire ?
Le SVM linéaire — ou machine à vecteurs de support linéaire — est un classifieur binaire fondé sur la recherche d’un hyperplan de décision optimal dans l’espace des features. Contrairement à d’autres algorithmes de classification qui tentent simplement de séparer les classes, le SVM linéaire cherche spécifiquement la séparation maximisant la distance entre l’hyperplan et les points les plus proches de chaque classe. Cette distance s’appelle la marge, d’où le nom de classifieur à large marge (maximal margin classifier).
Le SVM linéaire excelle particulièrement lorsque les données sont linéairement séparables ou presque — c’est-à-dire lorsqu’une droite (en 2D), un plan (en 3D) ou un hyperplan (en dimensions supérieures) peut séparer les deux classes avec une erreur minimale. Pour des données non linéairement séparables, on lui préfère généralement le SVM à noyau RBF ou polynomial.
Principe mathématique
L’hyperplan de séparation
Dans un espace de dimension d, l’hyperplan de décision est défini par l’équation :
w · x + b = 0
où :
- w ∈ Rᵈ est le vecteur de poids (normal à l’hyperplan),
- b ∈ R est le biais (terme d’ordonnée à l’origine),
- x ∈ Rᵈ est un vecteur d’observations (un point de données).
La règle de décision est simple : pour une nouvelle observation x,
f(x) = signe(w · x + b)
qui renvoie +1 si le point est d’un côté de l’hyperplan, −1 de l’autre.
Les données d’entraînement portent des étiquettes yᵢ ∈ {−1, +1}.
La marge maximale
La distance d’un point xᵢ à l’hyperplan vaut |w · xᵢ + b| / ||w||. Les points les plus proches de l’hyperplan — les vecteurs supports — satisfont yᵢ(w · xᵢ + b) = 1.
La marge totale entre les deux classes est :
marge = 2 / ||w||
Maximiser la marge revient donc à minimiser ||w||.
Formulation d’optimisation — Marge dure (Hard Margin)
Quand les données sont parfaitement linéairement séparables, le problème s’écrit :
- Objectif : minimiser ½||w||²
- Contraintes : yᵢ(w · xᵢ + b) ≥ 1 pour tout i = 1, …, n
Le facteur ½ est ajouté pour simplifier le calcul du gradient (il annule le 2 qui apparaît lors de la dérivation de la norme au carré).
Ce problème d’optimisation est un programme quadratique convexe : la fonction objectif est convexe (forme quadratique définie positive) et les contraintes sont linéaires. Il admet donc un unique optimum global, ce qui est un avantage majeur du SVM.
Marge douce (Soft Margin) — Introduction du paramètre C
En pratique, les données sont rarement parfaitement séparables. La marge douce autorise certaines violations de marge via des variables d’écart (slack variables) ξᵢ ≥ 0 :
- Objectif : minimiser ½||w||² + C·Σ ξᵢ
- Contraintes : yᵢ(w · xᵢ + b) ≥ 1 − ξᵢ et ξᵢ ≥ 0 pour tout i
Le paramètre C > 0 contrôle le compromis entre la largeur de la marge et le nombre d’erreurs tolérées :
- C grand (ex. C = 100) : on pénalise fortement les erreurs → marge étroite, le modèle s’adapte étroitement aux données d’entraînement mais risque le surapprentissage (overfitting).
- C petit (ex. C = 0.01) : on tolère plus d’erreurs → marge large, le modèle est plus robuste et généralise mieux, mais peut sous-apprendre (underfitting).
C’est le compromis classique biais-variance : un petit C augmente le biais mais réduit la variance, tandis qu’un grand C fait l’inverse.
Formulation duale et multiplicateurs de Lagrange
Le problème primal est résolu via la dualité de Lagrange, qui transforme le problème d’optimisation en un problème équivalent mais souvent plus facile à résoudre.
On construit le lagrangien en introduisant des multiplicateurs αᵢ ≥ 0 pour les contraintes de marge et μᵢ ≥ 0 pour les contraintes de positivité des variables d’écart :
L(w, b, α, ξ, μ) = ½||w||² + C·Σ ξᵢ − Σ αᵢ [yᵢ(w · xᵢ + b) − 1 + ξᵢ] − Σ μᵢ ξᵢ
En annulant les dérivées partielles par rapport à w, b et ξᵢ, on obtient le problème dual :
- Objectif : maximiser Σ αᵢ − ½ Σᵢ Σⱼ αᵢ·αⱼ·yᵢ·yⱼ·(xᵢ · xⱼ)
- Contraintes : 0 ≤ αᵢ ≤ C et Σ αᵢ·yᵢ = 0
Ce problème dual présente deux avantages essentiels :
- Il ne dépend des données qu’à travers des produits scalaires xᵢ · xⱼ. C’est ce qui permet l’astuce du noyau (kernel trick) pour les SVM non linéaires.
- Seuls les points avec αᵢ > 0 contribuent à la solution : ce sont les vecteurs supports. Tous les autres points ont αᵢ = 0 et n’influencent pas l’hyperplan — c’est la propriété de parcimonie du SVM.
Intuition géométrique : la « rue la plus large »
Imaginez deux villages séparés par une route. Les maisons du village A sont d’un côté, celles du village B de l’autre. Vous devez tracer la ligne médiane de la route de façon à ce qu’elle soit aussi éloignée que possible des maisons des deux côtés. C’est exactement le principe du SVM linéaire.
- La route elle-même est l’hyperplan w · x + b = 0.
- Les bordures de la route sont les hyperplans w · x + b = +1 et w · x + b = −1. C’est la marge.
- Les maisons qui touchent les bordures sont les vecteurs supports — ce sont les seules qui comptent pour déterminer où passe la route.
- Aucune maison au milieu du village n’influence la position de la route — c’est la propriété de parcimonie du SVM.
Cette géométrie explique pourquoi le SVM est si robuste : la décision ne dépend que de quelques points critiques, pas de l’ensemble du jeu de données. Même si on ajoute des millions de points loin de la frontière, l’hyperplan ne bougera pas.
Implémentation Python avec scikit-learn
Préparation de l’environnement
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVC, SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
from sklearn.preprocessing import StandardScaler
np.random.seed(42)
Génération de données synthétiques
# Données linéairement séparables
X, y = make_classification(
n_samples=500,
n_features=2,
n_informative=2,
n_redundant=0,
n_clusters_per_class=1,
flip_y=0.05, # 5 % de bruit
class_sep=1.5, # bonne séparation
random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Standardisation — cruciale pour les SVM !
scaler = StandardScaler()
X_train_sc = scaler.fit_transform(X_train)
X_test_sc = scaler.transform(X_test)
Note importante : le SVM est sensible à l’échelle des features. La standardisation (centrage-réduction) est toujours recommandée. Sans elle, une feature avec une grande échelle dominerait la fonction de décision.
Comparaison LinearSVC vs SVC(kernel=”linear”)
scikit-learn propose deux implémentations du SVM linéaire, basées sur des bibliothèques différentes :
# LinearSVC — optimisation par descente de gradient coordonnée (liblinear)
linear_svc = LinearSVC(C=1.0, max_iter=2000, random_state=42)
linear_svc.fit(X_train_sc, y_train)
y_pred_lsvc = linear_svc.predict(X_test_sc)
# SVC(kernel="linear") — optimisation SMO (libsvm)
svc_linear = SVC(kernel="linear", C=1.0, random_state=42)
svc_linear.fit(X_train_sc, y_train)
y_pred_svc = svc_linear.predict(X_test_sc)
# Comparaison des performances
print(f"LinearSVC — Accuracy : {accuracy_score(y_test, y_pred_lsvc):.4f}")
print(f"SVC linear — Accuracy : {accuracy_score(y_test, y_pred_svc):.4f}")
print(f"SVC linear — Nb vecteurs supports : {len(svc_linear.support_vectors_)}")
Dans la pratique, LinearSVC est généralement plus rapide sur des jeux de données volumineux, tandis que SVC(kernel=”linear”) donne accès aux vecteurs supports et permet l’activation de probability=True pour obtenir des scores probabilistes.
Visualisation de l’hyperplan et des marges
def plot_svm_decision_boundary(model, X, y, title="SVM Linéaire"):
"""Trace l'hyperplan de décision et les marges d'un SVM linéaire."""
w = model.coef_[0]
b_val = model.intercept_[0]
# Grille de prédiction
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, 200),
np.linspace(y_min, y_max, 200))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
fig, ax = plt.subplots(figsize=(10, 7))
ax.contourf(xx, yy, Z, alpha=0.2, cmap=plt.cm.coolwarm)
# Hyperplan : w1·x + w2·y + b = 0 → y = −(w1·x + b) / w2
ax.plot(xx, -(w[0]*xx + b_val)/w[1], 'k-', linewidth=2, label='Hyperplan')
# Marge supérieure : y = −(w1·x + b − 1) / w2
ax.plot(xx, -(w[0]*xx + b_val - 1)/w[1], 'k--', linewidth=1, label='Marge (+1)')
# Marge inférieure : y = −(w1·x + b + 1) / w2
ax.plot(xx, -(w[0]*xx + b_val + 1)/w[1], 'k--', linewidth=1, label='Marge (−1)')
# Points de données
ax.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm,
edgecolors='k', s=60, alpha=0.8)
# Vecteurs supports (si disponibles)
if hasattr(model, 'support_vectors_'):
ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],
s=120, facecolors='none', edgecolors='gold',
linewidths=2, label='Vecteurs supports')
ax.set_xlabel('Feature 1 (standardisée)')
ax.set_ylabel('Feature 2 (standardisée)')
ax.set_title(title)
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
plot_svm_decision_boundary(svc_linear, X_train_sc, y_train,
title="SVM Linéaire — Hyperplan et marges")
Impact du paramètre C sur la décision
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
Cs = [0.01, 1.0, 100.0]
titles = ["C=0.01 (forte régularisation)",
"C=1.0 (équilibre)",
"C=100.0 (faible régularisation)"]
for ax, C_val, title_text in zip(axes, Cs, titles):
svm = SVC(kernel="linear", C=C_val, random_state=42)
svm.fit(X_train_sc, y_train)
x_min, x_max = X_train_sc[:, 0].min()-0.5, X_train_sc[:, 0].max()+0.5
y_min, y_max = X_train_sc[:, 1].min()-0.5, X_train_sc[:, 1].max()+0.5
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 200),
np.linspace(y_min, y_max, 200))
Z = svm.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
w = svm.coef_[0]
b_svc = svm.intercept_[0]
ax.contourf(xx, yy, Z, alpha=0.2, cmap=plt.cm.coolwarm)
ax.plot(xx, -(w[0]*xx + b_svc)/w[1], 'k-', lw=2)
ax.plot(xx, -(w[0]*xx + b_svc - 1)/w[1], 'k--', lw=1)
ax.plot(xx, -(w[0]*xx + b_svc + 1)/w[1], 'k--', lw=1)
ax.scatter(X_train_sc[:, 0], X_train_sc[:, 1], c=y_train,
cmap=plt.cm.coolwarm, edgecolors='k', s=40, alpha=0.7)
ax.set_title(title_text)
ax.set_xlabel('Feature 1')
ax.set_ylabel('Feature 2')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Scores pour chaque C
for C_val in Cs:
svm = SVC(kernel="linear", C=C_val, random_state=42)
scores = cross_val_score(svm, X_train_sc, y_train, cv=5, scoring="accuracy")
print(f"C={C_val:7.2f} — Accuracy CV : {scores.mean():.4f} (±{scores.std():.4f})")
On observe visuellement comment un petit C élargit la marge (quitte à mal classer quelques points), tandis qu’un grand C réduit la marge au maximum, épousant étroitement les données d’entraînement.
Validation croisée et recherche de grille
from sklearn.model_selection import GridSearchCV
param_grid = {"C": [0.001, 0.01, 0.1, 0.5, 1.0, 5.0, 10.0, 50.0, 100.0]}
grid = GridSearchCV(SVC(kernel="linear", random_state=42),
param_grid, cv=5, scoring="accuracy", n_jobs=-1)
grid.fit(X_train_sc, y_train)
print(f"Meilleur C : {grid.best_params_['C']}")
print(f"Meilleur score CV : {grid.best_score_:.4f}")
# Évaluation sur le test set
best_model = grid.best_estimator_
y_pred_best = best_model.predict(X_test_sc)
print(f"Accuracy test set : {accuracy_score(y_test, y_pred_best):.4f}")
print(classification_report(y_test, y_pred_best))
Rapport de classification détaillé
# Matrice de confusion
cm = confusion_matrix(y_test, y_pred_best)
print("Matrice de confusion :")
print(cm)
# Rapport détaillé (précision, rappel, F1-score)
print(classification_report(y_test, y_pred_best, target_names=["Classe 0", "Classe 1"]))
Analyse de la courbe de sélection de C
# Courbe complète de l'impact de C
Cs_log = np.logspace(-4, 4, 17) # de 0.0001 à 10000
train_scores, val_scores = [], []
for C in Cs_log:
svm = SVC(kernel="linear", C=C, random_state=42)
svm.fit(X_train_sc, y_train)
train_scores.append(accuracy_score(y_train, svm.predict(X_train_sc)))
val_scores.append(svm.score(X_test_sc, y_test))
best_idx = np.argmax(val_scores)
plt.figure(figsize=(10, 5))
plt.semilogx(Cs_log, train_scores, 'b-', label='Entraînement', marker='.')
plt.semilogx(Cs_log, val_scores, 'r-', label='Validation', marker='.')
plt.axvline(x=Cs_log[best_idx], color='g', linestyle='--',
label=f'Meilleur C = {Cs_log[best_idx]:.4f}')
plt.xlabel('C (échelle logarithmique)')
plt.ylabel('Accuracy')
plt.title('Courbe de sélection de C — SVM Linéaire')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Hyperparamètres du SVM linéaire
| Hyperparamètre | Description | Valeurs typiques | Impact |
|---|---|---|---|
| C | Paramètre de régularisation. Pénalise les erreurs de classification. | 0.001 à 1000 | Petit C = marge large, tolérant ; Grand C = marge étroite, strict |
| penalty | Type de pénalité appliquée aux poids. (LinearSVC uniquement) | “l2”, “l1” | L2 favorise des poids petits ; L1 favorise la parcimonie (sélection de features) |
| loss | Fonction de coût. (LinearSVC uniquement) | “hinge”, “squared_hinge” | La hinge standard correspond au SVM classique ; squared hinge pénalise davantage les grandes erreurs |
| max_iter | Nombre maximum d’itérations de l’optimiseur. | 1000 à 10000 | Augmenter si l’algorithme ne converge pas (message d’avertissement) |
| dual | Résolution du problème dual plutôt que primal. (LinearSVC) | True (n > p), False (n < p) | Le dual est préférable quand on a plus d’observations que de features |
| fit_intercept | Calcul du biais b par l’algorithme. | True, False | Toujours True sauf si les données sont déjà centrées |
Choisir la bonne valeur de C — méthodologie pratique
Le paramètre C est le plus critique du SVM linéaire. Voici une méthodologie éprouvée pour le déterminer :
- Commencer large : tester C = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0].
- Identifier l’ordre de grandeur du meilleur C.
- Affiner autour de cette zone avec un pas plus fin (ex. C = [0.05, 0.1, 0.2, 0.5, 1.0]).
- Toujours utiliser la validation croisée (au moins 5 folds) pour évaluer chaque C.
- Vérifier la convergence : si LinearSVC ne converge pas, augmenter
max_iterou prétraiter les données.
# Pipeline complet de recherche
from sklearn.pipeline import Pipeline
# Pipeline avec standardisation intégrée
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', LinearSVC(random_state=42, max_iter=5000))
])
param_grid = {'svm__C': np.logspace(-3, 3, 13)}
grid = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy')
grid.fit(X_train, y_train) # Pas besoin de scaler manuellement !
print(f"Meilleur C : {grid.best_params_['svm__C']:.4f}")
print(f"Score test : {grid.score(X_test, y_test):.4f}")
Astuce : utiliser un
Pipelineévite les fuites de données (data leakage) entre l’étape de standardisation et la validation croisée.
Avantages du SVM linéaire
- Efficacité en haute dimension — Le SVM linéaire performe exceptionnellement bien quand le nombre de features est grand, voire supérieur au nombre d’observations. C’est le cas typique en classification de textes où chaque mot est une dimension (des milliers ou dizaines de milliers de features).
- Parcimonie structurelle — La décision ne dépend que des vecteurs supports, un sous-ensemble souvent petit des données d’entraînement. Le modèle est donc compact et rapide à l’inférence.
- Convexité garantie — Le problème d’optimisation est convexe. Il n’existe qu’un seul optimum global, contrairement aux réseaux de neurones qui peuvent rester coincés dans des minima locaux. La solution est reproductible et indépendante de l’initialisation.
- Géométrie interprétable — L’hyperplan et la marge ont une signification géométrique claire. Les poids w fournissent directement une mesure de l’importance de chaque feature dans la décision, ce qui facilite l’interprétation.
- Pas d’hypothèse distributionnelle — Le SVM ne suppose aucune distribution particulière des données (contrairement à l’analyse discriminante linéaire qui suppose une distribution gaussienne par classe avec même matrice de covariance).
- Robustesse théorique — Le SVM possède des garanties théoriques solides basées sur la théorie de l’apprentissage statistique (bornes de généralisation via la dimension VC).
Limites du SVM linéaire
- Données non linéairement séparables — Si les classes ne peuvent pas être séparées par un hyperplan, le SVM linéaire sera intrinsèquement limité. Il faut alors recourir à un noyau (RBF, polynomial) ou à un autre algorithme.
- Sensibilité au bruit et aux outliers — Un grand C rend le modèle vulnérable aux valeurs aberrantes. Un outlier proche de la frontière peut attirer l’hyperplan vers lui. La détection et le traitement des valeurs aberrantes sont essentiels.
-
Pas de probabilités natives — Le SVM produit des décisions binaires, pas des probabilités. Pour obtenir des scores probabilistes, il faut activer
probability=TruedansSVC, ce qui ajoute un calibrage par validation croisée interne (méthode de Platt) — coûteux en temps de calcul et parfois peu fiable. -
Coût computationnel pour SVC —
SVC(kernel="linear")basé sur libsvm a une complexité en O(n²·d) à O(n³·d). Pour des jeux de données dépassant quelques dizaines de milliers d’observations, LinearSVC (basé sur liblinear, complexité linéaire) est nettement préférable. - Choix de C délicat — Il n’existe pas de règle universelle pour choisir C. La recherche par grille sur une échelle logarithmique est nécessaire et peut être coûteuse.
-
Gestion du déséquilibre — Le SVM standard tend à favoriser la classe majoritaire. Il faut utiliser
class_weight="balanced"ou pondérer manuellement les classes.
Cas d’usage en pratique
1. Classification de textes
Le SVM linéaire est l’algorithme de référence pour la catégorisation de documents. Chaque document est représenté par un vecteur TF-IDF (ou un embedding) de dimension très élevée (des milliers ou dizaines de milliers de features). Le SVM linéaire excelle dans ce régime :
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.pipeline import make_pipeline
textes = [
"Ce film est magnifique et bouleversant",
"Horrible, une perte de temps totale",
"Excellent, je recommande vivement",
"Le pire que j'ai jamais vu",
"Un chef-d'oeuvre du cinéma moderne"
]
labels = [1, 0, 1, 0, 1] # 1 = positif, 0 = négatif
# Pipeline complet : vectorisation + classification
pipeline = make_pipeline(TfidfVectorizer(), LinearSVC(C=1.0))
pipeline.fit(textes, labels)
# Prédiction sur de nouveaux textes
nouveaux = ["Absolument génial", "Ennuyeux et mal joué"]
pred = pipeline.predict(nouveaux)
print(pred) # [1, 0]
Cette approche est utilisée dans les systèmes de analyse de sentiments, la catégorisation de news, le tri de tickets de support, et bien d’autres applications de traitement du langage naturel.
2. Détection de spam
La classification binaire emails légitimes / spam est un problème classique du SVM linéaire. Les features incluent la présence de mots-clés suspects, la structure de l’email, les métadonnées de l’expéditeur, la proportion de majuscules, le nombre de liens hypertextes, etc. Le SVM linéaire offre un excellent compromis précision/vitesse pour ce type de classification à grande échelle, capable de traiter des millions d’emails par jour avec une latence minimale.
3. Bioinformatique — Classification de gènes
En génomique, on dispose souvent de milliers de gènes (features) pour quelques centaines de patients (observations). Le SVM linéaire est particulièrement adapté à cette configuration p ≫ n. Il est utilisé pour distinguer des sous-types de cancers, prédire la réponse à un traitement, ou identifier des marqueurs biologiques. Les poids w du modèle permettent même d’identifier les gènes les plus discriminants, offrant une double fonctionnalité : classification et découverte biologique.
4. Diagnostic médical assisté
Le SVM linéaire est employé dans le diagnostic assisté par ordinateur pour des tâches binaires : tumeur bénigne vs maligne, présence vs absence d’une pathologie cardiaque, risque de diabète, etc. Son interprétabilité géométrique est un atout majeur en médecine, où il est crucial de comprendre pourquoi un modèle prend une décision. Les médecins peuvent examiner les poids attribués à chaque variable clinique (âge, tension, cholestérol, etc.) et valider la cohérence du modèle avec les connaissances médicales établies.
Bonnes pratiques
- Toujours standardiser les données avant d’entraîner un SVM. La standardisation (centrage-réduction) est indispensable car le SVM mesure des distances.
- Utiliser LinearSVC pour les grands jeux de données (n > 10 000) — il est beaucoup plus rapide que
SVC(kernel="linear"). - Utiliser
SVC(kernel="linear")quand on a besoin des vecteurs supports, de la méthodepredict_probaou de données non standard au format sparse. - Rechercher C sur une échelle logarithmique — les bons C sont rarement linéairement espacés. Un pas multiplicatif de 3 ou 10 est recommandé.
- Vérifier la convergence — avec LinearSVC, inspecter le message de convergence et augmenter
max_itersi nécessaire (typiquement 5000 ou 10000). - Gérer le déséquilibre des classes — utiliser
class_weight="balanced"pour compenser automatiquement les classes sous-représentées. - Utiliser un Pipeline — encapsuler la standardisation et le SVM dans un
Pipelineévite les fuites de données lors de la validation croisée. - Comparer avec la régression logistique — sur des problèmes linéairement séparables, comparez toujours les résultats du SVM avec ceux de la régression logistique pour choisir le meilleur modèle.
Conclusion
Le SVM linéaire est un pilier du machine learning supervisé. Sa simplicité conceptuelle — trouver l’hyperplan qui sépare au mieux deux classes — cache une profondeur mathématique remarquable, avec des garanties de convergence et de généralisation solides. Bien que les modèles à noyau et les réseaux de neurones aient gagné en popularité, le SVM linéaire reste un choix de premier plan pour les problèmes de classification en haute dimension, en particulier quand l’interprétabilité et la vitesse d’inférence sont prioritaires.
En français, on pourrait dire que le SVM n’est ni naïf ni approximatif : il cherche rigoureusement la meilleure séparation possible. Maîtriser le SVM linéaire, c’est comprendre un principe fondamental du machine learning : un bon modèle n’est pas celui qui colle le mieux aux données d’entraînement, mais celui qui généralise le mieux à des données invisibles. La marge maximale est l’incarnation parfaite de ce principe.
Voir aussi
- C’est vrai que je peux acheter un Iphone avec seulement 1 euro ?
- Maîtrisez le Calcul des Points de Grille dans des Cubes Lattices avec Python : Guide Complet et Tutoriels

