fundo
Estou trabalhando no Network Operations Center, monitoramos os sistemas de computadores e seu desempenho. Uma das principais métricas a serem monitoradas é o número de visitantes \ clientes atualmente conectados aos nossos servidores. Para torná-lo visível, nós (equipe de operações) coletamos métricas como dados de séries temporais e desenhamos gráficos. O Grafite nos permite fazer isso, ele possui uma API bastante rica que eu uso para criar um sistema de alerta para notificar nossa equipe se quedas repentinas (principalmente) e outras alterações ocorrerem. Por enquanto, eu configurei um limite estático com base no valor médio, mas não funciona muito bem (há muitos falsos positivos) devido à carga diferente durante o dia e a semana (fator de sazonalidade).
Parece algo como isto:
Os dados reais (um exemplo para uma métrica, intervalo de 15 minutos; o primeiro número é um número de usuários, o segundo registro de data e hora):
[{"target": "metric_name", "datapoints": [[175562.0, 1431803460], [176125.0, 1431803520], [176125.0, 1431803580], [175710.0, 1431803640], [175710.0, 1431803700], [175733.0, 1431803760], [175733.0, 1431803820], [175839.0, 1431803880], [175839.0, 1431803940], [175245.0, 1431804000], [175217.0, 1431804060], [175629.0, 1431804120], [175104.0, 1431804180], [175104.0, 1431804240], [175505.0, 1431804300]]}]
O que estou tentando realizar
Criei um script Python que recebe pontos de dados recentes, os compara com a média histórica e alerta se houver uma mudança ou queda repentina. Devido à sazonalidade, o limite "estático" não funciona bem e o script gera alertas de falsos positivos. Quero melhorar um algoritmo de alerta para ser mais preciso e fazê-lo funcionar sem ajustar constantemente o limite de alerta.
Que conselhos eu preciso e coisas que descobri
Ao pesquisar no Google, percebi que estava procurando algoritmos de aprendizado de máquina para detecção de anomalias (não supervisionados). Uma investigação mais aprofundada mostrou que existem muitos deles e é muito difícil entender qual deles é aplicável no meu caso. Devido ao meu conhecimento limitado de matemática, não consigo ler trabalhos acadêmicos sofisticados e estou procurando algo simples para um iniciante no campo.
Eu gosto de Python e estou familiarizado com R, por isso ficarei feliz em ver exemplos para essas linguagens. Por favor, recomende um bom livro ou artigo que me ajude a resolver meu problema. Obrigado pelo seu tempo e com licença para uma descrição tão longa
Links Úteis
Perguntas semelhantes:
- Detecção de séries temporais e anomalias
- Detecção de anomalia de séries temporais com Python
- Anomalias de séries temporais
- Algoritmos para detecção de anomalias de séries temporais
- Aplicação de wavelets a algoritmos de detecção de anomalias baseados em séries temporais
- Qual algoritmo devo usar?
Fontes externas:
auto.arima
função do excelenteforecast
pacote de R (consulte jstatsoft.org/v27/i03/paper ). Você pode ajustar os níveis de confiança ajustando olevel
parâmetro, por exemplodata.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99)
.Respostas:
Eu acho que a chave é um qualificador "inesperado" no seu gráfico. Para detectar o inesperado, você precisa ter uma idéia do que é esperado .
O número de visitantes é provavelmente bastante persistente, mas super sazonal. Talvez funcione melhor para tentar manequins sazonais em vez da sazonalidade multiplicativa; tente o ARMAX, onde X representa variáveis exógenas, que podem ser algo como manequim de férias, manequins de hora, manequins de fim de semana etc.
fonte
No blog de tecnologia da Netflix, há um artigo sobre sua ferramenta de detecção robusta de anomalias (RAD). http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html
Ele lida com a sazonalidade e com conjuntos de dados de volume muito alto, para que possa atender às suas necessidades. O código é de código aberto Java e Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig
O algoritmo subjacente é baseado em PCA robusto - veja o artigo original aqui: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf
fonte
A maioria dos algoritmos de detecção outlier no pacote de código aberto é para dados de séries temporais de negócios com dados de frequência baixa, diária / semanal / mensal de baixa frequência. Esses dados parecem pertencer a uma área especializada que é capturada em minutos, portanto, não tenho certeza se a detecção de outlier de código aberto seria útil. Você pode tentar adaptar essas abordagens aos seus dados.
Abaixo, descrevo algumas abordagens de pacotes disponíveis em código aberto
R
:Existem pacotes comerciais que têm abordagens dedicadas para tentar detectar anomolias. Outra abordagem clássica é o algoritmo de detecção de outlier de séries temporais de Tsay , semelhante à abordagem de Chen e Liu, que detecta diferentes tipos de outliers. Recentemente, também deparei com essa solução de software comercial chamada metafor, que pode ser mais adequada para seus dados.
Espero que isso seja útil
fonte
changepoint
pacote para R. Se você quiser saber mais, pode verificar as seguintes publicações e as referências que elas fornecem:fonte
Você já tentou usar as regras de controle estatístico de processos (por exemplo, Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?
Eu os uso para dados de séries temporais - geralmente com um toque de intuição sobre os dados - para avaliar se os dados estão indo para algum lugar que eu não quero que vá. Como no seu exemplo, essas regras dizem que se o delta / alteração for consistente em vários pontos de dados, sinaliza que pode haver um problema.
Além disso, o Controle Estatístico de Processo (CEP) pode ser bom para trabalhar se você estiver melhorando ou piorando do que antes.
Um problema com o SPC é que grande parte dele depende de uma distribuição normal que provavelmente não se adequa aos seus dados e que não pode ficar abaixo de zero. Outros melhores do que eu no SPC podem sugerir opções aqui. Gosto de usá-lo para sinalizar um problema, mas, como todos os modelos, é melhor usado com um pouco de conhecimento sobre os próprios dados (e origem).
fonte
Dado que a periodicidade das séries temporais deve ser bem entendida, um algoritmo simples, mas eficaz, baseado na diferenciação pode ser desenvolvido.
Uma diferenciação simples de uma etapa detectará uma queda repentina de um valor anterior
mas se a série tiver um forte componente periódico, você esperaria que essa queda fosse considerável regularmente. Nesse caso, seria melhor comparar qualquer valor com sua contraparte no mesmo ponto do ciclo anterior, ou seja, um período atrás.
No caso da pergunta postada, seria natural esperar dois componentes periódicos significativos, um com duração de um dia e outro com duração de uma semana. Mas isso não é uma complicação, pois a duração do período mais longo pode ser bem dividida pela duração do período mais curto.
Se as quedas tiverem um caráter mais proporcional, uma simples diferença falhará facilmente em detectar uma queda repentina quando a atividade estiver baixa. Em tais circunstâncias, o algoritmo pode ser modificado para calcular proporções.
Eu fiz alguns testes em R usando um conjunto de dados simulado. Nele, os dados são amostrados 6 vezes ao dia e há fortes períodos diários e semanais, juntamente com outros ruídos e flutuações. Gotas foram adicionadas em locais aleatórios e com durações entre 1 e 3.
Para isolar as quedas, as primeiras proporções foram calculadas à distância 42 e, em seguida, um limiar foi fixado em 0,6, pois apenas a alteração negativa de um determinado tamanho é interessante. Em seguida, uma diferença de uma etapa foi calculada e um limite definido em -0,5. No final, um falso positivo parece ter escapado (o do final da semana 16). Os gráficos à esquerda e à direita mostram os mesmos dados, apenas de maneiras diferentes.
fonte
Seria mais útil pensar nas mudanças nas séries temporais como o início de uma nova tendência, em vez de uma anomalia? Tomar a diferença entre pontos adjacentes ajudaria a saber quando a inclinação (derivada) está mudando e pode sinalizar o início de uma nova tendência na data. Também pode ser útil tirar as diferenças dos valores das diferenças (a segunda derivada). Fazer uma pesquisa no Google em "início de tendência da série temporal" pode dar boas sugestões de métodos. Nos dados financeiros, é dada muita atenção às novas tendências (você compra ou vende?), Para que haja documentos sobre esse tópico.
Uma boa introdução à wavelet é "O mundo segundo as wavelets", de Hubbard, acredito ser o autor.
fonte
Consegui obter bons resultados para séries temporais de várias estações do ano (diariamente, semanalmente) usando dois algoritmos diferentes:
O STL decompõe suas séries temporais no domínio do tempo em um componente de tendência, um único componente sazonal e o restante. O componente sazonal é a sazonalidade de alta frequência (por exemplo, diariamente), enquanto a tendência inclui a sazonalidade de baixa frequência (por exemplo, semanalmente) e a tendência adequada. Você pode separar os dois simplesmente executando STL novamente na tendência. De qualquer forma, depois de isolar a série restante dos outros componentes, você poderá executar sua detecção de anomalia nessa série.
Fiz um artigo mais detalhado aqui:
https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/
fonte
Inspirado por David, você tentou usar o FFT? Pode detectar quedas repentinas porque estão indicando suas anomalias. As anomalias podem aparecer em um espectro estreito. Então você pode capturá-los facilmente.
fonte