[PYTHON] Détection d'anomalies de données chronologiques pour les débutants

introduction

Cet article a été publié en tant que jour 6 du Calendrier de l'Avent Cisco 2019 entre Cisco Systems GK.

Sept ans se sont écoulés depuis que l'équipe SuperVision de l'Université de Toronto, au Canada, a remporté le Défi de reconnaissance visuelle à grande échelle Image Net (ILSVRC) 2012 en 2012. À l'heure actuelle, en utilisant un modèle utilisant l'apprentissage profond, la modélisation dans l'apprentissage automatique et l'apprentissage profond est souvent effectuée dans le troisième boom de l'IA, et de nos jours, il est de notoriété publique que l'IA est utilisée dans l'apprentissage automatique et l'apprentissage profond. Il est devenu.

Cependant, selon une enquête du ministère de l'Intérieur et de la Communication publiée en 2017, seules 14,1% des entreprises ont effectivement introduit des solutions d'IA et 22,8% envisagent de les introduire. Le nombre d'entreprises est de 36,9%, y compris la phase d'examen. (Citation: État et calendrier de l'introduction de l'IA / IoT Ministère des affaires intérieures et des communications)

Il existe de nombreux services open source liés à l'apprentissage automatique, et ils sont faciles à utiliser à petite échelle. En attendant, au cours des deux dernières années, j'ai écrit un exemple de la façon d'utiliser facilement l'apprentissage automatique. Article 2017: j'ai essayé d'apprendre automatiquement les informations de localisation obtenues à l'aide de l'API Article de 2018: collecte de données sur les enseignants en apprentissage automatique à l'aide d'outils de collaboration

Par conséquent, cette fois, je voudrais présenter un exemple qui facilite la modélisation de l'apprentissage automatique en utilisant les données chronologiques qui seront le plus acquises sous forme de données. Parmi eux, nous nous concentrerons sur la manière dont l'apprentissage automatique est appliqué dans le domaine de la détection d'anomalies.

Données par ordre chronologique

Les données chronologiques font référence à toutes les données observées au fil du temps. Et l'ordre dans lequel ils sont observés est significatif. En ce qui concerne les données chronologiques relatives aux produits Cisco, les données Syslog sont également incluses dans les données chronologiques et Stealthwatch Il existe une grande variété de données telles que les données Flow de .html) et les données de destination de connexion de Cloudlock.

Lors de l'application de données de séries chronologiques à l'apprentissage automatique / l'apprentissage en profondeur, le flux suivant est souvent utilisé. 4.png Dans la méthode basée sur la similitude, comment extraire la quantité de fonctionnalités, définir la taille de la fenêtre des données de la série chronologique (comment diviser l'ensemble de séries temporelles où la quantité de fonctionnalités est susceptible d'apparaître) et comment modéliser dans la méthode d'apprentissage automatique ultérieure. La précision variera considérablement en fonction de votre choix.

Dans la méthode basée sur un modèle, la méthode utilisée pour l'analyse des séries chronologiques métriques est d'abord mise en correspondance. Les méthodes utilisées pour l'analyse des séries chronologiques métriques ici font référence aux modèles de Markov cachés, aux modèles ARMA, aux modèles VAR, aux modèles SARIMA, etc. C'est un modèle qui représente la transition des données en considérant la transition d'état comme un changement dans le temps. Étant donné que chaque modèle a des paramètres dans ces méthodes, les paramètres obtenus sont utilisés et appliqués à la méthode d'apprentissage automatique.

スクリーンショット 2019-12-06 18.31.24.png Figure 1: Données chronologiques de l'appliance de sécurité Web Cisco スクリーンショット 2019-12-06 18.32.00.png Figure 2: Données de séries chronologiques Cisco Cloudlock

Cette fois, nous cherchons à "trouver des données anormales en les comparant à des données normales" pour les données de séries chronologiques obtenues sous forme de données numériques.

Détection d'anomalies

Je reconnais que la détection des anomalies est un domaine très difficile où s'alignent des formules mathématiques, telles que les statistiques, la théorie des probabilités et la théorie de l'optimisation, mais il existe de nombreux domaines qui peuvent être appliqués. --Trouver des signes anormaux en usine

Dans le domaine de la détection d'anomalies, de nombreuses méthodes d'apprentissage automatique ont été proposées pour leur application, mais en voici quelques-unes.

Dans le domaine de la détection des anomalies, je reconnais personnellement qu'il y a deux points importants. L'idée est de mettre l'accent sur la précision (en particulier l'idée de réduire les faux négatifs) et l'idée de mettre l'accent sur la vitesse de détection. C'est une idée importante car elle affecte également la manière dont l'opération réelle est effectuée.

