Une machine à vecteurs de support trace la frontière qui laisse la plus grande marge possible entre les classes. En version linéaire, c'est une référence pour classer du texte : des milliers de mots en variables, un entraînement en quelques secondes et une précision souvent difficile à battre.
Tracer une route entre deux villages en s'écartant au maximum des maisons les plus proches de chaque côté.
Chaque mot devient une variable, pondérée par TF-IDF : fort si le mot est présent dans l'avis et rare dans l'ensemble des avis.
Parmi toutes les frontières qui séparent les classes, on retient celle qui s'éloigne le plus des exemples les plus proches. Ces exemples sont les vecteurs de support.
Les données réelles ne sont jamais parfaitement séparables. Le paramètre C arbitre entre une marge large et le nombre d'exemples mal placés acceptés.
Une à trois phrases par avis, déjà étiquetées positif, neutre ou négatif sur un historique. L'objectif : classer automatiquement les nouveaux avis pour alimenter un baromètre de satisfaction.
Chaque avis reçoit une classe. Les poids du modèle montrent les mots qui tirent vers le négatif, utiles pour expliquer le baromètre. Sur le jeu d'exemple, l'exactitude atteint 96 % sur les avis mis de côté.
L'exactitude globale masque où sont les erreurs. Ici, la classe neutre est la plus difficile : une partie des avis neutres est prise pour des avis négatifs. C'est ce qu'il faut suivre avant de publier un indicateur.
Noms donnés pour R (e1071) et Python (scikit-learn).
Tolérance aux erreurs. C grand : peu d'erreurs admises à l'entraînement, risque de surapprentissage. C petit : marge plus large, modèle plus robuste. À choisir par validation croisée, sur une échelle logarithmique.
Le choix des mots retenus (fréquence minimale, paires de mots) compte souvent plus que le modèle lui-même.
Pondération des classes rares, pour éviter que le modèle les sacrifie. class.weights dans e1071, class_weight="balanced" dans scikit-learn.
# Baromètre de satisfaction : SVM linéaire en R
library(tm)
library(e1071)
avis <- read.csv("avis_clients.csv", fileEncoding = "UTF-8")
corpus <- VCorpus(VectorSource(tolower(avis$texte)))
# TF-IDF calculé sur tout le corpus, pour rester simple
dtm <- DocumentTermMatrix(corpus, control = list(removePunctuation = TRUE, weighting = weightTfIdf))
X <- as.matrix(dtm)
y <- factor(avis$sentiment)
set.seed(42)
idx <- sample(nrow(X), round(0.7 * nrow(X)))
# Noyau linéaire ; scale = FALSE car le TF-IDF est déjà sur une échelle commune
modele <- svm(x = X[idx, ], y = y[idx], kernel = "linear", cost = 1, scale = FALSE)
pred <- predict(modele, X[-idx, ])
cat("Exactitude :", round(mean(pred == y[-idx]), 3), "\n")
print(table(prevu = pred, reel = y[-idx]))
# Baromètre de satisfaction : SVM linéaire en Python
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score
avis = pd.read_csv("avis_clients.csv")
textes_train, textes_test, y_train, y_test = train_test_split(avis["texte"], avis["sentiment"], test_size=0.3, random_state=42, stratify=avis["sentiment"])
# TF-IDF : un poids par mot, fort s'il est rare dans le corpus
vecto = TfidfVectorizer(min_df=2)
X_train = vecto.fit_transform(textes_train)
modele = LinearSVC(C=1.0).fit(X_train, y_train)
pred = modele.predict(vecto.transform(textes_test))
print("Exactitude :", round(accuracy_score(y_test, pred), 3))
print(confusion_matrix(y_test, pred, labels=["negatif", "neutre", "positif"]))
# Mots au poids le plus fort pour la classe « négatif »
poids = pd.Series(modele.coef_[list(modele.classes_).index("negatif")], index=vecto.get_feature_names_out())
print(poids.sort_values().tail(6).round(2))
Support Vector Machine, machine à vecteurs de support en français. Les vecteurs de support sont les exemples les plus proches de la frontière : ce sont eux seuls qui déterminent sa position. Les autres exemples pourraient disparaître sans changer le modèle.
Les deux tracent une frontière droite et donnent souvent des performances proches. La SVM se concentre sur les exemples difficiles près de la frontière ; la régression logistique donne des probabilités directement utilisables. Pour un score ou un calcul de gain, on préfère la logistique.
Pas nativement : elle donne une distance à la frontière. On peut la convertir en probabilité par calibration, avec CalibratedClassifierCV en Python ou probability = TRUE dans e1071, au prix d'un entraînement plus long.
Même principe de marge, mais la frontière peut se plier. Plus puissante, beaucoup plus lente.
Voir la fiche → encore plus rapideDes probabilités de mots multipliées. Souvent un peu moins précis, excellent sur peu de données.
Voir la fiche → l'alternative probabilistePerformance proche sur le texte, avec en plus des probabilités interprétables.
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