Détection des valeurs aberrantes avec forêt d’isolement | par Eryk Lewinson

 Détection des valeurs aberrantes avec forêt d’isolement | par Eryk Lewinson

Apprenez à détecter efficacement les valeurs aberrantes !

Mise à jour : la partie 2 décrivant la forêt d’isolement étendu est disponible ici.

Lors d’un projet récent, je travaillais sur un problème de clustering avec des données collectées auprès des utilisateurs d’une application mobile. L’objectif était de classer les utilisateurs en fonction de leur comportement, potentiellement avec l’utilisation du clustering K-means. Cependant, après avoir inspecté les données, il s’est avéré que certains utilisateurs représentaient un comportement anormal – il s’agissait de valeurs aberrantes.

Beaucoup d’algorithmes d’apprentissage automatiquetLes hms souffrent en termes de performances lorsque les valeurs aberrantes ne sont pas prises en compte. Afin d’éviter ce genre de problème, vous pouvez, par exemple, les supprimer de votre échantillon, limiter les valeurs à un point raisonnable (basé sur la connaissance du domaine) ou transformer les données. Cependant, dans cet article, je voudrais me concentrer sur leur identification et laisser les solutions possibles pour une autre fois.

Comme dans mon cas, j’ai pris beaucoup de fonctionnalités en considération, je voulais idéalement avoir un algorithme qui identifierait les valeurs aberrantes dans un espace multidimensionnel. C’est alors que je suis tombé sur Isolation Forest, une méthode qui est en principe similaire à la forêt aléatoire bien connue et populaire. Dans cet article, je me concentrerai sur la forêt d’isolement, sans décrire en détail les idées derrière les arbres de décision et les ensembles, car il existe déjà une pléthore de bonnes sources disponibles.

L’idée principale, qui est différente des autres méthodes de détection de valeurs aberrantes populaires, est que Isolation Forest identifie explicitement les anomalies au lieu de profiler les points de données normaux. La forêt d’isolement, comme toute méthode d’ensemble d’arbres, est construite sur la base d’arbres de décision. Dans ces arbres, les partitions sont créées en sélectionnant d’abord au hasard une entité, puis en sélectionnant une valeur de division aléatoire entre la valeur minimale et maximale de l’entité sélectionnée.

En principe, les valeurs aberrantes sont moins fréquentes que les observations régulières et sont différentes d’elles en termes de valeurs (elles se situent plus loin des observations régulières dans l’espace des caractéristiques). C’est pourquoi en utilisant un tel partitionnement aléatoire, ils devraient être identifiés plus près de la racine de l’arbre (longueur de chemin moyenne plus courte, c’est-à-dire le nombre d’arêtes qu’une observation doit passer dans l’arbre allant de la racine au nœud terminal), avec moins de scissions nécessaires.

L’idée d’identifier une observation normale contre une observation anormale peut être observée dans la figure 1 à partir de [1]. Un point normal (à gauche) nécessite plus de partitions pour être identifié qu’un point anormal (à droite).

Figure 1 Identification des observations normales et anormales

Comme pour les autres méthodes de détection des valeurs aberrantes, un score d’anomalie est requis pour la prise de décision. Dans le cas de la forêt d’isolement, elle est définie comme :

h(x) est la longueur du trajet d’observation X, c(n) est la longueur moyenne du chemin d’une recherche infructueuse dans un arbre de recherche binaire et m est le nombre de nœuds externes. Plus d’informations sur le score d’anomalie et ses composants peuvent être lus dans [1].

Chaque observation se voit attribuer un score d’anomalie et la décision suivante peut être prise sur sa base :

  • Un score proche de 1 indique des anomalies
  • Un score bien inférieur à 0,5 indique des observations normales
  • Si tous les scores sont proches de 0,5, l’ensemble de l’échantillon ne semble pas présenter d’anomalies clairement distinctes

D’accord, voyons maintenant un exemple pratique. Pour simplifier, je vais travailler sur un jeu de données artificiel en 2 dimensions. De cette façon, nous pouvons surveiller le processus d’identification des valeurs aberrantes sur une parcelle.

Tout d’abord, je dois générer des observations. Je vais commencer par des observations qui seront considérées comme normales et qui seront utilisées pour entraîner le modèle (entraînement et notation en Python scikit-learn l’implémentation d’Isolation Forest sont analogues à tous les autres algorithmes d’apprentissage automatique). Le deuxième groupe est constitué de nouvelles observations, provenant de la même distribution que celles d’apprentissage. Enfin, je génère des valeurs aberrantes.