1. Concept qui met l'accent sur la précision de la détection des anomalies

L'idée de mettre l'accent sur la précision est particulièrement courante dans le domaine de la détection des pannes. C'est parce que nous voulons éviter `` '', qui est en fait cassé, mais qui est prédit "non cassé". En termes d'apprentissage automatique, l'idée est d'augmenter le rappel.

(Référence) Quel est le taux de rappel? Lors de l'examen de la précision, tenez compte de la matrice mixte suivante. 5.png Figure 3: matrice mixte

Et le `` rappel '' est la précision exprimée par la formule suivante. 6.png En d'autres termes, le taux de rappel est un indice de "combien le modèle peut juger comme anormal alors qu'il est réellement anormal".

En réalité, il est difficile de fonctionner sans implication humaine pour déterminer si des équipements tels que des usines sont en panne. Cependant, si le nombre de faux négatifs est important, il est prévu que l'opération ne changera pas avant et après l'introduction en raison de la faible confiance dans les applications d'IA, et le fardeau de l'administrateur ne sera pas réduit. Pour éviter cette situation, des applications d'IA qui réduisent le nombre de faux négatifs et réduisent le fardeau de la détection des pannes sont attendues.

2. L'idée de mettre l'accent sur la vitesse de détection

Lorsque vous utilisez l'apprentissage automatique / l'apprentissage profond, vous devez également tenir compte du coût de calcul. Quelle que soit la précision du modèle, si la détection prend beaucoup de temps, il est inutile de déployer une application d'IA.

Par exemple, une application d'IA de sécurité. Peu importe la façon dont le trafic inhabituel est détecté, s'il est détecté le lendemain, cela n'a aucun sens une fois que les informations importantes ont déjà été volées. En d'autres termes, à moins que vous ne puissiez dépenser beaucoup d'argent sur une plate-forme telle qu'un serveur, vous devez prendre en compte le coût de calcul du modèle et mettre l'accent sur la vitesse de détection.

Les techniques d'apprentissage automatique à faibles coûts de calcul incluent des techniques telles que le classificateur Simple Bayes et la méthode k-means / k-medoids. Je n'expliquerai pas la méthode détaillée ici, mais il existe de nombreuses autres méthodes utilisées pour la détection d'anomalies.

Exemple d'application

Ici, je voudrais considérer un exemple d'application. Les données à utiliser sont supposées être des données de séries chronologiques bidimensionnelles telles que le nombre de flux dans Stealthwatch. Nous supposons les données parce que nous voulons être aussi généraux que possible. スクリーンショット 2019-12-06 18.31.42.png Figure 4: Données de séries chronologiques de Cisco Stealthwatch

À partir des données de série chronologique ci-dessus, les données pour la taille de la fenêtre sont extraites sous la forme d'un modèle et comparées au modèle à l'état normal.

Tout d'abord, en ce qui concerne l'extraction de motifs, ce qu'il faut considérer cette fois, c'est que le nombre de flux devient rarement 0, et on considère que le trafic est toujours fluide, surtout à des intervalles de plusieurs minutes à plusieurs heures, qui est la taille de la fenêtre. est. Si vous savez que le nombre sera 0, vous pouvez le séparer lorsque le nombre est 0, mais si le nombre n'est pas 0, vous devez envisager d'extraire le motif.

Si la taille de la fenêtre est petite, on s'attend à ce que le fuseau horaire et la largeur de temps lorsque le même modèle apparaît varient en fonction de la situation. Par exemple, nous savons que les employés regardent YouTube pendant les pauses déjeuner, donc même si nous savons que le nombre de flux augmentera fortement entre 12h00 et 13h00 et qu'il sera passé 13h00, nous pensons que la durée maximale variera d'un jour à l'autre. (Je ne sais pas si cela prendra le maximum à 12h31 ou le maximum à 12h36).

De cette manière, lorsque les "formes sont similaires" quelle que soit la largeur de temps, le degré de similitude est calculé par la méthode appelée Dynamic Time Warping --DTW. Avec cette méthode, il est possible de faire un jugement même si les longueurs de données ne sont pas uniformes. En d'autres termes, il est possible de juger même si la largeur de temps est différente.

En revanche, si l'écart par rapport à l'axe des temps est considéré comme important, utilisez la distance euclidienne. Par exemple, la différence du nombre de flux pendant la journée et la nuit lorsque la taille de la fenêtre est grande.

