como comparar diferentes conjuntos de dados de séries temporais

8

Eu estou tentando fazer alguma detecção de anomalia entre séries temporais # usando Python e sklearn (mas outras sugestões de pacotes são definitivamente bem-vindas!).

Eu tenho um conjunto de 10 séries temporais; cada série temporal consiste em dados coletados do valor de torque de um pneu (total de 10 pneus) e os conjuntos podem não conter o mesmo número de pontos de dados (o tamanho do conjunto é diferente) . Cada dado da série temporal é basicamente apenas o pneu_id, o carimbo de data e hora e o sig_value (valor do sinal ou do sensor). Os dados de amostra para uma série temporal são assim:

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

Agora eu tenho 10 deles, e 2 deles se comportam estranhamente. Entendo que esse é um problema de detecção de anomalia, mas a maioria dos artigos que li on-line estão detectando pontos de anomalia dentro da mesma série temporal (ou seja, se em alguns momentos os valores de torque não são normais para esse pneu).

Para detectar quais 2 pneus estão se comportando de maneira anormal, tentei usar o método de agrupamento, basicamente k-significa agrupamento (já que não é supervisionado).

Para preparar os dados para alimentar o agrupamento k-means, para cada série temporal (também conhecida como cada pneu), calculei:

  1. Os três principais conjuntos de máximos locais adjacentes e mínimos locais com maior amplitude (diferença)
  2. Média do valor do torque
  3. Desvio padrão dos valores de torque

Também defino o número de clusters como apenas 2, portanto, o cluster 1 ou 2.

Portanto, meu resultado final (depois de atribuir clusters) é o seguinte:

        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 

Agora eu tenho uma pergunta sobre o que fazer com esse resultado ... para que cada pneu tenha 3 linhas de dados, pois escolhi os 3 melhores pares de máx / min local com 3 maiores amplitudes, e isso significa que cada linha pode ser atribuídos a um cluster e, às vezes, são atribuídos a diferentes clusters por 1 pneu uniforme. Além disso, o tamanho do cluster é normalmente maior que apenas 2.

Minhas perguntas são:

  1. Como fazer a detecção de anomalias sobre "conjunto de séries temporais" e não apenas pontos de dados individuais?
  2. Minha abordagem é razoável / lógica? Se for, como posso limpar meu resultado para obter o que quero? E se não, o que posso fazer para melhorar?
alwaysaskingquestions
fonte

Respostas:

1

Pergunta bastante interessante!

Antes de tudo, dê uma olhada na minha edição, pois sua pergunta não estava clara de acordo com a terminologia padrão. você tem um conjunto de séries temporais e deseja detectar os valores extremos (anormalidades).

  1. Sua abordagem é bastante clara e lógica e mostra a compreensão do problema e da solução. O ponto é sobre a maneira como você escolheu aplicá-lo.
  2. K-means não é o melhor caminho. Gostaria de salientar que a escolha de 2 clusters é muito inteligente aqui, pois você espera que os clusters sejam formados com base em uma estrutura normal / anormal. Na prática, simplesmente não funciona bem se os recursos que você extraiu de suas séries temporais não estão inibindo o comportamento anormal.
  3. Presumo que os algoritmos de incorporação sejam a maneira correta de fazer isso. Provavelmente, se você aplicar um PCA simples, verá séries temporais anormais em algum lugar além dos outros. Abaixo eu escrevo o código. Experimente e envie-me uma linha, se não funcionou, por isso busco soluções mais sofisticadas (por exemplo, você pode construir um espaço de fase e ver seus dados lá ou monitorar a recorrência de séries temporais 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()

onde X é uma matriz 10xN na qual cada linha é uma série temporal.

Você pode escolher mais componentes para o PCA e verificar PCs diferentes entre si.

De qualquer forma, o problema não é tão difícil e, se não funcionou, atualizarei minha resposta com outra solução.

Espero que ajude e boa sorte!

Kasra Manshaei
fonte
oi Kasra! Muito obrigado por tentar ajudar! Estou testando seu método e notei uma escassez / limitação do seu método ... ou seja, sua abordagem pressupõe que todos os conjuntos de dados de séries temporais que estou usando tenham o mesmo número de pontos de dados, o que não é o caso aqui ... alguma outra sugestão? :(
alwaysaskingquestions 04/0318
Certifique-se de votar / aceitar a resposta, se funcionou. No primeiro estágio, basta recortar séries temporais. Corte-os para ter o mesmo tamanho da menor série temporal. Se não ajudou, deixe outro comentário aqui.
Kasra Manshaei
Oi Kasra, eu não quero perder os dados; é possível não cortar os dados? Eu quero usar todos eles.
alwaysaskingquestions
Portanto, substitua a cauda de sua série temporal pelo último valor. Basta experimentá-lo e deixe-me saber se funcionou
Kasra Manshaei
isso não muda os dados basicamente? porque agora estou agregando valor aos conjuntos de dados mais curtos .... para que isso mude meus resultados, certo? (muito obrigado por ser paciente comigo!)
alwaysaskingquestions