Détection d'anomalies: quel algorithme utiliser?

10

Contexte: Je développe un système qui analyse les données cliniques pour filtrer les données invraisemblables qui pourraient être des fautes de frappe.

Ce que j'ai fait jusqu'à présent:

Pour quantifier la plausibilité, ma tentative jusqu'à présent était de normaliser les données, puis de calculer une valeur de plausibilité pour le point p en fonction de sa distance aux points de données connus dans l'ensemble D (= l'ensemble d'apprentissage):

plausibility(p)=qDGauss(distance(p,q))

Avec cette quantification, je peux ensuite sélectionner un seuil qui sépare les données plausibles des données invraisemblables. J'utilise python / numpy.

Mes problèmes:

  1. Cet algorithme ne peut pas détecter les dimensions indépendantes. Idéalement, je pourrais mettre tout ce que je sais de l'enregistrement dans l'algorithme et le laisser découvrir par lui-même que la dimension X n'influence pas la plausibilité de l'enregistrement.
  2. L'algorithme ne fonctionne pas vraiment pour les valeurs discrètes comme les booléens ou les entrées de sélection. Ils peuvent être mappés sur des valeurs continues, mais il est contre-intuitif que Select 1 soit plus proche de Select 2 que de Select 3.

Question:

Quel type d'algorithmes dois-je étudier pour cette tâche? Il semble y avoir une tonne d'options, y compris les approches basées sur le voisin le plus proche, les clusters et les statistiques. De plus, j'ai du mal à trouver des articles traitant de la détection des anomalies de cette complexité.

Tout conseil est fortement apprécié.

[Modifier] Exemple:

Supposons que les données se composent de la taille d'une personne, du poids d'une personne et de l'horodatage - il s'agit donc de données 3D. Le poids et la taille sont corrélés, mais l'horodatage est complètement indépendant. Si je considère uniquement les distances euclidiennes, je devrais choisir un petit seuil pour s'adapter à la plupart de mes données de validation croisée. Idéalement, l'algorithme ignorerait simplement la dimension d'horodatage, car il n'est pas pertinent de déterminer si un enregistrement est plausible, car l'horodatage n'est en aucun cas en corrélation avec les autres dimensions. Tout horodatage est plausible.

D'un autre côté, on pourrait inventer des exemples où l'horodatage est important. Par exemple, il se peut que la valeur Y pour la caractéristique X soit plausible lorsqu'elle est mesurée avant une certaine date, mais pas après une certaine date.

Georg
la source
Veuillez consulter ma réponse à stats.stackexchange.com/questions/97946/changepoints-in-r car il traite cette question vexante (pour certains!).
IrishStat
Est-ce que stats.stackexchange.com/questions/213 serait le genre de chose que vous recherchez?
whuber
Je doute que vous puissiez faire cela pour les booléens.
Aksakal
@whuber Je ne suis pas sûr, cela ne semble pas couvrir comment les dimensions non pertinentes peuvent être ignorées.
Georg
1
Soit dit en passant, j'ai aussi du mal à trouver une formalisation pour l'approche que j'ai décrite. Si je connaissais le terme officiel, cela m'aiderait également dans mes recherches. Il existe peut-être une variante de cet algorithme qui résout au moins le problème de dimension indépendante / non pertinente.
Georg

Réponses:

7

Une formulation typique de la détection des anomalies consiste à trouver la moyenne et la variance pour chacune des caractéristiques des données non anormales et si est un vecteur de ces caractéristiques ayant les composantes puis définir la probabilité d'une combinaison de caractéristiques commex x i p ( x )mxxip(x)

p(x)=i=1mp(xi;μi,σi2)

où chaque est distribué gaussien:x iN ( μ i , σ 2 i )xixiN(μi,σi2)

une anomalie se produit chaque fois quep(x)<ϵ

La distribution de chaque n'a pas besoin d'être réellement normale, mais il vaut mieux qu'elle soit au moins normale. Mais les fonctionnalités que vous utilisez sont arbitraires; ils peuvent être pris directement à partir des données brutes ou calculés. Par exemple, si vous pensez qu'une fonction est mieux modélisée à l'aide de définissez la fonction sur plutôt que .xixiloglog(xi)xi

Cela semble être très similaire à ce que vous faites déjà si vous prenez .q=μ

Déterminerϵ

L'algorithme est adapté à des exemples négatifs (non-anomalies). Mais est déterminé à partir de l'ensemble de validation croisée et est généralement sélectionné comme la valeur qui fournit le meilleur scoreϵF1

F1=2PrecisionRecallPrecision+Recall

Mais pour calculer la F1, vous devez savoir ce qui est anormal et ce qui ne l'est pas; c'est-à-dire que les vrais positifs sont lorsque le système prédit une anomalie et qu'il s'agit en fait d'une anomalie, les faux positifs sont des anomalies prédites qui ne le sont pas et ainsi de suite. Donc, à moins que vous n'ayez cela, vous devrez peut-être retomber dans les conjectures.