Maintenant, implémentons réellement DTW en Python. La planification dynamique est utilisée pour mettre en œuvre DTW. De plus, lors de la mesure de la distance entre deux points, il y a des cas où elle est mesurée avec une valeur absolue et des cas où elle est mesurée avec une distance euclidienne, donc elle est séparée par l'argument de `` méthode ''. Le premier et le second arguments représentent deux données de série chronologique séparées par la taille de la fenêtre. Lors de la comparaison avec des données de séries chronologiques pendant plusieurs jours, cette fonction est appelée plusieurs fois.

def dtw(wave_x, wave_y, method="abs"):
    d = np.zeros([len(wave_x)+1, len(wave_y)+1])
    d[:] = np.inf
    d[0, 0] = 0
    if method = "euclid":
        for i in range(1, d.shape[0]):
            for j in range(1, d.shape[1]):
                cost = np.sqrt((wave_x[i-1] - wave_y[j-1])**2)
                cost = (wave_x[i-1] - wave_y[j-1])
                row.append(cost)
                d[i, j] = cost + min(d[i-1, j], d[i, j-1], d[i-1, j-1])
    else:
        for i in range(1, d.shape[0]):
            for j in range(1, d.shape[1]):
                cost = np.abs(wave_x[i-1] - wave_y[j-1])
                row.append(cost)
                d[i, j] = cost + min(d[i-1, j], d[i, j-1], d[i-1, j-1])
    elapsed_time = time.time() - start_time
    return d[-1][-1], d, matrix

En calculant ce DTW plusieurs fois, une matrice de distance entre plusieurs données chronologiques peut être obtenue. En utilisant cette matrice de distance, considérons la classification par la méthode des k-médoïdes. Cette fois, nous fixons le nombre de clusters à 2 car nous visons à classer deux modèles de «normal / anormal».

self.n_cluster = 2

La mise en œuvre de la méthode k-medoids est la suivante. Puisque la méthode k-medoids n'est pas implémentée dans scikit-learn, implémentez-la comme suit. Remplacez la matrice de distance par la partie `` D_matrix ''.

class KMedoids():
    def __init__(self, max_iter=300):
        self.n_cluster = 2
        self.max_iter = max_iter

    def fit_predict(self, D_matrix):
        m, n = D_matrix.shape
        ini_medoids = np.random.choice(range(m), self.n_cluster, replace=False)
        tmp_D = D_matrix[:, ini_medoids]

        labels = np.argmin(tmp_D, axis=1)

        results = pd.DataFrame([range(m), labels]).T
        results.columns = ['id', 'label']

        col_names = ['x_' + str(i + 1) for i in range(m)]
        results = pd.concat([results, pd.DataFrame(D_matrix, columns=col_names)], axis=1)

        old_medoids = ini_medoids
        new_medoids = []

        loop = 0
        while ((len(set(old_medoids).intersection(set(new_medoids))) != self.n_cluster) 
               and (loop < self.max_iter) ):
        if loop > 0:
            old_medoids = new_medoids.copy()
            new_medoids = []
        for i in range(self.n_cluster):
            tmp = results[results['label'] == i].copy()
            tmp['distance'] = np.sum(tmp.loc[:, ['x_' + str(id + 1) for id in tmp['id']]].values, axis=1)
            tmp = tmp.reset_index(drop=True)
            new_medoids.append(tmp.loc[tmp['distance'].idxmin(), 'id'])

        new_medoids = sorted(new_medoids)
        tmp_D = D_matrix[:, new_medoids]

        clustaling_labels = np.argmin(tmp_D, axis=1)
        results['label'] = clustaling_labels
        loop += 1
        results = results.loc[:, ['id', 'label']]
        results['flag_medoid'] = 0

        for medoid in new_medoids:
            results.loc[results['id'] == medoid, 'flag_medoid'] = 1
        tmp_D = pd.DataFrame(tmp_D, columns=['medoid_distance'+str(i) for i in range(self.n_cluster)])
        results = pd.concat([results, tmp_D], axis=1)

        self.results = results
        self.cluster_centers_ = new_medoids
        return results['label'].values

Il est possible de classer en deux classes ci-dessus, normal et anormal. Les détails de la méthode des k-médoïdes sont omis ici, mais les caractéristiques ne sont pas si différentes de la méthode des k-moyennes, mais contrairement à la méthode des k-moyennes, les médoïdes sont calculés et classés, donc ils sont résistants aux valeurs aberrantes. De plus, il est possible de classer tant que la matrice de distance est obtenue, donc l'application est efficace. Voici comment trouver le médoïde.

image.png

finalement

