Un One-Class SVM apprend la frontière de ce qui est normal à partir d'exemples normaux uniquement. Toute nouvelle observation qui tombe hors de cette frontière déclenche une alerte. C'est l'outil de la détection de nouveauté : on connaît bien le fonctionnement sain, on ignore à quoi ressemblera la panne.
Un vigile qui a observé pendant des semaines les allées et venues habituelles d'un entrepôt. Il ne connaît pas tous les cambriolages possibles, mais repère aussitôt ce qui sort de l'ordinaire.
On fournit une période où la machine fonctionnait bien. Aucun exemple de panne n'est nécessaire.
Grâce à un noyau, souvent gaussien (RBF), l'algorithme trace une frontière souple qui enveloppe l'essentiel des observations normales. Le paramètre nu fixe la part maximale d'observations d'apprentissage laissées dehors.
Chaque nouvelle observation tombe dedans (normal) ou dehors (alerte). La distance à la frontière fournit aussi un score continu.
Température et vibration relevées toutes les heures, plus l'heure de la journée codée en cercle, car la température suit un cycle de 24 h. Les 1 000 premières heures, jugées saines, servent à l'apprentissage.
Sur le jeu d'exemple, le modèle signale 5 % des heures d'apprentissage, ce que prévoit le réglage nu, et 7 % des heures 1000 à 1399. À partir de l'heure 1400, où la température monte d'un cran et la vibration dérive, presque toutes les heures sont en alerte. L'alerte devient durable dès l'heure 1412.
La colonne panne_72h marque les 72 heures qui précèdent la panne, à partir de l'heure 1928. L'alerte durable arrive plus de 500 heures avant, soit environ trois semaines. Le coût à surveiller est celui des fausses alertes en période saine, ici 5 à 7 % des heures, que l'on réduit en exigeant une alerte sur plusieurs heures consécutives.
Noms identiques en R (e1071) et Python (scikit-learn).
Borne supérieure de la part des données d'apprentissage placées hors de la frontière. En pratique, c'est à peu près le taux de fausses alertes en période saine : 0,05 donne environ 5 %.
Largeur du noyau gaussien. Grand gamma : frontière très ajustée, qui alerte sur tout ce qui s'écarte un peu de l'apprentissage. Petit gamma : frontière lisse. Par défaut, 1 / nombre de variables en R ; en Python, gamma="scale" tient aussi compte de la variance des données.
Le choix le plus important n'est pas un paramètre : c'est la période jugée normale. Elle doit couvrir les régimes habituels (jour, nuit, cadences de production), sans épisode de panne.
# Surveillance d'une machine : One-Class SVM en R
library(e1071)
capteurs <- read.csv("capteurs_machine.csv")
heure <- as.numeric(substr(capteurs$horodatage, 12, 13))
# L'heure codée en cercle : 23 h est proche de 0 h
capteurs$h_sin <- sin(2 * pi * heure / 24)
capteurs$h_cos <- cos(2 * pi * heure / 24)
X <- as.matrix(capteurs[, c("temperature", "vibration", "h_sin", "h_cos")])
# Apprentissage sur les 1000 premières heures, jugées normales (mise à l'échelle incluse)
modele <- svm(X[1:1000, ], type = "one-classification", kernel = "radial", nu = 0.05, gamma = 0.25)
# predict renvoie TRUE dans la zone normale apprise
alerte <- !predict(modele, X)
periode <- cut(0:(nrow(X) - 1), c(0, 1000, 1400, 2000), right = FALSE,
labels = c("apprentissage", "h1000-1399", "h1400-1999"))
print(round(tapply(alerte, periode, mean), 3))
# Première heure où plus de la moitié des 24 dernières heures sont en alerte
glissant <- stats::filter(as.numeric(alerte), rep(1 / 24, 24), sides = 1)
cat("Alerte durable à partir de l'heure :", min(which(glissant > 0.5)) - 1, "\n")
# Surveillance d'une machine : One-Class SVM en Python
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.svm import OneClassSVM
capteurs = pd.read_csv("capteurs_machine.csv")
heure = pd.to_datetime(capteurs["horodatage"]).dt.hour
# L'heure codée en cercle : 23 h est proche de 0 h
capteurs["h_sin"] = np.sin(2 * np.pi * heure / 24)
capteurs["h_cos"] = np.cos(2 * np.pi * heure / 24)
variables = ["temperature", "vibration", "h_sin", "h_cos"]
# Apprentissage sur les 1000 premières heures, jugées normales
normal = capteurs.iloc[:1000]
echelle = StandardScaler().fit(normal[variables])
modele = OneClassSVM(kernel="rbf", nu=0.05, gamma="scale").fit(echelle.transform(normal[variables]))
# -1 = hors de la zone normale apprise
capteurs["alerte"] = modele.predict(echelle.transform(capteurs[variables])) == -1
periode = pd.cut(capteurs.index, [0, 1000, 1400, 2000], right=False, labels=["apprentissage", "h1000-1399", "h1400-1999"])
print(capteurs.groupby(periode, observed=True)["alerte"].mean().round(3))
# Première heure où plus de la moitié des 24 dernières heures sont en alerte
glissant = capteurs["alerte"].rolling(24).mean()
print("Alerte durable à partir de l'heure :", glissant[glissant > 0.5].index.min())
Un SVM classique apprend une frontière entre deux classes étiquetées, par exemple panne et fonctionnement normal. Un One-Class SVM n'a besoin que d'une classe, la normale, et apprend la frontière qui l'enveloppe. Il sert quand les anomalies sont trop rares ou trop variées pour être apprises.
nu borne la part des données d'apprentissage classées hors de la frontière. On le fixe au taux de fausses alertes acceptable en période normale, souvent entre 0,01 et 0,05, puis on vérifie ce taux sur une période saine qui n'a pas servi à l'apprentissage.
Une détection d'anomalies où l'on apprend sur des données réputées propres, puis où l'on juge de nouvelles observations. Elle s'oppose à la détection de valeurs aberrantes, qui cherche les anomalies au sein même des données d'apprentissage. Le One-Class SVM est d'abord un outil de nouveauté.
Se passe d'une période de référence propre et passe mieux à l'échelle. Moins fin pour décrire une frontière du normal.
Voir la fiche → la version superviséeMême mécanique de noyau, mais apprend une frontière entre deux classes étiquetées.
Voir la fiche → pour les données richesApprend aussi le normal, par reconstruction. Mieux adapté aux signaux complexes et aux nombreuses variables.
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