[PYTHON] Erkennung von Zeitreihendatenanomalien für Anfänger

Einführung

Dieser Artikel wurde als Tag 6 von Cisco Adventskalender 2019 zwischen Cisco Systems GK veröffentlicht.

Sieben Jahre sind vergangen, seit das SuperVision-Team an der Universität von Toronto, Kanada, 2012 die Image Net Large Scale Visual Recognition Challenge (ILSVRC) 2012 gewonnen hat. Zu diesem Zeitpunkt wird durch die Verwendung eines Modells mit Deep Learning häufig eine Modellierung für maschinelles Lernen und Deep Learning im dritten KI-Boom durchgeführt, und heutzutage ist allgemein bekannt, dass KI für maschinelles Lernen und Deep Learning verwendet wird. Es ist geworden.

Laut einer 2017 veröffentlichten Umfrage des Ministeriums für innere Angelegenheiten und Kommunikation haben jedoch nur 14,1% der Unternehmen tatsächlich KI-Lösungen eingeführt, und 22,8% erwägen die Einführung dieser Lösungen. Die Anzahl der Unternehmen beträgt einschließlich der Prüfungsphase 36,9%. (Zitat: AI / IoT-Einführungsstatus und Zeitplan Ministerium für innere Angelegenheiten und Kommunikation)

Es gibt viele Open-Source-Dienste im Zusammenhang mit maschinellem Lernen, die im kleinen Maßstab einfach zu verwenden sind. In der Zwischenzeit habe ich in den letzten zwei Jahren ein Beispiel für die einfache Verwendung von maschinellem Lernen geschrieben. Artikel 2017: Ich habe versucht, die mithilfe der API erhaltenen Standortinformationen maschinell zu lernen Artikel 2018: Sammeln von Lehrerdaten für maschinelles Lernen mithilfe von Tools für die Zusammenarbeit

Daher möchte ich dieses Mal ein Beispiel vorstellen, das es einfach macht, maschinelles Lernen anhand der Zeitreihendaten zu modellieren, die am häufigsten als Daten erfasst werden. Unter anderem konzentrieren wir uns darauf, wie maschinelles Lernen im Bereich der Erkennung von Anomalien angewendet wird.

Daten in chronologischer Reihenfolge

