Ingeniería

Anotaciones de usuario para Machine Learning de Elastic

Las anotaciones de usuario son una nueva característica de Machine Learning en Elasticsearch disponible a partir de la versión 6.6 en adelante. Estas ofrecen una manera de incrementar tus trabajos de Machine Learning con conocimiento de dominio descriptivo. Cuando ejecutas un trabajo de Machine Learning, tu algoritmo intenta encontrar anomalías, pero no sabe de qué se tratan los datos en sí. El trabajo no sabría, por ejemplo, si está tratando con uso de CPU o con rendimiento de red. Las anotaciones de usuario ofrecen una manera de incrementar los resultados con el conocimiento que tú tienes como usuario de los datos. 

En este blog, te mostraremos cómo funcionan las anotaciones de usuario y cómo aplicarlas a diferentes casos de uso. Analizaremos datos de Hydro Online, un portal de datos abierto ejecutado por el gobierno local de Austria. Hydro Online ofrece una interfaz para investigar datos de sensores meteorológicos como acumulación de precipitaciones, altura de los ríos o totales de nieve acumulada. Como se describe en uno de nuestros blogs anteriores, el visualizador de datos de archivos ofrece una manera robusta de ingestar datos a partir de datos CSV, como en este caso.

Uso

Comencemos por un trabajo de una sola métrica que analiza las mediciones de altura del río Grossache que atraviesa la localidad de Kössen. Una vez creado el trabajo, el visualizador Single Metric Viewer puede usarse para agregar anotaciones a los resultados del análisis. Simplemente arrastra por encima de un rango de horas en el gráfico para crear una anotación. Aparecerá un elemento flotante a la derecha que te permite agregar una descripción personalizada. En el ejemplo a continuación, anotamos una altura anómala del río (se produjo una inundación importante en esa fecha). Al crear la anotación, puedes poner esa información a disposición de otros usuarios.

La anotación queda visible en el mismo gráfico y en la tabla Anotaciones debajo de este. La etiqueta visible en la primera columna de la tabla puede usarse para identificar la anotación en el gráfico. Estas etiquetas se crean de manera dinámica para las anotaciones en pantalla. Al desplazar el puntero sobre una fila en la tabla Anotaciones, la anotación correspondiente también se resaltará en el gráfico que está arriba de esta.

También se puede acceder a las anotaciones creadas para cada trabajo desde la página Administración de trabajos, donde se muestran en su propia pestaña al expandir una fila en la lista de trabajos. Cada anotación en la tabla incluye un enlace en la columna derecha, que te lleva de nuevo al visualizador Single Metric Viewer con un enfoque en el intervalo de tiempo que cubre la anotación. Estos enlaces permanentes también pueden compartirse con los demás. Esto significa que puedes usar las anotaciones para crear marcadores sobre determinadas anomalías para revisarlas más adelante.

Si hay varias anotaciones que cubren el mismo intervalo de tiempo, las anotaciones se distribuirán en forma vertical en el gráfico para evitar que se superpongan. Para editar o eliminar una anotación, simplemente haz clic en ella en el gráfico. El elemento flotante volverá a abrirse a la derecha, donde podrás editar el texto o eliminar la anotación. Desde la versión 6.7 en adelante, esto también puede hacerse con el botón Editar en la tabla Anotaciones, lo cual hace que esta funcionalidad también esté disponible desde la página Administración de trabajos.

Ahora que hemos cubierto la funcionalidad básica de cómo crear y trabajar con anotaciones de usuario, veamos otros casos de uso.

Uso de anotaciones para verificar anomalías previstas

Las anotaciones pueden usarse para proporcionar datos reales para verificar si un trabajo de Machine Learning produce los resultados esperados. En el siguiente ejemplo, estamos viendo nuevamente los datos de nivel del río desde Hydro Online y nos enfocamos ahora en superponer automáticamente los eventos históricos como anotaciones en los resultados de anomalías. Como científico de datos, por ejemplo, tu trabajo podría incluir obtener y preparar tanto los datos de origen que deseas analizar como el conjunto de datos para verificar los resultados.

Para nuestro propio análisis, necesitamos el conjunto de datos sin procesar.


Afortunadamente, en este caso, además de investigar datos a través de la interfaz web, también podemos descargar datos históricos para un análisis más profundo. Para este ejemplo usaremos los datos de altura del río del río Grossache medidos en el punto de medición “Huette”. Las anotaciones que cubren los datos reales deseados se crearán a partir de un documento que describe alturas severas del río e inundaciones.

