technique de détection d'anomalie recommandée pour le scénario simple, unidimensionnelle?

StackOverflow https://stackoverflow.com/questions/2303510

  •  21-09-2019
  •  | 
  •  

Question

J'ai un scénario où j'ai plusieurs milliers de cas de données. Les données elle-même est représenté comme une valeur unique d'entier. Je veux être en mesure de détecter lorsqu'une instance est une valeur aberrante extrême.

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 souhaite effectuer une action spécifique sur cette base.

J'ai été tenté d'essayer juste une utilisation ma connaissance du domaine particulier pour détecter les anomalies. Par exemple, trouver une distance de la valeur moyenne qui est utile, et vérifier que, sur la base heuristiques. Cependant, je pense qu'il est probablement mieux si j'étudie plus générale, les techniques de détection d'anomalies robustes, qui ont une certaine théorie derrière eux.

Depuis ma connaissance pratique des mathématiques est limité, je suis l'espoir de trouver une technique qui est simple, comme l'utilisation de l'écart-type. Espérons que la nature unique des dimensions données en fera un vrai problème commun, mais si plus d'informations pour le scénario est nécessaire s'il vous plaît laisser un commentaire et je vais donner plus d'informations.


Modifier. 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 nul. Je pense que les valeurs formeront une distribution normale. Cette attente est fondée sur une intuition du domaine plutôt que par l'analyse, si ce n'est pas une mauvaise chose à prendre, s'il vous plaît laissez-moi savoir. En termes de regroupement, à moins il y a aussi des algorithmes standards pour choisir un k-valeur, je trouverais difficile de fournir cette valeur à un algorithme k-means.

L'action que je veux prendre pour une valeur aberrante / anomalie est de présenter à l'utilisateur, et de recommander que le point de données est essentiellement retiré de l'ensemble de données (je ne vais pas dans la façon dont ils le feraient, mais il est logique pour mon domaine), ainsi il ne sera pas utilisé comme entrée à une autre fonction.

Jusqu'à présent, j'ai essayé trois sigma, et le test des valeurs aberrantes IQR sur mon ensemble limité de données. Les valeurs des drapeaux IQR qui ne sont pas assez extrême, les points trois sigma sur les instances qui mieux se adapter à mon intuition du domaine.


Information sur les algorithmes, les techniques ou des liens vers des ressources pour en apprendre davantage sur ce scénario spécifique sont des réponses valides et bienvenue.

Qu'est-ce qu'une technique de détection d'anomalie recommandée pour les données simples, une dimension?

Était-ce utile?

La solution

Consultez la trois sigma règle :

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 test de valeurs aberrantes :

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 parcelles Box (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. C'est toutefois pas applicable aux données à plusieurs variables.

@smaclell suggéré en utilisant K-means pour trouver les valeurs aberrantes. A côté du fait qu'il est principalement un algorithme de clustering (pas vraiment une technique de détection des valeurs aberrantes), le problème avec k-means est qu'il faut connaître à l'avance une bonne valeur pour le nombre de grappes K.

Une technique mieux adaptée est dbscan : un algorithme de classification basé sur la densité. Fondamentalement, il pousse les régions à densité suffisamment élevée en grappes qui seront ensemble maximal de points de densité connectés.

dbscan_clustering

dbscan nécessite deux paramètres: epsilon et minPoints. Il commence par un point arbitraire qui n'a pas été visité. Il trouve alors tous les points voisins dans les epsilon à distance 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 groupe et le point de départ est marqué comme visité. L'algorithme se répète alors le processus d'évaluation pour tous les voisins récursive.

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

Si un cluster est complètement étendu (tous les points sont à portée de visites), alors l'algorithme passe à itérer par les points inexplorées restants jusqu'à ce qu'ils soient épuisés.

Enfin, l'ensemble de tous les points marqués comme bruit sont considérée comme aberrante .

Autres conseils

Il existe une variété de techniques de regroupement, vous pouvez utiliser pour tenter d'identifier les tendances centrales au sein de vos données. Un tel algorithme, nous avons utilisé beaucoup dans mon cours de reconnaissance de modèle était K-Means . Cela vous permettra de déterminer s'il y a plus d'un ensembles de données connexes, comme un distribution bimodale . Cela ne nécessite que vous ayez une certaine connaissance du nombre de grappes d'attendre, mais est assez efficace et facile à mettre en œuvre.

Une fois que vous avez les moyens, vous pouvez alors essayer de savoir si tout point est loin d'être l'un des moyens. Vous pouvez toutefois définir « loin » que vous voulez mais je vous recommande les suggestions de @Amro comme un bon point de départ.

Pour une discussion plus approfondie des algorithmes de regroupement se réfèrent à la wikipedia entrée sur le regroupement .

Les deux règle des trois sigma et le test IQR sont souvent utilisés, et il y a 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top