# importing libaries ----
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import savefig
from sklearn.ensemble import IsolationForest
# Generating data ----

rng = np.random.RandomState(42)

# Generating training data
X_train = 0.2 * rng.randn(1000, 2)
X_train = np.r_[X_train + 3, X_train]
X_train = pd.DataFrame(X_train, columns = ['x1', 'x2'])

# Generating new, 'normal' observation
X_test = 0.2 * rng.randn(200, 2)
X_test = np.r_[X_test + 3, X_test]
X_test = pd.DataFrame(X_test, columns = ['x1', 'x2'])

# Generating outliers
X_outliers = rng.uniform(low=-1, high=5, size=(50, 2))
X_outliers = pd.DataFrame(X_outliers, columns = ['x1', 'x2'])

La figure 2 présente l’ensemble de données généré. Comme vous le souhaitez, les observations d’entraînement et « normales » sont essentiellement empilées les unes sur les autres, tandis que les valeurs aberrantes sont réparties. En raison de la nature aléatoire des valeurs aberrantes, certaines d’entre elles se chevauchent avec les observations d’entraînement/normales, mais j’en tiendrai compte plus tard.

Figure 2 Jeu de données généré

Maintenant, je dois entraîner la forêt d’isolement sur l’ensemble d’entraînement. J’utilise les paramètres par défaut ici. Une chose à noter est le paramètre de contamination, qui spécifie le pourcentage d’observations que nous pensons être des valeurs aberrantes (scikit-learnla valeur par défaut est 0,1).

# Isolation Forest ----

# training the model
clf = IsolationForest(max_samples=100, random_state=rng)
clf.fit(X_train)

# predictions
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

Bon, maintenant nous avons les prédictions. Comment évaluer les performances ? Nous savons que l’ensemble de test ne contient que des observations de la même distribution que les observations normales. Ainsi, toutes les observations de l’ensemble de test doivent être classées comme normales. Et vice versa pour l’ensemble des valeurs aberrantes. Regardons la précision.

# new, 'normal' observations ----
print("Accuracy:", list(y_pred_test).count(1)/y_pred_test.shape[0])
# Accuracy: 0.93
# outliers ----
print("Accuracy:", list(y_pred_outliers).count(-1)/y_pred_outliers.shape[0])
# Accuracy: 0.96

Au début, cela semble assez bon, surtout compte tenu des paramètres par défaut, cependant, il reste un problème à considérer. Comme les données aberrantes ont été générées de manière aléatoire, certaines des valeurs aberrantes sont en fait situées dans les observations normales. Pour l’inspecter plus attentivement, je tracerai l’ensemble de données d’observation normal avec un ensemble de valeurs aberrantes étiquetées. Nous pouvons voir que certaines des valeurs aberrantes situées dans les ensembles d’observations normales ont été correctement classées comme des observations régulières, quelques-unes d’entre elles étant mal classées. Ce que nous pourrions faire, c’est essayer différentes spécifications de paramètres (contamination, nombre d’estimateurs, nombre d’échantillons à prélever pour trier les estimateurs de base, etc.) pour obtenir un meilleur ajustement. Mais pour l’instant, ces résultats sont satisfaisants.

Figure 3 Inspection de la classification des valeurs aberrantes
  • La forêt d’isolement est une technique de détection des valeurs aberrantes qui identifie les anomalies au lieu des observations normales
  • De la même manière que Random Forest, il est construit sur un ensemble d’arbres binaires (d’isolement)
  • Il peut être mis à l’échelle pour gérer de grands ensembles de données de grande dimension

C’était mon premier article ici et au cas où j’en écrirais d’autres, j’essaierai d’améliorer le niveau d’écriture et d’édition. Comme toujours, tout commentaire constructif est le bienvenu. Vous pouvez me contacter sur Twitter ou dans les commentaires.

Le code utilisé dans cet article se trouve sur mon GitHub.

Vous pourriez également être intéressé par un algorithme de détection des valeurs aberrantes plus simple, le filtre de Hampel. J’ai écrit un court article là-dessus ici.

Vous avez aimé l’article ? Devenez membre Medium pour continuer à apprendre en lisant sans limites. Si tu utilises ce lien pour devenir membre, vous me soutiendrez sans frais supplémentaires pour vous. Merci d’avance et à bientôt !

[1] Liu, F.T., Ting, K.M., & Zhou, Z.H. (2008, décembre). Forêt d’isolement. Dans Exploration de données, 2008. ICDM’08. Huitième conférence internationale de l’IEEE sur (pp. 413-422). IEEE.

[2] http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html




Source de l’article

A découvrir