Le problème des fonctionnalités corrélées

Ce qui précède présente cependant un inconvénient si les caractéristiques sont corrélées. S'ils le sont, le calcul ci-dessus peut ne pas signaler quelque chose d'anormal. Un correctif est d'utiliser la gaussienne multivariée pour entités où est la matrice de covariance.mΣ

p(x)=1(2π)m2(detΣ)1/2e12(xμ)TΣ1(xμ)

La même chose vaut pour trouver et cette approche a aussi un inconvénient qui est que vous devez calculer l'inverse de . Il doit donc y avoir au moins autant d'échantillons que de fonctionnalités et si le nombre de fonctionnalités est important, le processus sera gourmand en calculs, et vous devez vous prémunir contre les fonctionnalités linéairement dépendantes. Gardez ces mises en garde à l'esprit, mais il semble que ce ne soit pas un problème.ϵΣ

waTeim
la source
J'ai déjà essayé cette approche, y compris la distribution gaussienne multivariée. En effet, les fonctionnalités non liées ne posent pas vraiment de problème avec cette approche. Ce que j'ai trouvé, c'est que cette approche ne convient pas aux modèles complexes. Par exemple, si j'avais un jeu de données 2D avec les fonctionnalités F1, F2 où il se trouve que grossièrement F2 = F1 ^ 3, la distribution gaussienne multivariée ne dessinera qu'une ellipse autour des données et modélisera les données très grossièrement. C'est pourquoi j'ai opté pour l'approche décrite dans la question (où il n'y a pas un q mais plusieurs q).
Georg
Alors, existe-t-il un moyen de prendre l'approche gaussienne multivariée et de l'appliquer pour capturer des modèles de données plus complexes? Par exemple, les modèles de mélange pourraient-ils m'aider dans ce cas? J'ai lu un peu sur ceux-ci dans mes recherches, mais je n'ai pas encore compris comment les appliquer.
Georg
@Georg Hmm Je me demande si votre problème n'est pas un problème de modèles complexes, mais des données complexes et des modèles trop simplistes. Ou en d'autres termes sous-ajusté. Dans le cas ci-dessus, que se passe-t-il si au lieu d'utiliser vous utilisez ? Les caractéristiques peuvent être extraites des données ou calculées. (F1,F2)(F1,F21/3)
waTeim
Oui, le sous-ajustement est ce que je veux dire. Et oui, cela fonctionnerait, mais je veux que l'algorithme le détecte automatiquement. Je ne peux pas modifier manuellement les fonctionnalités, cela devrait fonctionner dans tous les cas.
Georg
Voici un exemple: les deux tracés affichent des données pour la hauteur (axe x) et le poids (axe y) (Désolé pour les légendes allemandes;)). Le premier graphique montre le résultat de l'approche gaussienne multivariée, le second de l'approche décrite dans la question. Dans les deux cas, le seuil a été choisi de telle sorte que 97% des données CV sont considérées comme plausibles. La deuxième approche permet de mieux saisir la complexité des données. 1: dl.dropboxusercontent.com/u/26034024/anomaly/gauss.png 2: dl.dropboxusercontent.com/u/26034024/anomaly/distance.png
Georg
3

J'ai presque terminé le projet où j'avais besoin de résoudre ces problèmes et je voudrais partager ma solution, au cas où quelqu'un aurait les mêmes problèmes.

Tout d'abord, l'approche que j'ai décrite est très similaire à une estimation de densité de noyau . Donc, c'était bon à savoir pour la recherche ...

Caractéristiques indépendantes

Les entités indépendantes peuvent être filtrées en mesurant son coefficient de corrélation . J'ai comparé toutes les fonctionnalités par paire et mesuré la corrélation. Ensuite, j'ai pris le coefficient de corrélation absolu maximum de chaque entité comme facteur d'échelle. De cette façon, les entités qui ne sont pas en corrélation avec une autre sont multipliées par une valeur proche de 0 et donc leur effet sur la distance euclidienne(aka ) est négligeable.||x1x2||distance(x1,x2)

Attention: le coefficient de corrélation ne peut mesurer que des corrélations linéaires. Voir la page wiki liée pour plus de détails. Si la corrélation dans les données peut être approchée linéairement, cela fonctionne bien. Sinon, vous devriez jeter un œil à la dernière page de cet article et voir si vous pouvez utiliser leur mesure de corrélation pour trouver un facteur d'échelle.

Valeurs discrètes

J'ai utilisé l'algorithme décrit uniquement pour les valeurs de continuos. Des valeurs discrètes ont été utilisées pour filtrer l'ensemble d'apprentissage. Donc, si j'ai la taille et le poids d'une personne et que je sais qu'elle est une femme, je ne regarderai que des échantillons d'autres femmes pour vérifier s'il y a une anomalie.

Georg
la source