Además de usar la UI descrita anteriormente, las anotaciones de Machine Learning se almacenan como documentos en un índice de Elasticsearch estándar diferente. Las anotaciones también pueden crearse de forma programática o manual usando las API de Elasticsearch estándares. Las anotaciones se almacenan en un índice de versión específica, y deben ser accesibles a través de los alias .ml-annotations-read y .ml-annotations-write. Para este ejemplo, agregaremos anotaciones para reflejar los eventos históricos del río antes de crear nuestro trabajo de Machine Learning.

{
   "_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"
   }
}

Ahora crearemos un trabajo de Machine Learning para encontrar anomalías en la altura máxima del río usando un nombre que coincida con el campo job_id desde la anotación anterior para que detecte las anotaciones creadas de forma manual. Así es como se ve este trabajo en el asistente Single Metric una vez que realizamos la ingesta de los datos históricos del río en un índice de Elasticsearch:

El aspecto importante aquí es que el nombre del trabajo que elijamos coincida con el que se usó para las anotaciones. Una vez que ejecutamos el trabajo y pasamos al visualizador Single Metric Viewer, deberíamos ver las anotaciones correspondientes a las anomalías en la altura del río que detectó el trabajo de Machine Learning:

image9.png

Esta técnica ofrece una excelente manera de verificar si el análisis que estás ejecutado es válido en comparación con los datos de validación preexistentes almacenados como anotaciones.

Anotaciones para eventos del sistema

Además de las anotaciones generadas por el usuario anteriores, el backend de Machine Learning crea automáticamente anotaciones en algunas circunstancias para los eventos del sistema.

La captura de pantalla anterior muestra un ejemplo de una anotación creada de forma automática. En este caso, se ejecutó un trabajo de Machine Learning en tiempo real, pero la ingesta de datos no pudo estar al nivel de la tasa de ingesta requerida para el trabajo. Esto significa que los documentos se agregaron al índice después de que el trabajo ejecutó su análisis en el depósito. La anotación creada automáticamente resalta este problema que antes era difícil de detectar y depurar. Las características del texto de la anotación detallan el problema identificado y brindan una sugerencia sobre cómo resolverlo, en este caso, aumentando la configuración de query_delay.

Integración de alertas

Incluso antes de que las anotaciones de usuario para Machine Learning estuvieran disponibles, se podía usar Watcher para crear alertas con base en las anomalías identificadas por los trabajos de Machine Learning. Si bien esta es una gran mejora en comparación con las alertas sobre umbrales básicos, es posible que las alertas sean demasiado granulares para el grupo de destino que recibe las alertas. Como usuario de trabajos de Machine Learning, las anotaciones pueden proporcionarte una manera de seleccionar lo que se activa como alertas de Watcher y lo que se transmite a otros interesados. Dado que las anotaciones se almacenan en su propio índice de Elasticsearch, puedes usar Watcher para simplemente reaccionar a documentos recién creados en ese índice y activar notificaciones. Watcher también puede configurarse para enviar alertas a un canal de Slack. La siguiente configuración te brinda un ejemplo sobre cómo crear una inspección para activar mensajes de Slack cuando se crea una nueva anotación:

{
 "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": "New Annotation for job *{{ctx.payload.hits.hits.0._source.job_id}}*: {{ctx.payload.hits.hits.0._source.annotation}}",
         "attachments": [
           {
             "fallback": "View in 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": "View in 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:'*')))"
               }
             ]
           }
         ]
       }
     }
   }
 }
}

En la configuración anterior, simplemente reemplaza <slack-channel> y <kibana-host> por tu configuración y úsala para crear una inspección avanzada. Una vez que todo esté configurado, deberás recibir una notificación de Slack cada vez que crees una nueva anotación, incluido el texto de la anotación y un enlace a Single Metric Viewer.

Resumen

En este blog, presentamos la nueva característica de anotaciones para Machine Learning de Elasticsearch. Esta puede usarse para agregar anotaciones a través de la UI y para anotaciones del sistema activadas a través de tareas de backend. Estas anotaciones están disponibles como marcadores a través de la página Administración de trabajos y pueden compartirse con otras personas en forma de enlaces. Las anotaciones pueden crearse de forma programática desde datos externos para usarse como superposición de datos reales para las anomalías detectadas. Finalmente, en combinación con Watcher y la acción de demora en Elasticsearch, hemos visto cómo las anotaciones pueden usarse para enviar alertas seleccionadas. Diviértete con las anotaciones y búscanos en los foros de debate si tienes alguna pregunta.