Cette fois, j'ai écrit sur la méthode de détection des anomalies et la méthode d'application. Après cela, un exemple de code pour détecter des anomalies à l'aide de données chronologiques bidimensionnelles est présenté.

Puisque la méthode des k-médoïdes peut être classée tant que la matrice de distance est obtenue, même une chaîne de caractères peut être classée en trouvant la distance. La distance de la chaîne de caractères utilise la distance de Jaro Winkler et la distance de Levenstein, veuillez donc rechercher ici également.

Nous espérons que vous vous référerez à cet article et que vous essaierez de détecter les anomalies en utilisant les données dont vous disposez.

Avertissement

Les opinions exprimées sur ce site et les commentaires correspondants sont les opinions personnelles de l'affiche et non les opinions de Cisco. Le contenu de ce site est fourni à titre informatif uniquement et n'est pas destiné à être approuvé ou exprimé par Cisco ou toute autre partie. En publiant sur ce site Web, chaque utilisateur est seul responsable du contenu de toutes les informations publiées, liées ou autrement téléchargées, et décline Cisco de toute responsabilité relative à l'utilisation de ce site Web. Je suis d'accord.

Recommended Posts

Détection d'anomalies de données chronologiques pour les débutants
Détection d'anomalies des données de séries chronologiques par LSTM (Keras)
LSTM (1) pour la prédiction de séries chronologiques (pour les débutants)
[Pour les débutants] Script dans les 10 lignes (5. Rééchantillonnage des données de séries chronologiques à l'aide de pandas)
[Python] Tracer des données de séries chronologiques
Détection d'anomalies par encodeur automatique à l'aide de keras [Exemple d'implémentation pour les débutants]
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
À propos des données de séries chronologiques et du surentraînement
Différenciation des données de séries chronologiques (discrètes)
Statistiques de mouvement pour la prédiction de séries chronologiques
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Prédire les données de séries chronologiques avec un réseau neuronal
Sortie du temps écoulé pour l'enregistrement des données (pour moi-même)
Détection d'anomalies des données ECG par profil matriciel
[Apprentissage en profondeur] Détection de visage Nogisaka ~ Pour les débutants ~
Comment gérer les données de séries chronologiques (mise en œuvre)
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données
Obtenez des données de séries chronologiques de k-db.com avec Python
Résumé de la méthode Kaggle's Kernel [Table time series data]
Décomposition des séries temporelles
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
Voir les détails des données de séries chronologiques dans Remotte
Comment lire les données de séries chronologiques dans PyTorch
Principes de base de Pandas pour les débutants ② Présentation des données de saisie
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
Analysons les données Covid-19 (Corona) en utilisant Python [Pour les débutants]
Data Science 100 Knock ~ Bataille pour moins que les débutants part3
Data Science 100 Knock ~ Bataille pour moins que les débutants part6
Quantité d'entités pouvant être extraite des données de séries chronologiques
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Data Science 100 Knock ~ Bataille pour moins que les débutants part5
Data Science 100 Knock ~ Bataille pour moins que les débutants part2
Python 3.4 Créer un environnement Windows7-64bit (pour l'analyse des séries chronologiques financières)
Data Science 100 Knock ~ Bataille pour moins que les débutants part1
Data Science 100 Knock ~ Battle pour moins que les débutants part10
Science des données 100 coups ~ Bataille pour moins que les débutants part7
Data Science 100 Knock ~ Bataille pour moins que les débutants part4
Ensemble de données pour l'évaluation de l'algorithme de détection des réviseurs de spam
Science des données 100 coups ~ Bataille pour moins que les débutants part8
Exercice Python pour les débutants # 1 [Types de données de base / instructions If]
Outil de création de données d'entraînement pour la détection d'objets OpenCV
Prédiction de données chronologiques par AutoML (apprentissage automatique automatique)
Data Science 100 Knock ~ Bataille pour moins que les débutants part11
Python: analyse des séries chronologiques
Paramètres Spacemacs (pour les débutants)
Question sur la série chronologique Python
Analyse des séries chronologiques RNN_LSTM1
Analyse des séries chronologiques 1 Principes de base
Algorithme Dikstra pour les débutants
OpenCV pour les débutants en Python
Afficher les séries chronologiques TOPIX
Diagramme de séries chronologiques / Matplotlib
Détection d'anomalies Introduction 2 Détection des valeurs aberrantes
Comment mettre en œuvre 100 coups de science des données pour les débutants en science des données (pour Windows 10 Home)
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Bibliothèque tsfresh qui extrait automatiquement les caractéristiques des données de séries chronologiques
Principes de base de Pandas pour les débutants ④ Gestion des éléments de date et d'heure
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib