Anotações de usuário para aprendizado de máquina da Elastic

As anotações de usuário são um novo recurso de aprendizado de máquina no Elasticsearch disponível a partir da versão 6.6. Elas permitem aprimorar os trabalhos de aprendizado de máquina com conhecimento de domínio descritivo. Quando você executa um trabalho de aprendizado de máquina, o respectivo algoritmo está tentando encontrar anomalias — mas ele não sabe o conteúdo dos dados em si. O trabalho não saberia, por exemplo, se está lidando com utilização da CPU ou throughput de rede. As anotações de usuário são uma maneira de aprimorar os resultados com o conhecimento que você enquanto usuário tem sobre os dados. 

Nesta postagem de blog, mostraremos como funcionam as anotações de usuário e como aplicá-las a diferentes casos de uso. Analisaremos os dados do Hydro Online — um portal de dados aberto operado pelo governo local tirolês da Áustria. O Hydro Online oferece uma interface para investigar dados de sensores de tempo como acúmulo pluviométrico, níveis hídricos nos rios ou totais de neve acumulada. Conforme descrição em uma de nossas postagens de blog anteriores, o File Data Visualizer oferece uma maneira robusta de fazer a ingestão de dados de dados CSV, como encontrado neste caso.

Utilização

Vamos começar com um trabalho de métrica única que analisa as medições de níveis hídricos do rio Grossache que passa pelo vilarejo de Kössen. Depois de criar o trabalho, o Single Metric Viewer pode ser usado para adicionar anotações aos resultados da análise. Basta arrastar por um intervalo de tempo no diagrama para criar uma anotação. Aparecerá um elemento popup à direita que permite adicionar uma descrição personalizada. No exemplo a seguir, anotamos um nível hídrico anômalo (uma inundação importante ocorreu nessa data). Criando a anotação, você pode disponibilizar essa informação a outros usuários.

A anotação fica visível no próprio diagrama em si e também na tabela de anotações abaixo dele. A identificação visível na primeira coluna da tabela pode ser usada para identificar a anotação no diagrama. Essas identificações são criadas dinamicamente para as anotações em exibição. Ao passar o mouse sobre uma linha na tabela Annotations (Anotações), a anotação correspondente também será realçada no diagrama acima dela.

As anotações criadas para cada trabalho também podem ser acessadas da página Job Management (Gerenciamento de trabalhos), em que elas são exibidas na própria guia expandindo uma linha na lista de trabalhos. Cada anotação na tabela inclui um link na coluna direita, que o leva de volta ao Single Metric Viewer com foco no intervalo de tempo coberto pela anotação. Esses permalinks também podem ser compartilhados com outros. Isso significa que você pode usar as anotações para criar marcadores em anomalias específicas para revisitá-los posteriormente.

Se houver várias anotações cobrindo o mesmo intervalo de tempo, as anotações serão distribuídas verticalmente no diagrama para evitar sobreposição. Para editar ou excluir uma anotação, basta clicar nela no diagrama. O elemento popup será aberto novamente à direita, e você poderá editar o texto ou excluir a anotação. A partir da versão 6.7, isso também poderá ser feito usando o botão de edição na tabela Annotations (Anotações), disponibilizando também essa funcionalidade na página Job Management (Gerenciamento de trabalhos).

Agora que tratamos da funcionalidade básica de como criar as anotações de usuário e trabalhar com elas, vamos prosseguir com alguns outros casos de uso.

Uso das anotações para verificar as anomalias esperadas

As anotações podem ser usadas para fornecer uma comprovação in loco que verifica se o aprendizado de máquina apresenta os resultados esperados. No exemplo a seguir, mais uma vez estamos analisando os dados de níveis hídricos do Hydro Online e agora queremos sobrepor automaticamente eventos históricos como anotações nos resultados de anomalias. Como cientista de dados, por exemplo, seu trabalho pode incluir a obtenção e preparação tanto dos dados de origem que você quer analisar quanto o conjunto de dados para verificar os resultados.

Para nossa própria análise, precisamos do conjunto de dados brutos.