Zeitreihendaten beziehen sich auf alle über die Zeit beobachteten Daten. Und die Reihenfolge, in der sie beobachtet werden, ist signifikant. Wenn es um Zeitreihendaten für Cisco-Produkte geht, sind Syslog-Daten auch in den Zeitreihendaten und in [Stealthwatch] enthalten (https://www.cisco.com/c/ja_jp/products/security/stealthwatch/index). Es gibt eine Vielzahl von Daten wie Flow-Daten von .html) und Verbindungszieldaten von Cloudlock.

Bei der Anwendung von Zeitreihendaten auf maschinelles Lernen / Deep Learning wird häufig der folgende Ablauf verwendet. 4.png In der auf Ähnlichkeit basierenden Methode wird festgelegt, wie die Merkmalsmenge extrahiert wird, wie die Fenstergröße der Zeitreihendaten festgelegt wird (wie die Zeitreihenmenge aufgeteilt wird, in der die Merkmalsmenge wahrscheinlich erscheint) und wie in der späteren Methode des maschinellen Lernens modelliert wird. Die Genauigkeit hängt stark von Ihrer Wahl ab.

Bei der modellbasierten Methode wird zunächst die für die metrische Zeitreihenanalyse verwendete Methode angepasst. Die hier für die metrische Zeitreihenanalyse verwendeten Methoden beziehen sich auf versteckte Markov-Modelle, ARMA-Modelle, VAR-Modelle, SARIMA-Modelle usw. Es ist ein Modell, das den Datenübergang darstellt, indem der Zustandsübergang als zeitliche Änderung betrachtet wird. Da jedes Modell Parameter in diesen Methoden hat, werden die erhaltenen Parameter verwendet und auf die Methode des maschinellen Lernens angewendet.

スクリーンショット 2019-12-06 18.31.24.png Abbildung 1: Zeitreihendaten der Cisco Web Security Appliance スクリーンショット 2019-12-06 18.32.00.png Abbildung 2: Cisco Cloudlock-Zeitreihendaten

Dieses Mal wollen wir "abnormale Daten durch Vergleich mit normalen Daten finden" für die als numerische Daten erhaltenen Zeitreihendaten.

Erkennung von Anomalien

Ich erkenne, dass die Erkennung von Anomalien ein sehr schwieriges Feld ist, in dem mathematische Formeln wie Statistik, Wahrscheinlichkeitstheorie und Optimierungstheorie in einer Reihe stehen, aber es gibt viele Felder, die angewendet werden können.

Auf dem Gebiet der Erkennung von Anomalien wurden viele Methoden des maschinellen Lernens für ihre Anwendung vorgeschlagen, aber hier sind einige davon.

Ich persönlich erkenne, dass es im Bereich der Erkennung von Anomalien zwei wichtige Punkte gibt. Die Idee ist, die Genauigkeit (insbesondere die Idee, False-Negative zu reduzieren) und die Geschwindigkeit der Erkennung zu betonen. Dies ist eine wichtige Idee, da sie sich auch auf die Ausführung des tatsächlichen Vorgangs auswirkt.

1. Konzept, das die Genauigkeit der Erkennung von Anomalien betont

Die Idee, die Genauigkeit zu betonen, ist besonders im Bereich der Fehlererkennung verbreitet. Dies liegt daran, dass wir "" vermeiden möchten, was tatsächlich kaputt ist, aber als "nicht kaputt" vorausgesagt wird. In Bezug auf maschinelles Lernen besteht die Idee darin, den Rückruf zu erhöhen.

(Referenz) Wie hoch ist die Rückrufquote? Berücksichtigen Sie bei der Betrachtung der Genauigkeit die folgende gemischte Matrix. 5.png Abbildung 3: Gemischte Matrix

Und "Rückruf" ist die Genauigkeit, die durch die folgende Formel ausgedrückt wird. 6.png Mit anderen Worten, die Rückrufrate ist ein Index dafür, "wie viel das Modell als abnormal beurteilen kann, wenn es tatsächlich abnormal ist".

In der Realität ist es schwierig, ohne menschliche Beteiligung zu arbeiten, um festzustellen, ob Geräte wie Fabriken außer Betrieb sind. Wenn jedoch die Anzahl der False-Negatives groß ist, wird erwartet, dass sich der Vorgang vor und nach der Einführung aufgrund des geringen Vertrauens in AI-Anwendungen nicht ändert und die Belastung des Administrators nicht verringert wird. Um diese Situation zu vermeiden, werden KI-Anwendungen erwartet, die die Anzahl der falsch-negativen Ergebnisse und die Belastung durch die Fehlererkennung verringern.

2. Die Idee, die Erkennungsgeschwindigkeit zu betonen

Bei der Verwendung von maschinellem Lernen / Deep Learning müssen Sie auch die Berechnungskosten berücksichtigen. Unabhängig davon, wie genau das Modell ist, macht es keinen Sinn, eine KI-Anwendung bereitzustellen, wenn die Erkennung lange dauert.

Zum Beispiel eine Sicherheits-AI-Anwendung. Unabhängig davon, wie ungewöhnlich Verkehr erkannt wird, macht es keinen Sinn, wenn er am nächsten Tag erkannt wird, nachdem die wichtigen Informationen bereits gestohlen wurden. Mit anderen Worten, wenn Sie nicht viel Geld für eine Plattform wie einen Server ausgeben können, müssen Sie die Berechnungskosten des Modells berücksichtigen und die Erkennungsgeschwindigkeit hervorheben.

Maschinelles Lernen mit geringen Rechenkosten umfasst Techniken wie den Simple Bayes-Klassifikator und die k-means / k-medoids-Methode. Ich werde die detaillierte Methode hier nicht erläutern, aber es gibt viele andere Methoden zur Erkennung von Anomalien.

Anwendungsbeispiel

Hier möchte ich ein Anwendungsbeispiel betrachten. Es wird angenommen, dass die zu verwendenden Daten zweidimensionale Zeitreihendaten sind, beispielsweise die Anzahl der Flüsse in Stealthwatch. Wir übernehmen die Daten, weil wir so allgemein wie möglich sein wollen. スクリーンショット 2019-12-06 18.31.42.png Abbildung 4: Cisco Stealthwatch-Zeitreihendaten

Aus den obigen Zeitreihendaten werden die Daten für die Fenstergröße als Muster extrahiert und mit dem Muster im Normalzustand verglichen.

In Bezug auf die Musterextraktion müssen wir diesmal berücksichtigen, dass die Anzahl der Flüsse selten 0 wird und dass der Verkehr immer fließt, insbesondere in Intervallen von mehreren Minuten bis mehreren Stunden, was der Fenstergröße entspricht. ist. Wenn Sie wissen, dass die Zahl 0 ist, können Sie sie trennen, wenn die Zahl 0 ist. Wenn die Zahl jedoch nicht 0 ist, müssen Sie das Muster extrahieren.

Wenn die Fenstergröße klein ist, wird erwartet, dass sich die Zeitzone und die Zeitbreite, wenn dasselbe Muster angezeigt wird, je nach Situation unterscheiden. Wir wissen zum Beispiel, dass Mitarbeiter YouTube in den Mittagspausen ansehen. Selbst wenn wir wissen, dass die Anzahl der Flows zwischen 12:00 und 13:00 Uhr stark ansteigt und nach 13:00 Uhr liegt, denken wir, dass die maximale Zeit von Tag zu Tag variieren wird. (Ich weiß nicht, ob es das Maximum um 12:31 Uhr oder das Maximum um 12:36 Uhr geben wird).

Auf diese Weise wird der Ähnlichkeitsgrad mit der als Dynamic Time Warping --DTW bezeichneten Methode berechnet, wenn "Formen unabhängig von der Zeitbreite ähnlich sind". Mit dieser Methode ist es möglich, eine Beurteilung vorzunehmen, auch wenn die Datenlängen nicht einheitlich sind. Mit anderen Worten, es ist möglich zu beurteilen, selbst wenn die Zeitbreite unterschiedlich ist.

Wenn andererseits die Abweichung in Bezug auf die Zeitachse als wichtig angesehen wird, verwenden Sie den euklidischen Abstand. Zum Beispiel der Unterschied in der Anzahl der Flüsse während des Tages und nachts, wenn das Fenster groß ist.

Lassen Sie uns nun DTW in Python implementieren. Mit der dynamischen Planung wird DTW implementiert. Bei der Messung des Abstands zwischen zwei Punkten wird auch berücksichtigt, dass es Fälle gibt, in denen er mit einem absoluten Wert gemessen wird, und Fälle, in denen er mit einem euklidischen Abstand gemessen wird, sodass er durch das Argument "Methode" getrennt wird. Das erste und das zweite Argument repräsentieren zwei Zeitreihendaten, die durch die Fenstergröße getrennt sind. Beim Vergleich mit Zeitreihendaten über mehrere Tage wird diese Funktion mehrmals aufgerufen.

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

Durch mehrmaliges Berechnen dieses DTW kann eine Abstandsmatrix zwischen mehreren Zeitreihendaten erhalten werden. Betrachten Sie unter Verwendung dieser Distanzmatrix die Klassifizierung nach der k-Medoids-Methode. Dieses Mal setzen wir die Anzahl der Cluster auf 2, da wir zwei Muster von "normal / abnormal" klassifizieren möchten.

self.n_cluster = 2

Die Implementierung der k-Medoids-Methode ist wie folgt. Da die k-medoids-Methode in scikit-learn nicht implementiert ist, implementieren Sie sie wie folgt. Ersetzen Sie den Abstand D_matrix durch die Distanzmatrix.

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

Es ist möglich, in zwei Klassen oben zu klassifizieren, normal und abnormal. Die Details der k-Medoids-Methode werden hier weggelassen, aber die Eigenschaften unterscheiden sich nicht so sehr von der k-means-Methode, aber im Gegensatz zur k-means-Methode werden Medoide berechnet und klassifiziert, sodass sie gegen Ausreißer resistent sind. Darüber hinaus ist es möglich zu klassifizieren, ob nur die Distanzmatrix erhalten wird, so dass die Anwendung effektiv ist. Hier erfahren Sie, wie Sie das Medoid finden.

image.png

Schließlich

Dieses Mal schrieb ich über die Methode zur Erkennung von Anomalien und die Anwendungsmethode. Danach wird ein Codebeispiel zum Erkennen von Anomalien unter Verwendung zweidimensionaler Zeitreihendaten gezeigt.

Da das k-Medoids-Verfahren klassifiziert werden kann, solange die Abstandsmatrix erhalten wird, kann sogar eine Zeichenkette klassifiziert werden, indem der Abstand ermittelt wird. Die Entfernung der Zeichenkette verwendet die Jaro Winkler-Entfernung und die Levenstein-Entfernung. Bitte suchen Sie auch hier.

Wir hoffen, dass Sie sich auf diesen Artikel beziehen und versuchen, Anomalien anhand der verfügbaren Daten zu erkennen.

Haftungsausschluss

Die auf dieser Website geäußerten Meinungen und die entsprechenden Kommentare sind die persönlichen Meinungen des Posters und nicht die Meinungen von Cisco. Der Inhalt dieser Website dient nur zu Informationszwecken und darf nicht von Cisco oder einer anderen Partei unterstützt oder zum Ausdruck gebracht werden. Durch das Posten auf dieser Website ist jeder Benutzer allein für den Inhalt aller veröffentlichten, verknüpften oder anderweitig hochgeladenen Informationen verantwortlich und schließt Cisco von jeglicher Haftung für die Nutzung dieser Website aus. Genau.

Recommended Posts

Erkennung von Zeitreihendatenanomalien für Anfänger
Abnormalitätserkennung von Zeitreihendaten durch LSTM (Keras)
LSTM (1) zur Zeitreihenvorhersage (für Anfänger)
[Für Anfänger] Skript innerhalb von 10 Zeilen (5. Resample von Zeitreihendaten mit Pandas)
[Python] Zeichnen Sie Zeitreihendaten
Abnormalitätserkennung durch Auto-Encoder mit Keras [Implementierungsbeispiel für Anfänger]
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Über Zeitreihendaten und Übertraining
Differenzierung von Zeitreihendaten (diskret)
Bewegungsstatistik zur Vorhersage von Zeitreihen
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Vorhersage von Zeitreihendaten mit einem neuronalen Netzwerk
Verstrichene Zeit für die Datenerfassung (für mich)
Erkennung von EKG-Datenanomalien durch Matrix Profile
[Deep Learning] Nogisaka Gesichtserkennung ~ Für Anfänger ~
Umgang mit Zeitreihendaten (Implementierung)
OpenFOAM-Zeitreihendaten lesen und Daten einstellen
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Zusammenfassung der Kaggle-Kernel-Methode [Tabelle Zeitreihendaten]
Zeitreihenzerlegung
Glättung von Zeitreihen und Wellenformdaten 3 Methoden (Glättung)
Zeigen Sie Details zu Zeitreihendaten mit Remotte an
Lesen von Zeitreihendaten in PyTorch
Pandas-Grundlagen für Anfänger ② Übersicht über die Daten
Implementierung der Clustering-K-Form-Methode für Zeitreihendaten [Unüberwachtes Lernen mit Python Kapitel 13]
Lassen Sie uns Covid-19 (Corona) -Daten mit Python analysieren [Für Anfänger]
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil3
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil6
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil5
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil2
Python 3.4 Windows7-64bit-Umgebung erstellen (für die Analyse finanzieller Zeitreihen)
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil1
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil10
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil7
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil4
Datensatz zur Auswertung des Spam-Reviewer-Erkennungsalgorithmus
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil8
Python-Übung für Anfänger # 1 [Grundlegende Datentypen / If-Anweisungen]
Tool zum Erstellen von Trainingsdaten für die OpenCV-Objekterkennung
Vorhersage von Zeitreihendaten durch AutoML (automatisches maschinelles Lernen)
Data Science 100 Knock ~ Kampf um weniger als Anfänger Teil11
Python: Zeitreihenanalyse
Spacemacs-Einstellungen (für Anfänger)
Python-Zeitreihenfrage
RNN_LSTM1 Zeitreihenanalyse
Zeitreihenanalyse 1 Grundlagen
Dikstra-Algorithmus für Anfänger
OpenCV für Python-Anfänger
TOPIX-Zeitreihen anzeigen
Zeitreihendiagramm / Matplotlib
Einführung in die Anomalieerkennung 2 Ausreißererkennung
Implementieren von 100 Data Science-Schlägen für Anfänger in Data Science (für Windows 10 Home)
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Bibliothek tsfresh, die Features automatisch aus Zeitreihendaten extrahiert
Pandas-Grundlagen für Anfänger ④ Umgang mit Datums- und Zeitangaben
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib