Aidemy 2020/11/10
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 deuxième article de l'introduction à la détection des anomalies. Ravi de vous rencontrer.
Quoi apprendre cette fois ・ Détection d'anomalies par méthode k-near ・ Détection d'anomalies par SVM de classe 1 ・ Détection d'anomalies pour les données de direction
(J'ai appris la méthode k-near avant, mais cette fois je vais la réapprendre en fonction de la détection d'anomalie) -La méthode de voisinage __k __ signifie "calculer le degré d'anomalie à partir du rapport des données anormales parmi __k données qui sont proches des données à discriminer". Comme pour la méthode hôtelière, son caractère anormal ou non est déterminé par le fait qu'il dépasse ou non le seuil. -La méthode k-voisinage dans laquelle k vaut 1 à ce moment est appelée __ "méthode du plus proche voisin" __. k = 1 signifie __ que seules les données les plus proches sont référencées __. -Dans la méthode hôtelière précédente, il y avait des cas où les conditions préalables étaient «les données provenaient d'une seule distribution normale» et «les données ne contenaient presque pas de valeurs aberrantes». Cependant, il n'y a pas de telle restriction dans cette méthode de voisinage __k __. ・ La méthode k-near est très facile à comprendre lorsqu'elle est illustrée. Pour juger si le point vert dans la figure ci-dessous est normal ou anormal, il est proche de l'ensemble bleu, qui est un ensemble de données normales, donc ces données sont __ "normales" __.
-Les mérites de la méthode k-voisinage sont __ "Aucune condition préalable pour la distribution des données n'est requise", "Peut être utilisé même si les données normales sont constituées de plusieurs ensembles" et "Formule facile pour une anomalie" . .. ・ D'autre part, les inconvénients sont: __ "Puisqu'il n'y a pas de condition préalable pour la distribution des données, le seuil ne peut pas être calculé par une formule mathématique" "Un réglage strict du paramètre k nécessite une formule mathématique compliquée" "En raison d'un apprentissage paresseux sans créer un modèle à l'avance" , Il faut beaucoup de temps pour classer les nouvelles données. "
・ Le degré d'anomalie de la méthode k-near est calculé par la formule suivante.
・ À propos de chaque variable ・ $ \ Pi_0 $ est __ Pourcentage de données normales dans tous les échantillons __, $ \ pi_1 $ est __ Pourcentage de données anormales dans tous les échantillons __ · $ N ^ 0 (x) $ est le pourcentage de données normales au voisinage de $ k $ dans __ $ x $ __, $ N ^ 1 (x) $ est l'anomalie au voisinage de $ k $ dans __ $ x $ Ratio de données __ ・ $ \ Ln $ est la logarithmique naturelle basée sur $ e $ __ logarithmique __ ($ \ log_e $)
・ Calculez chacune de ces valeurs. Si l'étiquette de données est "y", $ \ pi_0 $ est calculé par __ "y [y == 0] .size / y.size" __. Autrement dit, __ "étiquette des données normales / étiquette de toutes les données" __ est $ \ pi_0 $. -De plus, $ N ^ 0 (x) $ peut être calculé en trouvant d'abord l'étiquette à proximité "voisins" comme indiqué ci-dessous, puis en utilisant __ "voisins [voisins == 0] .size / k" __.
・ Calcul des voisins
-Calculer le degré d'anomalie en utilisant les variables calculées jusqu'à présent. Puisque le code est écrit selon la formule ci-dessus, il peut être exprimé comme suit.
np.log((N1*pi0)/(N0*pi1))
-La méthode d'apprentissage de N-1 sur N données et d'utilisation des données restantes comme données de test pour vérifier l'exactitude du modèle est appelée __ "méthode de confirmation de franchissement à un moins" __. Cette fois, nous l'utiliserons pour évaluer l'exactitude. -La méthode de confirmation d'intersection en moins peut être implémentée avec KNeighborsClassifier. ・ En termes de code, comme dans la section précédente, les données sont entraînées pour calculer les "voisins" et le degré d'anomalie est calculé, mais __ "augmenter k" et "exclure le voisinage le plus proche" _ Deux processus appelés _ sont ajoutés. -Pour "augmenter k", définir "n_neighbors" passé à KNeighborsClassifier () à __ "k + 1" __. -Pour "Exclure le voisinage le plus proche", lors du calcul de "voisins", __ [:, 1:] __ doit être utilisé pour exclure la première colonne du __ tableau __.
·code
-Comme mentionné ci-dessus, le __threshold n'est pas calculé, vous devez donc le définir vous-même. De plus, le point de voisinage k doit être défini par vous-même __, créez donc une méthode pour trouver ces deux __ valeurs optimales __. -La précision du modèle (F value) peut être vérifiée pour voir si c'est la valeur optimale. Préparez à l'avance k candidats (param_k) et seuils candidats (param_ath) dans une liste, sortez-les avec une boucle __for, calculez les valeurs aberrantes dans la section précédente, comparez-les avec les seuils et si la précision est maximale. Cela se fait par la méthode de mise à jour. ・ Pour le calcul de la précision, utilisez __ "Méthode de confirmation d'intersection en moins" __ dans la section précédente. De plus, suite à la comparaison du degré d'anomalie et du seuil, __ crée un tableau dans lequel ceux jugés "anormaux" sont mis à "1" et les autres à "0". Un tableau qui classe 0 et 1 dans de telles conditions peut être créé avec __ "tableau np.as (expression conditionnelle)" __. -La précision (score) peut être calculée en calculant la valeur F avec __ "f1_score (y, y_valid)" __.
-Dans ce qui suit, k candidats sont implémentés comme "1 à 5", et les candidats de seuil sont implémentés comme "0 comme valeur médiane et 21 par incréments de 0,1". La valeur médiane du candidat seuil peut être __0, mais il est difficile de déterminer le candidat k exactement comme décrit ci-dessus. Par conséquent, cette fois, les candidats sont répertoriés comme ci-dessus.
・ Code![Capture d'écran 2020-11-05 11.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/e84371c0-4c72-8704- 82ba-cc982ca1fe60.png)
-Comme cela a été fait dans la section précédente, pour déterminer si c'est anormal ou non par la méthode de voisinage K, si l'expression conditionnelle "valeur anormale est supérieure à la valeur seuil" est définie dans l'argument de __ "np.asarray ()" __, "0" Est normal et "1" est anormal. -Le code suivant est un graphique montrant le degré d'anomalie de x après avoir trouvé le k optimal et le seuil par le traitement dans la section précédente.
・ Code![Capture d'écran 2020-11-05 12.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/ff93cbbf-f366-54a1- d1b7-a6ca66a5904f.png)
・ Graphique (le rouge est anormal, le bleu est normal, la couleur claire indique la classification des données d'entraînement)
-__ 1 La classe SVM__ est une méthode pour détecter les valeurs aberrantes dans __ "données sans étiquette" __. Autrement dit, __apprentissage supervisé __. -L'idée de base de la détection des valeurs aberrantes telle que la méthode hôtelière est __ "Créer une sphère qui englobe presque toutes les données et utiliser les valeurs aberrantes comme valeurs aberrantes" __. Dans la méthode hôtelière, cela a été fait avec __Maharanobis distance __, mais dans SVM de classe 1, la valeur aberrante est obtenue en "déformant l'espace de données __ afin que __ toutes les données puissent être placées dans la sphère". Est détecté. -Lors de la création de cette sphère, les données les plus externes existeront sur la sphère et la sphère sera créée sur cette base. Pour cette raison, les données en dehors de cela sont appelées __ "données vectorielles de support" __. Dans le SVM de classe 1, normal et anormal sont séparés en demandant ceci.
-Le flux de SVM 1-classe est le suivant. (1) Créez un classificateur SVM et calculez __abnormality __ ② Définissez le taux d'anomalie et déterminez __seuil __ ③ __ Jugement d'anomalie __ à partir de la valeur seuil et de la valeur anormale
-D'abord, créez un classificateur SVM. Cela peut être créé avec __ "OneClass SVM ()" __. Il est nécessaire de définir __ "kernel" "gamma" __ comme paramètre.
・ Code![Capture d'écran 2020-11-05 14.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/82932f52-f73d-95db- 672c-60abe9b7e5ac.png)
・ Ensuite, définissez __threshold __. Cependant, dans SVM de classe 1, il est nécessaire de définir le seuil en supposant que __ "Il y a des données anormales à un certain débit dans les données" __. Dans ce qui suit, ce rapport est représenté par __ "a (%)" __. -Le seuil est calculé par __ "st.scoreatpercentile ()" __. Passez le __abnormality __ créé dans la section précédente au premier argument, et passez le __abnormal data ratio "a" __ au second argument. Par conséquent, le seuil est défini de telle sorte que __ données anormales soit un% du total __. -Dans le code suivant, le taux d'anomalie est réglé sur "10,25,50,75 (%)" et chaque seuil est émis.
-Enfin, l'anomalie peut être déterminée en comparant la valeur anormale à la valeur seuil. La méthode d'exécution peut être la même que la méthode de voisinage K. (Cette fois, il est jugé par __ (True, False) __ au lieu de (0,1))
・ Code![Capture d'écran 2020-11-05 15.08.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/aaf00f76-6b78-4f2a- 28be-20700317f681.png)
・ Graphique (le bleu correspond à des données anormales (10% du total))![Capture d'écran 2020-11-05 15.07.25.png](https: //qiita-image-store.s3.ap-northeast-1.amazonaws) .com / 0/698700 / 4228ca8b-d9e8-185c-9ea4-e78f516da00d.png)
-Par exemple, pour certaines données de document, les données de 10 mots et les données de 100 mots peuvent ne pas être bien classées car la taille des données en tant que vecteur est différente. Dans un tel cas, ce problème est résolu en unifiant la taille de __data à 1. Ceci est appelé __ "standardisation" __, et les données vectorielles normalisées sont appelées __ "données de direction" __. ・ Cette fois, une détection d'anomalie est effectuée sur ces données de direction. Dans ce cas également, comme pour SVM à 1 classe, __ les données non étiquetées sont gérées __, __ "Les données sont réparties dans une seule direction" "Presque aucune valeur anormale n'est incluse" __ Il y a des restrictions. ・ Le flux est le suivant. ① Données __ normalisation __ ② Données __ Calcul des anomalies __ ③ Définir __ seuil à partir de la distribution de l'échantillon __ ④ __ Jugement d'anomalie __
-Pour définir la taille (longueur) des données à 1, il peut être obtenu en __ "divisant les données par la longueur des données elles-mêmes" __. Par conséquent, tout d'abord, il est nécessaire de trouver la __ longueur de données __. -La longueur des données est calculée par __ "np.linalg.norm (data, ord = 2, axis = 1) [:, np.new axis]" __. Cela a également été fait en régularisant le deep learning (traitement pour éviter le sur-apprentissage). __ "ord" __ spécifie le nombre de __ dimensions (deux dimensions cette fois), __ "axe" __ spécifie 1, c'est-à-dire __ pour calculer la longueur dans le sens de la ligne __ .. La partie __ [:, np.newaxis] __ est ajustée pour s'aligner avec les données lors de la standardisation de __.
・ Code![Capture d'écran 2020-11-05 16.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/cdbb90ea-2d7a-2be0- 17ae-1d767e6427fa.png)
-Result (tous ont une longueur de 1)![Capture d'écran 2020-11-05 16.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com /0/698700/66dc9f45-1f73-5b91-7311-fbd0bca54d54.png)
-Étant donné que les données de direction sont supposées être distribuées autour d'une seule direction, la __abnormality est déterminée par combien elle s'écarte de cette direction. Pour spécifier cet écart, il est nécessaire de déterminer la référence __direction . Cette fois, nous utiliserons la __ valeur moyenne dans le sens normalisé. -Pour la moyenne des données standardisées, il suffit de passer les données standardisées de la section précédente à __ "np.mean ()" __. À ce stade, spécifiez avec __ "axis = 0" __. Cependant, notez que cette moyenne __ doit à nouveau être normalisée __. -Le degré d'anomalie peut être calculé par __ "1- (produit interne des données et vecteur moyenné)" __. Le produit interne des vecteurs peut être obtenu par "np.dot ()", mais puisque les données sont cette fois un ensemble de vecteurs, c'est-à-dire __ "matrice" __, dans un tel cas __ "np.matmul" ()"__utilisation. L'utilisation est la même que dot.
·code
-Il existe un théorème selon lequel le degré d'anomalie suit __ "distribution χ-carré" __. Par conséquent, la distribution des données est obtenue en utilisant le degré d'anomalie calculé dans la section précédente, et la valeur de seuil est calculée à partir de celui-ci. ・ Voir le chapitre 1 pour savoir comment utiliser la distribution χ-carré. En guise de révision, l'implémentation se fait avec __ "st.chi2.ppf ()" __. Passez __ "1-False rate" __ comme premier argument. Ce taux de faux rapport est défini par vous-même. -De plus, cette fois, définissez __ "df" __ comme deuxième argument et __ "scale" __ comme troisième argument. Définissez __freedom __ pour "df". Le degré de liberté est calculé par __ "2 * carré moyen de l'anomalie / (moyenne du carré de l'anomalie-carré de la moyenne de l'anomalie)" __. Aussi, ce qui est mis en "échelle" est le statut de la distribution χ-carré, qui peut être obtenu par __ "moyenne des carrés d'anomalie / degré de liberté" __.
·code
-Enfin, l'anomalie des données est jugée. Ici, __ les données d'observation "X" préparées séparément des données d'échantillon jusqu'à présent sont utilisées pour déterminer l'anomalie __. -Pour le jugement d'anomalie, il est nécessaire de comparer le seuil créé dans la section précédente avec le degré d'anomalie de X, donc calculez d'abord le degré d'anomalie de __X __. -Pour le degré d'anomalie de X, passez "X" et "valeur moyenne des données d'échantillon" à __ "np.matmul ()" __ pour obtenir le produit interne. ・ Lorsque cela est fait, classez si c'est anormal ou normal par __ "np.as array (expression conditionnelle)" __.
・ Code![Capture d'écran 2020-11-05 17.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/3eb5d367-3875-ce4c- efe1-7cb3bf516a1f.png)
-La détection d'anomalies à l'aide de la méthode de voisinage __k __ est déterminée comme anormale lorsque __ "rapport de données anormales dans k données" __ dépasse le seuil. La méthode k-voisinage n'a pas de __constraints comme la méthode hoteling, elle peut donc être utilisée pour diverses données. -En tant que méthode d'évaluation de l'exactitude, il existe __ "méthode de croisement en moins" __. Il s'agit d'utiliser l'une des __ données __ comme données de test pour l'évaluation de l'exactitude. -De plus, la méthode utilisée pour détecter les anomalies dans les données __ sans étiquette __ est __ "1 classe SVM" __. La détection d'anomalie est effectuée en calculant le degré d'anomalie à l'aide de SVM, en définissant __ quel pourcentage de l'anomalie est à l'avance et en trouvant la valeur de seuil à partir de celle-ci. -La détection d'anomalies non étiquetées peut être effectuée sur des données vectorielles normalisées, c'est-à-dire données de direction. Le degré d'anomalie peut être calculé en prenant le __ produit interne des données et des données de direction de référence __, et le seuil est défini en utilisant la distribution __χ-carré __.
Cette fois, c'est fini. Merci d'avoir lu jusqu'à la fin.
Recommended Posts