Ich habe die folgenden Daten für ein kleines Nebenprojekt. Es ist von einem Beschleunigungsmesser, der auf einer Waschmaschine / einem Trockner sitzt, und ich möchte, dass er mir sagt, wann die Maschine fertig ist.
x sind die Eingabedaten (x / y / z-Bewegung als ein Wert), y ist die Beschriftung ein / aus
Da sich die x-Werte für y = 1 und y = 0 überlappen, habe ich darüber nachgedacht, x und ein rollierendes 3-Minuten-Fenster als Eingaben für eine SVM zu verwenden:
xyz60=res.xyz.resample("60S").max()
X["x"]=xyz60
X["max3"]=xyz60.rolling(window=3, min_periods=1).max()
Ist dies ein guter Ansatz für diese Art von Problem? Gibt es Alternativen, die zu besseren Ergebnissen führen könnten?
Antworten:
Sie haben Zeitreihendaten, mit denen die Beschleunigung gemessen wird. Sie identifizieren, wann sich die Maschine im Nennzustand (AUS) und im anomalen Zustand (EIN) befindet. Dieses Problem lässt sich am besten mit Anomalieerkennungsalgorithmen lösen. Es gibt jedoch so viele Möglichkeiten, wie Sie dieses Problem angehen können.
Daten vorbereiten
Dabei ist der Mittelwert der Baumproben in einem Fenster. ist definiert alsss s
Dabei ist Ihre Beispielbeobachtung und .i ≥ 2x i ≥ 2
Sammeln Sie dann weitere Daten, wenn dies bei aktivem Gerät möglich ist, sodassy= 1 .
Jetzt können Sie auswählen, ob Sie Ihren Algorithmus auf einem Ein-Klassen-Datensatz trainieren möchten (reine Anomlay-Erkennung). Ein voreingenommener Datensatz (Anomalieerkennung) oder ein ausgewogener Datensatz. Der Saldo des Datensatzes ist das Verhältnis zwischen den beiden Klassen in Ihrem Datensatz. Ein perfekter Datensatz für einen 2-Klassen-Klassifikator wäre 1: 1. 50% der Daten gehören zu jeder Klasse. Sie scheinen einen voreingenommenen Datensatz zu haben, vorausgesetzt, Sie möchten nicht viel Strom verschwenden.
Beachten Sie, dass Sie nichts daran hindert, die benachbarten Stichproben als Instanz in Ihrem Dataset aufzuteilen. Zum Beispiel:
Dies würde einen dreidimensionalen Eingaberaum für eine bestimmte Ausgabe schaffen, der für die aktuell entnommene Probe definiert ist.
Ein voreingenommener Datensatz
Einfache Lösung
Der einfachste Weg, den ich vorschlagen würde. Angenommen, Sie verwenden eine einzelne Statistik, um zu definieren, was im gesamten 3-Beispielfenster geschieht. Ermitteln Sie aus den gesammelten Daten das Maximum Ihrer Nennpunkte ( ) und das Minimum Ihrer anomalen Punkte ( ). Nehmen Sie dann die halbe Markierung zwischen diesen beiden und verwenden Sie diese als Schwelle.y = 0 s y = 1s y= 0 s y= 1
Wenn ein neues Testmuster größer als der Schwellenwert ist, weisen Sie . y=1s^ y= 1
Sie können dies erweitern, indem Sie den Mittelwert für alle Ihre nominalen Stichproben berechnen . Berechnen Sie dann den Mittelwert für Ihre anomalen Stichproben . Wenn eine neue Stichprobe näher an den Mittelwert der anomalen Stichproben fällt, klassifizieren Sie sie als .y = 0 y = 1 y = 1s y= 0 y= 1 y= 1
Aber ich möchte Lust bekommen!
Es gibt eine Reihe anderer Techniken, mit denen Sie genau diese Aufgabe ausführen können.
Einfach ausgedrückt, ist fast jeder Algorithmus für maschinelles Lernen für diesen Zweck gut geeignet. Es hängt nur davon ab, wie viele Daten Ihnen zur Verfügung stehen und wie sie verteilt werden.
Ich möchte wirklich SVM verwenden
Wenn dies der Fall ist, halten Sie die drei Proben vollständig getrennt. Ihre Trainingsmatrix enthält 3 Spalten, wie oben beschrieben. Und dann haben Sie Ihre Ausgänge . Die Verwendung von SVM in Python ist sehr einfach: http://scikit-learn.org/stable/modules/svm.html .y
Dies trainiert Ihr Modell. Dann möchten Sie das Ergebnis für eine neue Stichprobe vorhersagen.
quelle