Utilizzo dei dati delle serie temporali da un sensore per ML


8

Ho i seguenti dati per un piccolo progetto laterale. Viene da un accelerometro seduto sopra una lavatrice / asciugatrice e vorrei che mi dicesse quando la macchina è finita.

dati

x è i dati di input (movimento x / y / z come un valore), y è l'etichetta on / off

Poiché i valori x si sovrappongono per y = 1 e y = 0, stavo pensando di usare x e una finestra mobile di 3 minuti come input per un SVM:

xyz60=res.xyz.resample("60S").max()
X["x"]=xyz60
X["max3"]=xyz60.rolling(window=3, min_periods=1).max()

dati

È un buon approccio per questo tipo di problema? Esistono alternative che potrebbero produrre risultati migliori?


Per una finestra scorrevole di tre minuti, vuoi dire che vuoi usare l'input da una finestra di tre minuti = 1, 2, 3 e poi passare a tempo = 2, 3, 4 e ottenere un'etichetta 0/1 per off / on per ogni finestra?
StatsSorceress

@StatsSorceress praticamente sì - Sto usando una finestra perché i valori x si sovrappongono (aggiornato)
laktak

Risposte:


7

Sono disponibili dati di serie temporali che vengono utilizzati per misurare l'accelerazione. Tu che identificare quando la macchina è nel suo stato nominale (OFF) e stato anomalo (ON). Questo problema sarebbe meglio risolto utilizzando algoritmi di rilevamento anomalie. Ma ci sono così tanti modi in cui puoi affrontare questo problema.

Prepararti i dati

Tutti i metodi dipenderanno dal metodo di estrazione delle caratteristiche selezionato. Supponendo che continueremo a utilizzare la finestra temporale di 3 campioni come da lei suggerito. In questo algoritmo calcolerai una statistica per questo stato nominaley=0. Vorrei suggerire la media mentre presumo che tu stia già facendo, prendere la media delle tre accelerazioni risultanti dal campione. Ti verrà quindi lasciato un gran numero di valori in un set di allenamentoS definito come

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

dove s è la media dei campioni dell'albero in una finestra. s è definito come

Sio=13ΣK=io-2ioXK

dove X sono le tue osservazioni campione e io2.

Quindi raccogliere più dati se è possibile con la macchina attiva tale che y=1.

Ora puoi scegliere se vuoi allenare il tuo algoritmo su un set di dati di una classe (rilevamento puro di anomlay). Un set di dati distorto (rilevamento anomalie) o un set di dati ben bilanciato. Il saldo del set di dati è il rapporto tra le due classi nel set di dati. Un set di dati perfetto per un classificatore di 2 classi sarebbe 1: 1. 50% dei dati appartenenti a ciascuna classe. Sembra che tu abbia un set di dati distorto, supponendo che tu non voglia sprecare molta elettricità.

Si noti che non vi è nulla che ti impedisca di mantenere i campioni vicini divisi come istanza nel set di dati. Per esempio:

Xio Xio-1 Xio-2 | yio

Ciò renderebbe uno spazio di input tridimensionale per un output specifico che è definito per il campione attualmente prelevato.


Un set di dati distorto


Soluzione facile

Il modo più semplice che suggerirei. Supponiamo che tu stia utilizzando una singola statistica per definire cosa sta succedendo nella finestra di esempio 3. Dai dati raccolti ottieni il massimoS dei tuoi punti nominali (y=0) e il minimo S dei tuoi punti anomali (y=1). Quindi prendi il segno a metà strada tra questi due e usalo come soglia.

Se un nuovo campione di prova S^ è maggiore della soglia quindi assegnare y=1.

Puoi estenderlo calcolando la media S per tutti i campioni nominali y=0. Quindi calcola la media per i tuoi campioni anomaliy=1. Se un nuovo campione si avvicina alla media dei campioni anomali, classificarlo comey=1.

Ma voglio essere sofisticato!

Esistono diverse altre tecniche che è possibile utilizzare per eseguire esattamente questo compito.

  • k-vicini più vicini
  • Reti neurali
  • Regressione lineare
  • SVM

In poche parole, quasi tutti gli algoritmi di apprendimento automatico sono adatti a questo scopo. Dipende solo dalla quantità di dati disponibili e dalla sua distribuzione.


Voglio davvero usare SVM


In questo caso, mantenere i tre campioni completamente separati. La matrice di allenamento avrà 3 colonne come discusso sopra. E poi avrai le tue uscitey. L'uso di SVM in python è molto semplice: http://scikit-learn.org/stable/modules/svm.html .

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)  

Questo allena il tuo modello. Quindi vorrai prevedere il risultato per un nuovo campione.

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

Fammi sapere se vuoi maggiori informazioni su cose specifiche.
JahKnows,

1
+1 per la risposta dettagliata - Lo
testerò

Esistono alternative a "Preparazione dei dati"? Ho testato il mio vecchio metodo e il tuo con 3 e 5 valori di input ma ho sempre problemi ai "bordi" quando y cambia (come y 1/0/1/0/1 anziché 1/1/1/1 / 1).
Laktak,

Ai bordi? Non sono sicuro di capire cosa intendi. Puoi elaborare per favore?
JahKnows,

Ad esempio, quando la macchina si spegne, y può saltare da 1 a 0 e tornare indietro più volte. Invece di un tempo finale ne ottengo diversi. Sono interessato solo agli orari di inizio e fine, c'è forse un approccio migliore per quello?
Laktak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.