Felizmente neste caso, além de investigar dados via interface da Web, também podemos fazer download de dados históricos para análise aprofundada. Para este exemplo, usaremos os dados de níveis hídricos do rio Grossache mensurados no ponto de mensuração “Huette”. As anotações que cobrem a comprovação in loco desejada serão criadas com base em um documento que descreve severos níveis hídricos e inundações.

Além de usar a IU descrita anteriormente, as anotações de aprendizado de máquina são armazenadas como documentos em um índice padrão separado do Elasticsearch. As anotações também podem ser criadas via programação ou manualmente usando APIs do Elasticsearch padrão. As anotações são armazenadas em um índice específico de versão, e devem ser acessadas através dos aliases .ml-annotations-read e .ml-annotations-write. Para este exemplo, adicionaremos anotações para refletir os eventos históricos do rio antes de criar nosso trabalho de aprendizado de máquina.

{
   "_index":".ml-annotations-6",
   "_type":"_doc",
   "_id":"DGNcAmoBqX9tiPPqzJAQ",
   "_score":1.0,
   "_source":{
      "timestamp":1368870463669,
      "end_timestamp":1371015709121,
      "annotation":"2013 June; 770 m3/s; 500 houses flooded.",
      "job_id":"annotations-leukental-4d-1533",
      "type":"annotation",
      "create_time":1554817797135,
      "create_username":"elastic",
      "modified_time":1554817797135,
      "modified_username":"elastic"
   }
}

Agora criaremos um trabalho de aprendizado de máquina para encontrar anomalias em um nível hídrico máximo usando um nome que corresponde ao campo job_id da anotação acima para que ele escolha as anotações criadas manualmente. Esta é a aparência desse trabalho no assistente Single Metric depois que fazemos a ingestão dos dados históricos do rio em um índice do Elasticsearch:

A informação importante aqui é que o nome do trabalho que escolhemos corresponde àquele usado para as anotações. Depois que executamos o trabalho e mudamos para o Single Metric Viewer, devemos ver as anotações correspondentes às anomalias no nível hídrico que o trabalho de aprendizado de máquina detectou:

image9.png

Essa técnica oferece uma excelente maneira de verificar se a análise que você está executando é válida quando é comparada com os dados de validação preexistentes armazenados como anotações.

Anotações para eventos de sistema

Além das anotações anteriores geradas pelo usuário, o backend de aprendizado de máquina cria automaticamente anotações em algumas circunstâncias para eventos de sistema.

A captura de tela anterior mostra um exemplo de uma anotação criada automaticamente. Nesse caso, um trabalho de aprendizado de máquina em tempo real foi executado, mas a ingestão de dados não foi capaz de acompanhar a taxa de ingestão necessária para o trabalho. Isso significou que os documentos foram adicionados ao índice depois que o trabalho tinha executado sua análise. A anotação criada automaticamente realça esse problema que antes era difícil de identificar e depurar. O texto da anotação apresenta detalhes do problema identificado e oferece uma sugestão sobre como resolvê-lo — nesse caso aumentando a configuração query_delay.

Alerta da integração

Mesmo antes da disponibilidade das anotações do usuário para aprendizado de máquina, você poderia usar o Watcher para criar alertas com base nas anomalias identificadas pelos trabalhos de aprendizado de máquina. Apesar de isso ser uma grande melhoria em comparação com alertas em limites básicos, os alertas podem ser excessivamente granulares para o grupo de destino que recebe os alertas. Tendo você como usuário de trabalhos de aprendizado de máquina, as anotações podem lhe proporcionar uma maneira de selecionar o que é disparado como alertas do Watcher e o que é repassado para outros envolvidos. Como as anotações são armazenadas em seu próprio índice do Elasticsearch, você pode usar o Watcher para simplesmente reagir a documentos recém-criados nesse índice e disparar notificações. O Watcher também pode ser configurado para enviar alertas para um canal de Slack. A configuração a seguir oferece um exemplo sobre como criar um relógio para disparar mensagens do Slack quando uma nova anotação é criada:

{
 "trigger": {
   "schedule": {
     "interval": "5s"
   }
 },
 "input": {
   "search": {
     "request": {
       "search_type": "query_then_fetch",
       "indices": [
         ".ml-annotations-read"
       ],
       "rest_total_hits_as_int": true,
       "body": {
         "size": 1,
         "query": {
           "range": {
             "create_time": {
               "gte": "now-9s"
             }
           }
         },
         "sort": [
           {
             "create_time": {
               "order": "desc"
             }
           }
         ]
       }
     }
   }
 },
 "condition": {
   "compare": {
     "ctx.payload.hits.total": {
       "gte": 1
     }
   }
 },
 "actions": {
   "notify-slack": {
     "transform": {
       "script": {
         "source": "def payload = ctx.payload; DateFormat df = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\"); payload.timestamp_formatted = df.format(Date.from(Instant.ofEpochMilli(payload.hits.hits.0._source.timestamp)));  payload.end_timestamp_formatted = df.format(Date.from(Instant.ofEpochMilli(payload.hits.hits.0._source.end_timestamp))); return payload",
         "lang": "painless"
       }
     },
     "throttle_period_in_millis": 10000,
     "slack": {
       "message": {
         "to": [
           "#<slack-channel>"
         ],
         "text": "Nova anotação para trabalho *{{ctx.payload.hits.hits.0._source.job_id}}*: {{ctx.payload.hits.hits.0._source.annotation}}",
         "attachments": [
           {
             "fallback": "Exibir no Single Metric Viewer http://<kibana-host>:5601/app/ml#/timeseriesexplorer?_g=(ml:(jobIds:!({{ctx.payload.hits.hits.0._source.job_id}})),refreshInterval:(pause:!t,value:0),time:(from:'{{ctx.payload.timestamp_formatted}}',mode:absolute,to:'{{ctx.payload.end_timestamp_formatted}}'))&_a=(filters:!(),mlSelectInterval:(interval:(display:Auto,val:auto)),mlSelectSeverity:(threshold:(color:%23d2e9f7,display:warning,val:0)),mlTimeSeriesExplorer:(zoom:(from:'{{ctx.payload.timestamp_formatted}}',to:'{{ctx.payload.end_timestamp_formatted}}')),query:(query_string:(analyze_wildcard:!t,query:'*')))",
             "actions": [
               {
                 "name": "action_name",
                 "style": "primary",
                 "type": "button",
                 "text": "Exibir no Single Metric Viewer",
                 "url": "http://<kibana-host>:5601/app/ml#/timeseriesexplorer?_g=(ml:(jobIds:!({{ctx.payload.hits.hits.0._source.job_id}})),refreshInterval:(pause:!t,value:0),time:(from:'{{ctx.payload.timestamp_formatted}}',mode:absolute,to:'{{ctx.payload.end_timestamp_formatted}}'))&_a=(filters:!(),mlSelectInterval:(interval:(display:Auto,val:auto)),mlSelectSeverity:(threshold:(color:%23d2e9f7,display:warning,val:0)),mlTimeSeriesExplorer:(zoom:(from:'{{ctx.payload.timestamp_formatted}}',to:'{{ctx.payload.end_timestamp_formatted}}')),query:(query_string:(analyze_wildcard:!t,query:'*')))"
               }
             ]
           }
         ]
       }
     }
   }
 }
}

Na configuração anterior, basta substituir <slack-channel> e <kibana-host> por suas configurações e usá-la para criar um relógio avançado. Depois que tudo estiver configurado, você deverá receber uma notificação do Slack sempre que criar uma nova anotação — incluindo o texto da anotação e um link de volta ao Single Metric Viewer.

Resumo

Neste artigo, apresentamos o novo recurso de anotações para aprendizado de máquina do Elasticsearch. Ele pode ser usado para adicionar anotações através da IU e para anotações de sistema disparadas via tarefas de backend. Essas anotações estão disponíveis como marcadores via página Job Management (Gerenciamento de trabalhos) e são compartilháveis como links com terceiros. As anotações podem ser criadas via programação a partir de dados externos que serão usados como sobreposição de comprovação in loco para anomalias detectadas. Por fim, em combinação com o Watcher e a ação do Slack no Elasticsearch, vimos como as anotações podem ser usadas para alertas selecionados. Divirta-se com as anotações e encontre-nos nos fóruns de discussão se tiver alguma dúvida.