2010-02-20 7 views
27

J'ai un scénario où j'ai plusieurs milliers d'instances de données. Les données elles-mêmes sont représentées comme une seule valeur entière. Je veux être capable de détecter quand une instance est une aberration extrême.Technique de détection d'anomalie recommandée pour un scénario simple et unidimensionnel?

Par exemple, avec les données d'exemple suivant:

a = 10 
b = 14 
c = 25 
d = 467 
e = 12 

d est clairement une anomalie, et je voudrais effectuer une action spécifique sur cette base.

J'ai été tenté de simplement essayer et utiliser mes connaissances du domaine particulier pour détecter les anomalies. Par exemple, calculez une distance par rapport à la valeur moyenne qui est utile, et vérifiez cela en vous basant sur les heuristiques. Cependant, je pense que c'est probablement mieux si j'étudie des techniques de détection d'anomalies plus générales, robustes, qui ont une certaine théorie derrière elles. Comme ma connaissance pratique des mathématiques est limitée, j'espère trouver une technique simple, comme l'utilisation de l'écart-type. Espérons que la nature unidimensionnelle des données rendra ce problème assez commun, mais si plus d'informations pour le scénario est nécessaire s'il vous plaît laissez un commentaire et je donnerai plus d'informations.


Edit: Je pensais ajouter plus d'informations sur les données et ce que j'ai essayé dans le cas où il fait une réponse plus correcte qu'une autre.

Les valeurs sont toutes positives et non nulles. Je m'attends à ce que les valeurs forment une distribution normale. Cette attente est basée sur une intuition du domaine plutôt que par l'analyse, si ce n'est pas une mauvaise chose à supposer, s'il vous plaît faites le moi savoir. En termes de clustering, à moins qu'il y ait aussi des algorithmes standard pour choisir une valeur k, je trouverais difficile de fournir cette valeur à un algorithme k-Means. L'action que je veux effectuer pour une anomalie/anomalie est de la présenter à l'utilisateur, et de recommander que le point de données soit essentiellement retiré de l'ensemble de données (je ne vais pas comprendre comment ils le feraient, mais cela a du sens pour mon domaine), donc il ne sera pas utilisé comme entrée pour une autre fonction. Jusqu'à présent, j'ai essayé trois-sigma, et le test des valeurs aberrantes IQR sur mon ensemble de données limité. IQR signale des valeurs qui ne sont pas assez extrêmes, trois-sigma souligne les instances qui correspondent le mieux à mon intuition du domaine. Les informations sur les algorithmes, les techniques ou les liens vers des ressources pour en apprendre davantage sur ce scénario spécifique sont des réponses valides et bienvenues.

Qu'est-ce qu'une technique de détection d'anomalie recommandée pour des données simples et unidimensionnelles?

+0

Ne sous-estimez pas la valeur des connaissances scientifiques. Les procédures de boîte noire sont rarement la voie à suivre. Essayez d'exprimer vos connaissances scientifiques en termes de statistiques simples. – Tristan

+0

@ Tristan: dites-vous que vous pensez que je devrais essayer de trouver un modèle qui a des bases dans les statistiques, mais en fin de compte est spécifique à mon domaine de problème? – Grundlefleck

+1

