[PYTHON] Introduction à la détection des anomalies 3 Détection des points de changement

Aidemy 2020/11/10

introduction

Bonjour, c'est Yope! Je suis une école littéraire croustillante, mais j'étais intéressé par les possibilités de l'IA, alors je suis allé à l'école spécialisée en IA "Aidemy" pour étudier. Je voudrais partager les connaissances acquises ici avec vous, et je les ai résumées dans Qiita. Je suis très heureux que de nombreuses personnes aient lu l'article de synthèse précédent. Merci! Ceci est le troisième poste de détection d'anomalies. Ravi de vous rencontrer.

Quoi apprendre cette fois ・ Changez la détection en utilisant la méthode de somme cumulative ・ Détection de pièces anormales par méthode de proximité ・ Méthode de conversion du spectre singulier

Détection des changements par la méthode de la somme cumulative

Qu'est-ce que la méthode de la somme cumulée?

-__ La méthode de somme cumulative __ est une méthode de __ "détection de changement" __ qui détecte __change point __ (voir le chapitre 1). Contrairement à la détection des valeurs aberrantes, la détection des changements provoque __ "anomalie continue" __, donc la méthode de somme cumulative qui peut détecter cela est utilisée. -Dans la méthode de la somme cumulative, «l'état anormal (degré de changement)» est compté __ le long du temps __, et lorsque le compte (somme cumulée) dépasse la valeur seuil, il est déterminé comme anormal. En d'autres termes, on peut dire que cette méthode convient pour détecter une anomalie d'une certaine valeur dans des données de séries chronologiques.

