Accueil / Factory / Algos ML / MARS — factory / algos ML / apprentissage supervisé

MARS SPLINES ADAPTATIVES.

Multivariate Adaptive Regression Splines : une régression faite de morceaux de droites, raccordés à des nœuds que l'algorithme trouve seul. Là où une régression linéaire tire une seule droite, MARS repère le moment où la pente change. Le résultat reste une équation lisible, avec ses seuils.

RégressionNon linéaireDétection de seuilsModèle interprétableNiveau : avancé

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceCapte seuils et coudes, proche d'un GAM en précision
InterprétabilitéUne équation avec des seuils explicites
VitesseRecherche exhaustive des nœuds, rapide sur des volumes moyens
Facilité de réglageRéglages par défaut raisonnables, élagage automatique
Tolérance aux données brutesPas de normalisation, mais manquants à traiter
EN 30 SECONDES

Un géomètre qui trace une route de montagne avec une règle droite. Il pose un segment, repère l'endroit où la pente change, y plante un piquet et repart avec une nouvelle pente.

1. On teste tous les nœuds possibles

Pour chaque variable et chaque valeur candidate, on essaie une paire de « charnières » : une droite nulle avant le nœud, qui monte après, et son miroir. On garde la paire qui réduit le plus l'erreur.

2. On ajoute des charnières tant que ça aide

L'algorithme répète la recherche, et peut croiser deux charnières pour représenter une interaction entre variables.

3. On élague

Le modèle obtenu est trop riche. On retire une à une les charnières les moins utiles, selon un critère qui pénalise la complexité (GCV).

LE CAS MÉTIER

maintenance prédictive · industrie / transport / énergie
EN ENTRÉE

La vibration d'une machine, heure par heure

2 000 heures de mesures de vibration sur un équipement. Question du responsable maintenance : à partir de quand la vibration a-t-elle commencé à dériver, et à quel rythme ?

EN SORTIE

Un seuil et une pente

Sur le jeu d'exemple, le nœud tombe à l'heure 1400. Avant, la vibration est stable ; après, elle augmente d'environ 0,074 unité par jour. On peut dater le début de l'usure et projeter la date d'atteinte d'un seuil d'alerte.

CE QU'ON MESURE

L'erreur, comparée à une droite

L'erreur quadratique moyenne passe de 0,207 avec une droite à 0,089 avec les deux charnières. En R, le R² généralisé (GRSq) pénalise les nœuds en trop : c'est lui qu'on regarde pour comparer des modèles.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Relations avec seuils ou coudes : effet qui démarre après un certain âge, une certaine charge, une certaine date
  • Besoin d'une équation lisible avec des seuils explicites
  • Détection automatique d'interactions entre deux variables
  • Alternative interprétable à un modèle à base d'arbres

NON

  • Relations très lisses et régulières : un GAM donne des courbes plus naturelles
  • Recherche de la précision maximale sur données tabulaires : gradient boosting
  • Série avec plusieurs ruptures de niveau brusques : les méthodes de détection de ruptures sont faites pour ça
  • Écosystème Python seul en production : pas de bibliothèque MARS maintenue
LES 3 RÉGLAGES QUI COMPTENT

Noms donnés pour le package R de référence, earth.

degree

Degré d'interaction. 1 : effets additifs seulement, comme un GAM par morceaux. 2 : autorise le produit de deux charnières, donc des interactions entre deux variables.

nprune

Nombre maximal de termes après élagage. Le réduire donne une équation plus courte, à lire en comité.

penalty

Coût d'un nœud dans le critère GCV. Par défaut 2 (3 si degree > 1). L'augmenter donne moins de nœuds, donc un modèle plus simple.

LE CODE MINIMAL

jeu d'exemple : capteurs_machine.csv ↓
# Dérive des vibrations d'une machine : MARS en R
library(earth)

capteurs <- read.csv("capteurs_machine.csv")
capteurs$heure <- seq_len(nrow(capteurs)) - 1   # heures depuis le début du suivi

# MARS cherche seul les nœuds, puis élague les charnières inutiles (critère GCV)
modele <- earth(vibration ~ heure, data = capteurs)
print(summary(modele))   # termes h(heure-...) : nœuds et pentes

# Nœuds retenus après élagage
noeuds <- modele$cuts[modele$selected.terms, "heure"]
cat("Nœuds retenus (heure) :", unique(noeuds[noeuds > 0]), "\n")
cat("R² :", round(modele$rsq, 3), "| R² généralisé (GCV) :", round(modele$grsq, 3), "\n")

# Comparaison avec une simple droite
droite <- lm(vibration ~ heure, data = capteurs)
cat("R² d'une droite :", round(summary(droite)$r.squared, 3), "\n")

# Avec plusieurs variables et leurs interactions : earth(y ~ ., data, degree = 2)

QUESTIONS FRÉQUENTES

Qu'est-ce qu'une fonction charnière dans MARS ?

C'est une fonction nulle d'un côté d'un seuil et linéaire de l'autre, notée h(x - c) ou max(0, x - c). En additionnant plusieurs charnières, MARS construit une ligne brisée dont les coudes tombent aux seuils c trouvés dans les données.

Quelle différence entre MARS et un arbre de décision ?

Les deux cherchent des seuils. L'arbre prédit une valeur constante dans chaque zone, ce qui donne des marches d'escalier. MARS prédit des droites raccordées, donc une prévision continue qui suit mieux une tendance.

Peut-on utiliser MARS en Python ?

Le package py-earth n'est plus maintenu et s'installe mal sur les versions récentes de Python. En pratique, MARS se fait en R avec earth. En Python, on peut reproduire l'idée pour un seul nœud, comme dans le code, ou passer à un GAM.

LES ALGOS VOISINS

à comparer avant de choisir
des courbes lisses

Modèle additif généralisé (GAM)

Même idée d'effets non linéaires par variable, avec des courbes plutôt que des segments.

Voir la fiche →
des marches d'escalier

Arbre de décision (CART)

Découpe aussi par seuils, mais donne des paliers plats au lieu de pentes continues.

Voir la fiche →
pour les séries temporelles

Détection de ruptures

Repère les changements de régime d'une série, y compris plusieurs sauts de niveau.

Voir la fiche →
— formation

Passer de la fiche à la pratique

Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.

Voir les formations →