Verwendung von Zeitreihendaten von einem Sensor für ML


8

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.

Daten

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()

Daten

Ist dies ein guter Ansatz für diese Art von Problem? Gibt es Alternativen, die zu besseren Ergebnissen führen könnten?


Mit einem dreiminütigen Rolling Window meinen Sie, dass Sie die Eingabe aus einer dreiminütigen Fensterzeit = 1, 2, 3 verwenden und dann zu time = 2, 3, 4 wechseln und eine Bezeichnung 0/1 für erhalten möchten Aus / Ein für jedes Fenster?
StatsSorceress

@StatsSorceress im Grunde ja - ich benutze ein Fenster, weil sich die x-Werte überlappen (aktualisiert)
laktak

Antworten:


7

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

y=0S.

S.={s0,s1,...,sn}}

Dabei ist der Mittelwert der Baumproben in einem Fenster. ist definiert alssss

sich=13k=ich- -2ichxk

Dabei ist Ihre Beispielbeobachtung und .i 2xich2

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:

xich xich- -1 y ixich- -2yich

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 = 1sy=0sy=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 = 1sy=0y=1y=1

Aber ich möchte Lust bekommen!

Es gibt eine Reihe anderer Techniken, mit denen Sie genau diese Aufgabe ausführen können.

  • k-Nächste Nachbarn
  • Neuronale Netze
  • Lineare Regression
  • SVM

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

from sklearn import svm

X = [[0, 0, 0], [1, 1, 1], ..., [1, 0, 1]] 
y = [0, 1, ..., 1]
clf = svm.SVC()
clf.fit(X, y)  

Dies trainiert Ihr Modell. Dann möchten Sie das Ergebnis für eine neue Stichprobe vorhersagen.

clf.predict([[2., 2., 1]])

Lassen Sie mich wissen, wenn Sie weitere Informationen zu bestimmten Dingen wünschen.
JahKnows

1
+1 für die detaillierte Antwort - Ich werde dies testen, sobald die Waschmaschine mehr Daten generiert;)
Laktak

Gibt es Alternativen zur Vorbereitung Ihrer Daten? Ich habe meine und Ihre alte Methode mit 3 und 5 Eingabewerten getestet, aber ich habe immer Probleme an den 'Kanten', wenn sich y ändert (wie y 1/0/1/0/1 anstelle von 1/1/1/1 / 1).
Laktak

An den Rändern? Ich bin mir nicht sicher, ob ich verstehe, was du meinst. Können Sie bitte näher darauf eingehen?
JahKnows

Wenn sich die Maschine beispielsweise ausschaltet, kann y mehrmals von 1 auf 0 und zurück springen. Anstelle einer Endzeit bekomme ich mehrere. Ich interessiere mich nur für die Start- und Endzeiten. Gibt es dafür vielleicht einen besseren Ansatz?
Laktak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.