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:
- Os três principais conjuntos de máximos locais adjacentes e mínimos locais com maior amplitude (diferença)
- Média do valor do torque
- 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:
- Como fazer a detecção de anomalias sobre "conjunto de séries temporais" e não apenas pontos de dados individuais?
- 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?