Une forêt d'arbres qui découpent les données au hasard. Les points inhabituels se retrouvent isolés en très peu de coupes, et c'est ce qui les trahit. On l'utilise pour repérer fraudes, erreurs de saisie ou pannes quand on n'a pas, ou très peu, d'exemples étiquetés.
Au jeu du « Qui est-ce ? », le seul personnage à chapeau rouge se trouve en une question. Les personnages ordinaires en demandent beaucoup plus.
Chaque arbre prend un petit échantillon de transactions (256 dans la version d'origine). Il choisit une variable au hasard, un seuil au hasard entre son minimum et son maximum, et recommence jusqu'à isoler chaque point ou atteindre une profondeur limite.
Une transaction de 3 000 € à 3 h du matin, à 2 000 km du domicile, s'isole en deux ou trois coupes. Une transaction ordinaire est entourée de semblables et demande beaucoup plus de coupes.
La profondeur moyenne d'isolement, sur quelques centaines d'arbres, donne un score d'anomalie. Plus le chemin est court, plus la transaction est suspecte.
Montant, heure, nombre de transactions du porteur sur 24 h, distance au domicile, nouveau marchand ou non. Aucune colonne « fraude » n'est donnée au modèle.
Chaque transaction reçoit un score d'anomalie. L'équipe fraude examine d'abord les 50 plus suspectes, soit 1 % du volume. Le seuil se fixe selon sa capacité de traitement.
Les fraudes confirmées plus tard servent uniquement à vérifier : combien de vraies fraudes parmi les 50 alertes ? Sur ce jeu d'exemple, volontairement simple, toutes ou presque remontent. Sur des données réelles, le rendement est nettement plus bas.
Noms donnés pour R (isotree) et Python (scikit-learn). Le vrai réglage est le nombre d'alertes que l'équipe peut traiter.
Nombre d'arbres. Le score se stabilise vite : 100 à 300 suffisent en général. Par défaut, 500 dans isotree et 100 dans scikit-learn.
Nombre de lignes tirées par arbre. 256 est la valeur de l'article d'origine et le défaut de scikit-learn. Des petits échantillons isolent mieux les anomalies, que la masse des points normaux finirait par masquer.
Nombre de variables combinées à chaque coupe. ndim = 1 donne l'Isolation Forest classique. Le défaut d'isotree (jusqu'à 3) fait des coupes obliques : variante dite étendue, parfois plus fine, moins facile à relier aux variables.
Part d'anomalies attendue. Elle ne change pas score_samples(), seulement le seuil de décision de predict() qui classe en -1 (anomalie) ou 1 (normal). Mieux vaut trier par score et choisir le nombre d'alertes.
# Détection de fraude : Isolation Forest en R
library(isotree)
transactions <- read.csv("transactions.csv")
variables <- c("montant", "heure", "nb_transactions_24h", "distance_km", "nouveau_marchand")
# Aucune étiquette : le modèle ne voit jamais fraude_confirmee
# ndim = 1 : Isolation Forest classique, une variable par coupe
set.seed(42)
modele <- isolation.forest(transactions[, variables], ntrees = 300, sample_size = 256,
ndim = 1, seed = 42)
# Score d'anomalie : plus il est proche de 1, plus la transaction est suspecte
transactions$score <- predict(modele, transactions[, variables])
top <- transactions[order(transactions$score, decreasing = TRUE)[1:50], ]
# Contrôle après coup : combien de fraudes confirmées dans les 50 alertes ?
cat("Fraudes dans le top 50 :", sum(top$fraude_confirmee), "sur",
sum(transactions$fraude_confirmee), "\n")
print(head(top[, c(variables, "score")], 5))
# Détection de fraude : Isolation Forest en Python
import pandas as pd
from sklearn.ensemble import IsolationForest
transactions = pd.read_csv("transactions.csv")
variables = ["montant", "heure", "nb_transactions_24h", "distance_km", "nouveau_marchand"]
X = transactions[variables]
# Aucune étiquette : le modèle ne voit jamais fraude_confirmee
modele = IsolationForest(n_estimators=300, max_samples=256, random_state=42)
modele.fit(X)
# Score d'anomalie : plus il est élevé, plus la transaction est suspecte
transactions["score"] = -modele.score_samples(X)
top = transactions.sort_values("score", ascending=False).head(50)
# Contrôle après coup : combien de fraudes confirmées dans les 50 alertes ?
print("Fraudes dans le top 50 :", top["fraude_confirmee"].sum(), "sur", transactions["fraude_confirmee"].sum())
print(top[variables + ["score"]].head(5).round(2))
L'algorithme construit des arbres qui coupent les données au hasard. Un point anormal, éloigné des autres, se retrouve isolé après peu de coupes. Le score d'anomalie découle de la profondeur moyenne à laquelle chaque point est isolé : plus elle est faible, plus le point est suspect.
Dans scikit-learn, contamination ne change pas score_samples(), seulement le seuil de décision entre anomalie et normal. En pratique, on trie les lignes par score et on retient autant d'alertes que l'équipe peut en contrôler. Le taux de fraude connu du métier donne un ordre de grandeur.
Isolation Forest est plus rapide et repère bien les points éloignés de l'ensemble des données. Local Outlier Factor compare chaque point à son voisinage : il détecte mieux un point anormal au sein d'un groupe, mais coûte plus cher en calcul. Sur un gros volume, commencer par Isolation Forest.
Compare la densité autour d'un point à celle de ses voisins. Voit les points atypiques pour leur groupe, mais plus lent sur gros volumes.
Voir la fiche → la base statistiqueRepère les valeurs extrêmes variable par variable. Simple et lisible, mais aveugle aux combinaisons inhabituelles.
Voir la fiche → quand les étiquettes arriventUne fois assez de fraudes confirmées, un modèle supervisé apprend directement ce qui les distingue et devient plus précis.
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