Cómo comparar diferentes conjuntos de datos de series de tiempo

8

Estoy tratando de hacer alguna detección de anomalías entre series de tiempo # usando Python y sklearn (¡pero otras sugerencias de paquetes son definitivamente bienvenidas!).

Tengo un conjunto de 10 series temporales; cada serie temporal consta de datos recopilados del valor de torque de un neumático (por lo tanto, 10 neumáticos en total) y los conjuntos pueden no contener el mismo número de puntos de datos (el tamaño del conjunto difiere) . Cada dato de serie temporal es más o menos solo tire_id, marca de tiempo y sig_value (valor de la señal o el sensor). Los datos de muestra para una serie temporal se ven así:

tire_id        timestamp        sig_value
tire_1           23:06.1            12.75
tire_1           23:07.5                0
tire_1           23:09.0            -10.5

Ahora tengo 10 de ellos, y 2 de ellos se comportan de manera extraña. Entiendo que este es un problema de detección de anomalías, pero la mayoría de los artículos que leo en línea están detectando puntos de anomalías dentro de la misma serie temporal (es decir, si en algunos puntos los valores de torque no son normales para ese neumático).

Para detectar qué 2 neumáticos se comportan de manera anormal, intenté usar el método de agrupamiento, básicamente agrupamiento k-significa (ya que no está supervisado).

Para preparar los datos para alimentar la agrupación de k-means, para cada serie de tiempo (también conocido como para cada neumático), calculé:

  1. Los 3 conjuntos principales de máximo local adyacente y mínimo local con mayor amplitud (diferencia)
  2. Valor medio del par
  3. Desviación estándar de valores de torque

También configuré el número de clústeres en solo 2, por lo tanto, clúster 1 o 2.

Entonces mi resultado final (después de asignar grupos) se ve así:

        amplitude  local maxima  local minima  sig_value_std  \
tire_0     558.50        437.75       -120.75      77.538645   
tire_0     532.75        433.75        -99.00      77.538645   
tire_0     526.25        438.00        -88.25      77.538645   
tire_1     552.50       -116.50        436.00      71.125912   
tire_1     542.75        439.25       -103.50      71.125912   

        sig_value_average  cluster  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_1          11.588038        1  
tire_1          11.588038        0 

Ahora tengo una pregunta de qué hacer con este resultado ... por lo que cada neumático tiene 3 filas de datos, ya que elegí los 3 pares superiores de max / min local con 3 amplitudes más grandes, y eso significa que cada fila puede ser asignados a un grupo, y a veces se asignan a diferentes grupos para 1 llanta incluso. Además, el tamaño del clúster es normalmente mayor que solo 2.

Mis preguntas son:

  1. ¿Cómo hacer la detección de anomalías sobre el "conjunto de series temporales" y no solo puntos de datos individuales?
  2. ¿Es mi enfoque razonable / lógico? Si es así, ¿cómo puedo limpiar mi resultado para obtener lo que quiero? Y si no, ¿qué puedo hacer para mejorar?
siempre haciendo preguntas
fuente

Respuestas:

1

Pregunta bastante interesante!

En primer lugar, eche un vistazo a mi edición, ya que su pregunta no estaba clara de acuerdo con la terminología estándar. tiene un conjunto de series temporales y desea detectar los valores atípicos (anomalías).

  1. Su enfoque es bastante claro y lógico y muestra comprensión del problema y la solución. El punto es sobre la forma en que elegiste aplicarlo.
  2. K-means no es la mejor manera. Me gustaría señalar que la elección de 2 grupos es muy inteligente aquí, ya que espera que los grupos se formen en función de una estructura normal / anormal. Simplemente no funciona bien en la práctica si las características que extrajo de su serie temporal no inhiben el comportamiento anormal.
  3. Supongo que los algoritmos de incrustación son la forma correcta de hacerlo. Lo más probable es que si aplica una PCA simple verá series temporales anormales en algún lugar más alejado que otros. Abajo escribo el código. Pruébelo y envíeme una línea si no funcionó, así que busco soluciones más sofisticadas (por ejemplo, puede construir un espacio de fase y ver sus datos allí o monitorear la recurrencia de series de tiempo, etc.)
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

pca = PCA(n_components=2)
X_new = pca.fit_transform(X)
plt.figure(figsize=(10,10))
plt.plot(X_new[:,0],X_new[:,1],"*")
plt.show()

donde X es una matriz de 10xN en la que cada fila es una serie de tiempo.

Puede elegir más componentes para PCA y comparar diferentes PC entre sí.

De todos modos, el problema no es tan difícil y si no funciona, actualizaré mi respuesta con otra solución.

Espero que ayude y buena suerte!

Kasra Manshaei
fuente
hola Kasra! ¡Muchas gracias por intentar ayudar! Estoy probando su método y noté una escasez / limitación de su método ... es decir, su enfoque supone que cada conjunto de datos de series de tiempo que estoy usando tiene el mismo número de puntos de datos, lo cual no es el caso aquí ... alguna otra sugerencia? :(
alwaysaskingquestions
Claro, si votó / acepta la respuesta si funcionó. En la primera etapa solo recorta series temporales. Córtelos para que tengan el mismo tamaño que las series de tiempo más cortas. Si no ayudó, suelte otro comentario aquí.
Kasra Manshaei
Hola Kasra, no quiero perder los datos; ¿Es posible no cortar los datos? Quiero usarlos todos.
alwaysaskingquestions
Así que reemplace la cola de su serie temporal con el último valor. Solo pruébalo y avísame si funcionó
Kasra Manshaei
¿Eso no cambia los datos básicamente? porque ahora estoy agregando valor a los conjuntos de datos más cortos ... así que eso está cambiando mis resultados ¿verdad? (¡
Muchas