-Le déroulement de la méthode de la somme cumulée (lorsque le changement est à la hausse, c'est-à-dire lorsqu'il est anormal d'augmenter) est le suivant. (1) Définissez le degré de changement __ en donnant une ligne directrice pour les heures normales et une ligne directrice pour la hausse. (2) Trouvez la __ somme cumulative supérieure du degré de changement __ ③ S'il dépasse le seuil, il est jugé anormal.

(1) Définissez le degré de changement en donnant une ligne directrice pour les heures normales et une ligne directrice pour la hausse.

-__ Degré de changement __ est une valeur indiquant à quel point les données sont passées à un état anormal. ・ Ici, le degré de changement est défini, mais pour cela, __ "valeur à prendre lorsque normal (μ)" et "valeur à la hausse à juger anormale (ν +)" __ sont définis à l'avance (cas passés). Besoin d'obtenir (analyser). -Aussi, trouvez __ "écart type (σ)" __ à partir des données. __ Obtenu par "np.std ()" __. ・ Une fois calculé jusqu'à présent, le __change degré (a + (t)) __ au temps t peut être calculé comme suit. $ a_{+}(t) = \left( \frac{\nu _{+}}{\sigma} \right)\frac{{ x(t)} - \mu - \nu _{+} / 2}{\sigma} $ (La formule __ "x (t)" __ est la valeur observée au temps t)

-En conséquence, lorsque les données sont normales, le degré de changement devient négatif, et lorsque les données sont anormales, elles deviennent positives, de sorte qu'il est possible de traiter avec la somme cumulée. -Aussi, cette fois, nous avons considéré le moment où le changement était à la hausse, mais le même calcul peut être fait lorsque le changement est à la baisse.

・ Code (calculer le degré de changement comme 10 pour la normale et 14 pour la hausse) スクリーンショット 2020-11-05 22.33.06.png

·résultat スクリーンショット 2020-11-05 22.33.56.png

(2) Trouvez la somme cumulative supérieure du degré de changement

・ Étant donné que le degré de changement a été calculé dans la section précédente, il sera accumulé ensuite. Dans le degré de changement défini dans la section précédente, il prend une valeur négative lorsqu'il est normal, mais lorsqu'il s'accumule, il doit être __ lorsqu'il est normal __. En d'autres termes, le degré de changement n'augmente que lorsque __ est anormal __. Il s'agit de la somme cumulée __ supérieure __. -Le calcul de la somme cumulée supérieure est effectué en prenant le degré de changement un par un en utilisant for loop et en les additionnant. Plus précisément, c'est comme suit.

スクリーンショット 2020-11-06 11.11.57.png

・ Explication du code ci-dessus -Dans la plage __ "(x.size --1)" __ partie de l'instruction for, __ "-1" __ est la somme cumulative supérieure jusqu'au temps t est __ "t-1" Puisqu'il est calculé par "le degré total de changement de + le degré de changement de t" , il est extrait de cette manière pour exprimer ce "t-1". - "Max (0, x_cumsum [i])" __ indique que le tableau qui stocke la somme cumulée est __ "stocke 0 et celui avec le plus grand degré de changement" __. ・ __ "x_cumsum [i + 1] = x_cumsum [i] + x [i + 1]" __ "i + 1" __ est en fait __ parce que __i représente t-1 Indique qu'il s'agit de "t".

・ Le graphique de la somme cumulée supérieure est le suivant. スクリーンショット 2020-11-06 11.21.22.png

③ S'il dépasse le seuil, il est jugé anormal.

-Après cela, comme dans la méthode conventionnelle, il suffit de comparer la valeur seuil et la somme cumulée pour déterminer si elle est anormale ou non. -Aussi, afin de trouver le point où le seuil est dépassé pour la première fois, c'est-à-dire le "point de changement", __ "l'indice où pred == 1 est obtenu pour la première fois entre 0 et l'amplitude de la somme cumulée" __ , Peut être décrit comme suit.

np.arange(score_cumsum.size)[pred==1][0]

・ "Np.arange limite la plage à la taille de 0 ~ somme cumulée et se réfère à chacun, et __ [pred == 1] __ extrait la partie jugée anormale pour la première fois, et __ [0 ] __ pour récupérer l'index "est terminé.

・ Voici ce que j'ai fait à propos de l'anomalie. スクリーンショット 2020-11-06 11.40.03.png

·résultat スクリーンショット 2020-11-06 11.40.13.png

Détection de pièces anormales par méthode de proximité

Fenêtre coulissante, série chronologique partielle

-Cette fois, les données de la série chronologique sont détectées par __ "détection des valeurs aberrantes" __. Dans la méthode de la somme cumulée jusqu'à la section précédente, vous deviez préparer vous-même le seuil et les paramètres de calcul du point de changement, ce qui avait l'inconvénient de __ pas très pratique __, mais en utilisant la méthode __near __ Donc, ce problème peut être résolu. ・ La détection des valeurs aberrantes ne convient pas pour détecter les changements dans les données de séries chronologiques, mais c'est parce que __ les données continues telles que les données de séries chronologiques ne peuvent pas être observées. Dans cette méthode de voisinage, cela est rendu possible en __développant __ pour résoudre un tel problème.

スクリーンショット 2020-11-06 11.59.13.png

-Le code est comme suit. Après avoir converti les données de __une dimension en deux dimensions __, divisez les données en fonction du nombre de fenêtres de diapositives __M __ et créez-les en __extrait __.

・ Code (convertit 550 données x en données de séries chronologiques partielles) スクリーンショット 2020-11-06 14.09.51.png

-Lorsque ce qui précède est exécuté, la longueur des données dans la série temporelle partielle devient __ "((nombre de données --M + 1), M)" __.

Calcul des anomalies

・ Après avoir créé des données de séries chronologiques partielles, calculez le degré d'anomalie. Cette fois, nous utiliserons __ "méthode du plus proche voisin" __ avec la distance au plus proche voisin comme degré d'anomalie. Voir le chapitre 2 pour plus de détails. Utilisez KNeiborsClassifier pour calculer la distance au __ le plus proche. -Réglez __ "n_neighbors" __ cette fois à _2 au lieu de 1. En effet, le voisinage le plus proche des données est traité comme __ "les données elles-mêmes" __. Par conséquent, la distance de proximité la plus proche est __ "distance de la deuxième donnée la plus proche" __. -Par conséquent, __ "clf.kneighbors ()" __ peut être utilisé pour calculer la distance de proximité de chaque donnée, et __ "dist [:, 1]" __ peut être utilisé pour obtenir la distance de la deuxième donnée la plus proche. ..

·code スクリーンショット 2020-11-06 14.38.01.png

Réglage du seuil, jugement d'anomalie

・ Ensuite, définissez le seuil. Étant donné que cette méthode ne définit pas la distribution des données, définissez le seuil de sorte qu'il soit identique à ___1 classe SVM. -Spécifiquement, utilisez __ "st.scoreatpercentile ()" __. __ En supposant que "les données contiennent des données anormales à un certain taux" __, définissez le taux __ "a" __ et passez le degré d'anomalie "distances" pour définir le seuil. ・ Cette fois, nous voulons dire que plus le degré d'anomalie est grand, plus il est anormal, donc le point de partition passé à l'argument est __ "100-a" __.

・ Code (lorsque le top 30% est le point de division)![Screenshot 2020-11-06 14.52.20.png](https: //qiita-image-store.s3.ap-northeast-1.amazonaws. com / 0/698700 / 467fc634-211b-a03c-5d62-f8989f0edf3c.png)

Méthode de conversion du spectre singulier

Matrice d'historique et matrice de test

・ En séparant le passé et le présent des données de séries chronologiques partielles jusqu'à la section précédente, il est devenu possible d'envisager des distributions plus avancées. La __ "méthode de conversion de spectre singulier" __ que nous allons apprendre cette fois en trouve deux, __ "un vecteur qui représente les données actuelles et" __ "une donnée qui représente les données passées" en définissant cette distribution avancée. Il s'agit d'une méthode de détection des anomalies en utilisant la différence entre les deux comme point de changement. ・ Le déroulement de la méthode de conversion de spectre singulier est le suivant. (1) Donnez window width M, le nombre de lignes dans la matrice d'historique n, le nombre de colonnes dans la matrice de test k et le décalage L pour les données de séries temporelles. ② Convertir les données en __ données de série chronologique partielle de largeur de fenêtre M __ ③ Créez une matrice __history __ et une matrice __test __ ④ La matrice d'historique et la matrice de test sont décomposées par __ valeur singulière __, et chaque __ matrice vectorielle singulière gauche __ est obtenue. ⑤ _ Calculez le degré de changement à partir de la différence entre les deux matrices __

-La __ "matrice d'historique" __ qui apparaît ci-dessus est "une collection de n données du __time __ précédent". De plus, __ "matrice de test" __ est "une liste de données __ qui avance __L (décalage) à partir de l'heure actuelle et est jusqu'à k avant". Voir ci-dessous visuellement.

スクリーンショット 2020-11-06 15.16.20.png

・ Pour ①, __ "M = 50, n = 25, k = 25, L = 13" __ sera utilisé cette fois. -Pour (2), la conversion en données chronologiques partielles est effectuée de la même manière que la méthode utilisée dans __ "Détection des parties anormales par la méthode du voisinage" __. ・ Pour ③, reportez-vous à ce qui suit pour savoir comment créer une matrice d'historique et une matrice de test à partir des données de série temporelle partielle (X_pts) créées dans ②.

スクリーンショット 2020-11-06 15.26.38.png

(4) Décomposez la matrice d'historique et la matrice de test en valeurs singulières et trouvez la matrice de chaque vecteur singulier gauche.

-En effectuant __ "Approximation basse couche de décomposition de valeurs singulières" __ pour la matrice d'historique et la matrice de test créées dans (3), il est possible de trouver la valeur qui représente la __matrix. -En tant que code, lors de la décomposition de la matrice A de (m × n) en valeurs singulières, utilisez __ "np.linalg.svd (A)" __. Préparez trois variables à stocker: __ "U, S, V" __. Cette fois, nous utiliserons __ "U" __. U contient un vecteur singulier __gauche __. Le vecteur singulier gauche est un vecteur représentatif __ de __matrix A, et U est une matrice arrangée par ordre décroissant de priorité, donc __hierarchy "r" comme indiqué ci-dessous. En spécifiant avec __, vous pouvez récupérer le vecteur représentatif avec une priorité plus élevée. -En outre, la forme de U est __ (le nombre de lignes dans la matrice, le nombre de fenêtres M, le nombre de vecteurs singuliers à gauche) __, donc lors d'une approximation de couche basse, le __ème axe est tranché. À __.

スクリーンショット 2020-11-06 15.46.19.png

-Code qui a fait ces ([0] partie extrait uniquement "U") スクリーンショット 2020-11-06 15.49.42.png

⑤ Calculez le degré de changement à partir de la différence entre les deux matrices

・ Trouvez la différence __ des deux vecteurs singuliers __gauche créés dans la section précédente. La différence est calculée par le produit interne de vectors. Cette fois, l'ensemble des vecteurs, c'est-à-dire le produit interne des matrices est calculé par __ "np.matmul ()" __, et la distance est calculée par __ "np.linalg.norm ()" __. ・ Si cette distance est normale, le degré de changement peut être calculé par __ "1-norme" __.

-Le code qui fait cela est le suivant. スクリーンショット 2020-11-07 9.55.34.png

・ Résultat![Capture d'écran 2020-11-07 9.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/2084bdb3-25c6-142a- 2189-2e54669d77e8.png)

・ Informations supplémentaires sur le code ci-dessus -__ "Get_score" __ crée une fonction pour trouver le degré de changement par vous-même. Dans __np.matmul () __, il est nécessaire de transposer la matrice __history comme __ "x.T" . - "Score" __ passe U_hist et U_test ensemble au get_score ci-dessus. La notation __for __ est due au fait que __ le degré de changement __ à chaque fois est calculé.

Sommaire

-Il existe une "méthode de somme cumulative" comme méthode de détection des points de changement avec une série chronologique. Il s'agit d'une méthode d'accumulation (d'addition) du degré de changement et de détermination d'une anomalie lorsque le degré de changement dépasse le seuil. Cependant, ce seuil et ces paramètres de calcul doivent être calculés par soi-même, ce qui n'est pas pratique. -La méthode utilisant la "méthode du voisinage" résout ce problème. Cette méthode détermine si les données de séries temporelles sont anormales ou non en détectant les valeurs aberrantes. À l'origine, la détection des valeurs aberrantes et les données de série chronologique sont incohérentes, mais cela est résolu en divisant les données adjacentes en M morceaux. -La longueur divisée en M morceaux à ce moment est appelée une fenêtre de diapositive, et la collection de données créées est appelée données de série chronologique partielle. En utilisant ces derniers, le degré d'anomalie est calculé par la méthode du plus proche voisin. -Il existe également une "méthode de conversion de spectre singulier" qui applique la méthode ci-dessus. Il s'agit d'une méthode de détection d'un point de changement à partir des «données représentatives actuelles ou de la différence entre les données représentatives».

Cette fois, c'est fini. Merci d'avoir lu jusqu'à la fin.

Recommended Posts

Introduction à la détection des anomalies 3 Détection des points de changement
Détection d'anomalies Introduction 2 Détection des valeurs aberrantes
Introduction à la détection des anomalies 1 principes de base
Détection de point de changement avec filtre de Kalman
Introduction à la détection des anomalies et résumé des méthodes
Flux de base de détection d'anomalies
Une introduction légère à la détection d'objets