Uso de datos de series temporales de un sensor para ML


8

Tengo los siguientes datos para un pequeño proyecto paralelo. Es de un acelerómetro colocado encima de una lavadora / secadora y me gustaría que me avise cuando la máquina haya terminado.

datos

x son los datos de entrada (movimiento x / y / z como un valor), y es la etiqueta de encendido / apagado

Debido a que los valores de x se superponen para y = 1 e y = 0, estaba pensando en usar xy una ventana de 3 minutos como entradas para un SVM:

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

datos

¿Es este un buen enfoque para este tipo de problema? ¿Existen alternativas que podrían producir mejores resultados?


Por una ventana móvil de tres minutos, ¿quiere decir que desea utilizar la entrada de una ventana de tres minutos tiempo = 1, 2, 3 y luego pasar a tiempo = 2, 3, 4 y obtener una etiqueta 0/1 para apagado / encendido para cada ventana?
StatsSorceress

@StatsSorceress básicamente sí - Estoy usando una ventana debido a que los valores de x se superponen (actualizado)
laktak

Respuestas:


7

Tiene datos de series de tiempo que se utilizan para medir la aceleración. Usted debe identificar cuándo la máquina está en su estado nominal (APAGADO) y en estado anómalo (ENCENDIDO). Este problema se resolvería mejor utilizando algoritmos de detección de anomalías. Pero, hay muchas maneras en que puede abordar este problema.

Preparando tus datos

Todos los métodos dependerán del método de extracción de características que seleccione. Suponiendo que continuemos usando la ventana de tiempo de 3 muestras como usted sugirió. En este algoritmo calculará una estadística para este estado nominaly=0 0. Sugeriría la media, como supongo que ya está haciendo, tome el promedio de las tres aceleraciones resultantes de la muestra. Entonces te quedarán con una gran cantidad de valores en un conjunto de entrenamientoS definido como

S={s0 0,s1,...,snorte}

dónde s es la media de las muestras de árboles en una ventana. s Se define como

syo=13k=yo-2yoXk

dónde X son sus observaciones de muestra y yo2.

Luego, recopile más datos si es posible con la máquina activa de modo que y=1.

Ahora puede elegir si desea entrenar su algoritmo en un conjunto de datos de una clase (detección de anomlay puro). Un conjunto de datos sesgado (detección de anomalías) o un conjunto de datos bien equilibrado. El saldo del conjunto de datos es la relación entre las dos clases en su conjunto de datos. Un conjunto de datos perfecto para un clasificador de 2 clases sería 1: 1. 50% de los datos pertenecientes a cada clase. Parece que tiene un conjunto de datos sesgado, suponiendo que no desea desperdiciar mucha electricidad.

Tenga en cuenta que no hay nada que le impida mantener divididas las muestras vecinas como una instancia en su conjunto de datos. Por ejemplo:

Xyo Xyo-1 Xyo-2 El | yyo

Esto haría un espacio de entrada tridimensional para una salida específica que se define para la muestra actualmente tomada.


Un conjunto de datos sesgado


Solución fácil

La forma más fácil que sugeriría. Suponga que está utilizando una estadística única para definir lo que sucede en la ventana de 3 muestras. De los datos recopilados obtenga el máximos de sus puntos nominales (y=0 0) y el mínimo s de tus puntos anómalos (y=1) Luego tome la marca de la mitad entre estos dos y úselo como su umbral.

Si una nueva muestra de prueba s^ es mayor que el umbral y luego asignar y=1.

Puedes extender esto calculando la media s para todas sus muestras nominales y=0 0. Luego calcule la media de sus muestras anómalasy=1. Si una nueva muestra se acerca a la media de las muestras anómalas, entonces clasifíquela comoy=1.

¡Pero quiero ponerme elegante!

Existen varias otras técnicas que puede utilizar para realizar esta tarea exacta.

  • Vecinos k-más cercanos
  • Redes neuronales
  • Regresión lineal
  • SVM

En pocas palabras, casi todos los algoritmos de aprendizaje automático son adecuados para este propósito. Solo depende de la cantidad de datos disponibles y de su distribución.


Realmente quiero usar SVM


Si este es el caso, mantenga las tres muestras completamente separadas. Su matriz de entrenamiento tendrá 3 columnas como se discutió anteriormente. Y entonces tendrás tus salidasy. Usar SVM en python es muy fácil: 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)  

Esto entrena a tu modelo. Entonces querrá predecir el resultado para una nueva muestra.

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

Avíseme si desea más información sobre cosas específicas.
JahKnows

1
+1 para la respuesta detallada
probaré

¿Hay alguna alternativa a 'Preparar sus datos'? He probado mi antiguo método y el tuyo con 3 y 5 valores de entrada, pero siempre tengo problemas en los 'bordes' cuando y cambia (como y 1/0/1/0/1 en lugar de 1/1/1/1 / 1)
laktak

En los bordes? No estoy seguro de entender lo que quieres decir. ¿Puedes elaborar por favor?
JahKnows

Por ejemplo, cuando la máquina se apaga, y puede saltar de 1 a 0 y retroceder varias veces. En lugar de una hora final, obtengo varias. Solo estoy interesado en los tiempos de inicio y finalización, ¿hay quizás un mejor enfoque para eso?
laktak
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.