Je dis simplement que votre connaissance de ce qui est raisonnable (c'est-à-dire, quel est le modèle qui génère les bonnes données et les mauvaises données) est une information importante. Vous devez concevoir une procédure, telle que l'utilisation de l'IQR, qui soit motivée par vos connaissances scientifiques du domaine. Je n'aime pas les choses comme k-means parce que ce n'est pas très motivé et qu'il est intrinsèquement inflexible, à mon avis. – Tristan

Répondre

40

Vérifiez la three-sigma rule:

mu = mean of the data 
std = standard deviation of the data 
IF abs(x-mu) > 3*std THEN x is outlier 

Une autre méthode est la IQR outlier test:

Q25 = 25th_percentile 
Q75 = 75th_percentile 
IQR = Q75 - Q25   // inter-quartile range 
IF (x < Q25 - 1.5*IQR) OR (Q75 + 1.5*IQR < x) THEN x is a mild outlier 
IF (x < Q25 - 3.0*IQR) OR (Q75 + 3.0*IQR < x) THEN x is an extreme outlier 

ce test est habituellement utilisé par Box plots (indiquée par les moustaches):

boxplot


EDIT:

Pour votre cas (données unidimensionnelles simples 1D), je pense que ma première réponse est bien adaptée. Cela ne s'applique toutefois pas aux données multivariées.

@smaclell suggéré d'utiliser K-means pour trouver les valeurs aberrantes. Outre le fait qu'il s'agit principalement d'un algorithme de clustering (pas vraiment une technique de détection aberrante), le problème avec k-means est qu'il nécessite de connaître à l'avance une bonne valeur pour le nombre de clusters K.

Une technique mieux adaptée est le DBSCAN: un algorithme de cluster basé sur la densité. Fondamentalement, il développe des régions avec une densité suffisamment élevée en grappes qui seront un ensemble maximal de points liés à la densité.

dbscan_clustering

dbscan nécessite deux paramètres: epsilon et minPoints. Cela commence par un point arbitraire qui n'a pas été visité. Il trouve ensuite tous les points voisins à la distance epsilon du point de départ.

Si le nombre de voisins est supérieur ou égal à minPoints, un cluster est formé. Le point de départ et ses voisins sont ajoutés à ce cluster et le point de départ est marqué comme visité. L'algorithme répète ensuite le processus d'évaluation pour tous les voisins de manière récursive.

Si le nombre de voisins est inférieur à minPoints, le point est marqué bruit.

Si une grappe est entièrement développée (tous les points à portée sont visités), l'algorithme continue de parcourir les points non visités restants jusqu'à ce qu'ils soient épuisés.

Enfin, l'ensemble de tous les points marqués comme du bruit sont considérés valeurs aberrantes.

+2

COOL! Merci pour votre merveilleuse réponse et explications. – smaclell

+2

+1 trois-sigma et IQR ressemblent à de bonnes techniques, merci pour la réponse perspicace. – Grundlefleck

+2

J'aime ce conseil simple. La statistique basée sur l'IQR a l'avantage de ne pas être influencée par des extrêmes aberrants qui modifieront la moyenne/sd. – Tristan

2

Il existe une variété de techniques de regroupement que vous pouvez utiliser pour essayer d'identifier les tendances centrales dans vos données. Un de ces algorithmes que nous avons largement utilisé dans mon cours de reconnaissance de formes était K-Means. Cela vous permet d'identifier s'il existe plusieurs ensembles de données connexes, tels qu'un bimodal distribution. Cela nécessite que vous ayez une certaine connaissance du nombre de grappes à attendre, mais qu'il soit assez efficace et facile à mettre en œuvre. Une fois que vous avez les moyens, vous pouvez alors essayer de savoir si un point est loin de l'un des moyens. Vous pouvez définir 'loin' comme vous voulez, mais je recommanderais les suggestions de @Amro comme un bon point de départ.

Pour une discussion plus approfondie des algorithmes de clustering, reportez-vous à l'entrée wikipedia sur le clustering.

+0

D'accord. K-Means est une solution simple, efficace et adaptative pour ce problème. Créez deux clusters, initialisez correctement et l'un des clusters doit contenir les données significatives tandis que l'autre obtient les valeurs aberrantes. Mais fais attention; Si vous n'avez pas de valeurs aberrantes, les deux clusters contiendront des données significatives. –

+0

Eh bien c'est là que ça devient amusant. Il est souvent très difficile de déterminer le nombre de grappes et il serait encore plus difficile de le faire dans un système en direct. Même dans ce cas d'un vrai cluster et d'un autre cluster aberrant, on pourrait soutenir que les valeurs aberrantes commencent à représenter un véritable mode pour les données. Je vais ajouter plus de liens pour fournir d'autres options. – smaclell

+0

Cela me semble être le mauvais outil pour le travail. Il s'intéresse principalement aux grosses queues, pas aux distributions bimodales. – Tristan

0

La règle trois-sigma et le test IQR sont souvent utilisés, et il existe quelques algorithmes simples pour détecter les anomalies.

The three-sigma rule is correct 
mu = mean of the data 
std = standard deviation of the data 
IF abs(x-mu) > 3*std THEN x is outlier 

Le test doit être IQR:

Q25 = 25th_percentile 
Q75 = 75th_percentile 
IQR = Q75 - Q25   // inter-quartile range 
If x > Q75 + 1.5 * IQR or x < Q25 - 1.5 * IQR THEN x is a mild outlier 
If x > Q75 + 3.0 * IQR or x < Q25 – 3.0 * IQR THEN x is a extreme outlier 
+0

Je viens de le remarquer et vous avez raison, mon test IQR n'était pas correct. Je vais mettre à jour ma réponse, merci. – Amro