paint-brush
Simplificación de la ingeniería de características para AI/ML en tiempo realpor@datastax
145 lecturas

Simplificación de la ingeniería de características para AI/ML en tiempo real

por DataStax9m2023/07/06
Read on Terminal Reader

Demasiado Largo; Para Leer

Una demostración de cómo las "líneas de tiempo" hacen que expresar consultas temporales sobre eventos y, lo que es más importante, entre eventos, no solo sea fácil, sino intuitivo.
featured image - Simplificación de la ingeniería de características para AI/ML en tiempo real
DataStax HackerNoon profile picture
0-item


Al desarrollar funciones para aplicaciones de AI/ML en tiempo real, es crucial comprender los patrones basados en el tiempo dentro de sus datos, ya que pueden revelar información valiosa. Sin embargo, expresar consultas temporales puede plantear desafíos. Solo imagine la capacidad de analizar sin esfuerzo el comportamiento de sus usuarios a lo largo del tiempo, realizar uniones temporales precisas y examinar patrones de actividad entre varios eventos, todo mientras mantiene un manejo intuitivo y sin problemas del tiempo. Aquí es donde las líneas de tiempo, una abstracción de alto nivel para trabajar con datos temporales, pueden resultar invaluables.


En este artículo, profundizaremos en el mundo de las líneas de tiempo. Demostraremos cómo hacen que expresar consultas temporales sobre eventos y, lo que es más importante, entre eventos, no solo sea fácil sino también intuitivo. Este artículo es el segundo de una serie sobre Kaskada , un motor de procesamiento de eventos de código abierto diseñado en torno a la abstracción de la línea de tiempo. Nosotros previamente presentó la línea de tiempo , una abstracción de alto nivel para trabajar con datos temporales. Las líneas de tiempo organizan los datos basados en eventos por tiempo y entidad, lo que permite razonar sobre el contexto en torno a los eventos. Las consultas temporales expresas que utilizan líneas de tiempo tienen varios beneficios:


  • Intuitivo Debido a que las escalas de tiempo están ordenadas por tiempo, es natural que las consultas también operen en orden. A medida que avanza el tiempo, se producen eventos adicionales (entrada) y se reflejan en el resultado de la consulta. Esta forma de pensar sobre los cálculos, como el progreso a través del tiempo, es intuitiva porque coincide con la forma en que observamos los eventos.


  • Las operaciones temporales declarativas , como las ventanas y los desplazamientos, se declaran claramente cuando se trabaja con líneas de tiempo porque el tiempo es parte de la abstracción.


  • Componible Cada operación toma líneas de tiempo y produce líneas de tiempo, lo que significa que las operaciones se pueden encadenar según sea necesario para producir los resultados previstos.


A continuación, analizaremos cuatro ejemplos de la vida real que demuestran los beneficios de las líneas de tiempo. Comenzaremos con una consulta simple para la agregación y abordaremos progresivamente ventanas temporales más complejas, ventanas dependientes de datos y uniones temporalmente correctas. Al final, debe tener una comprensión profunda de cómo las escalas de tiempo hacen que la escritura de consultas temporales simples sea tan sencilla como SQL, y cómo nos permiten abordar las preguntas más desafiantes.


Descripción general del contenido

  • Gasto total: Agregación acumulativa.
  • Gasto mensual: ventana temporal
  • Vistas de página entre compras
  • Conclusión


Gasto total: Agregación acumulativa

Las escalas de tiempo son compatibles con todo lo que puede hacer en SQL y se extienden de manera intuitiva para operar con el tiempo. Antes de ver algunas capacidades nuevas para consultas temporales sofisticadas, veamos algo simple: una agregación. Escribir consultas simples es fácil: de hecho, debido a que las líneas de tiempo están ordenadas por tiempo y agrupadas por entidad, ¡pueden ser incluso más fáciles que en SQL!


Considere la pregunta, ¿cuánto gastó cada usuario? Al pensar en esto sobre eventos, es natural procesar las compras en orden, actualizando la cantidad que cada usuario ha gastado a lo largo del tiempo. El resultado es una suma acumulativa que produce una línea de tiempo continua.





La consulta correspondiente se muestra a continuación escrita de dos formas equivalentes. El primero enfatiza la suma que se aplica a las compras, mientras que el segundo enfatiza la cadena de operaciones que hemos compuesto: "tomar las compras y luego aplicar la suma". De aquí en adelante, usaremos este último, ya que se adapta mejor a la forma en que tendemos a pensar sobre el procesamiento de las líneas de tiempo.



sum(Purchases.amount)

#OR

Purchases.amount | sum()


Escribir consultas temporales simples con líneas de tiempo fue tan fácil como SQL. El procesamiento de eventos en orden es una forma intuitiva de operar a lo largo del tiempo. Por supuesto, agregar todos los eventos es solo una de las formas en que podemos desear agregar cosas. En el siguiente ejemplo, veremos cómo extender esta consulta usando ventanas temporales para enfocarnos en eventos recientes.


Gasto mensual: ventana temporal

Al pensar en consultas temporales, es muy natural hacer preguntas sobre el pasado reciente: hasta la fecha o los últimos 30 días. La intuición de procesar eventos en orden sugiere que responder a la pregunta "¿Cuánto ha gastado cada usuario este mes?" solo requiere restablecer el valor al comienzo de cada mes. Y esta intuición es exactamente cómo funcionan este tipo de ventanas temporales con las líneas de tiempo.




La consulta temporal se muestra a continuación. Indica claramente la intención que expresamos anteriormente: tomar las compras y agregarlas desde el comienzo de cada mes.


Purchases.amount

| sum(window=since(monthly()))


Debido a que el tiempo es inherentemente parte de cada línea de tiempo, cada agregación puede operar dentro de ventanas temporales. En el siguiente ejemplo, veremos lo fácil que es trabajar con consultas más complicadas, incluidas agregaciones con ventanas más sofisticadas.


Vistas de página entre compras

No todas las ventanas están definidas en términos de tiempo. Suele ser útil usar eventos para determinar las ventanas que se usan para la agregación. Además, si bien todos los ejemplos hasta ahora han operado en un solo tipo de evento ( purchases ), examinar los patrones de actividad entre diferentes eventos es fundamental para identificar las relaciones de causa y efecto.


En este ejemplo, aprovecharemos las escalas de tiempo para expresar consultas de forma declarativa mediante ventanas definidas por datos y varios tipos de eventos. También filtraremos una línea de tiempo intermedia a puntos específicos para controlar los valores usados en pasos posteriores al redactar la consulta.


La pregunta que responderemos es "¿Cuál es el número promedio de páginas vistas entre cada compra para cada usuario?" Primero calcularemos las visitas a la página desde la última compra, las observaremos en el momento de cada compra y luego tomaremos el promedio.


Ventanas definidas por datos

Lo primero que haremos será calcular el número de páginas vistas desde la última compra. En el ejemplo anterior, hicimos ventanas desde el comienzo del mes. Pero no hay nada especial en la línea de tiempo que define el comienzo de un mes: podemos usar cualquier otra línea de tiempo.



PageViews

| count(window=since(is_valid(Purchases)))




Además de las ventanas definidas por datos, vemos cómo trabajar con múltiples tipos de eventos. Debido a que cada línea de tiempo está ordenada por tiempo y agrupada por entidad, cada línea de tiempo puede alinearse por tiempo y unirse por entidad automáticamente.


Observar en momentos específicos

El paso anterior nos dio las páginas vistas desde la última compra. Pero era una línea de tiempo continua que aumentaba con cada vista de página hasta la siguiente compra. Buscamos una línea de tiempo discreta con un valor único en el momento de cada compra que represente las visitas a la página desde la compra anterior. Para ello, utilizamos la operación when , que permite observar, e interpolar si es necesario, una línea de tiempo en puntos específicos en el tiempo.




La operación when se puede usar en cualquier lugar de una consulta temporal y permite filtrar puntos, que están presentes en la salida, o se pasan a agregaciones posteriores.


Agregación anidada

Con el número de páginas vistas entre compras calculadas, ahora podemos calcular el promedio de este valor. Todo lo que tenemos que hacer es usar la agregación mean .




Poniendo todo junto

La consulta completa se muestra a continuación. Vemos que los pasos coinciden con los pasos lógicos que mencionamos anteriormente. Aunque la lógica era razonablemente compleja, la consulta es relativamente sencilla y captura nuestra idea de lo que queremos calcular: es posible hacer preguntas difíciles.


PageViews

| count(window=since(is_valid(Purchases)))

| when(is_valid(Purchases))

| mean()


Este tipo de consulta se puede generalizar para analizar una variedad de patrones en la actividad de vista de página. Tal vez solo queramos ver las visitas a la página del elemento visto con más frecuencia en lugar de todos los elementos, creyendo que el usuario se está enfocando más en ese elemento. Tal vez queramos ventana desde compras del mismo artículo, en lugar de cualquier compra.


Esta consulta mostró algunas formas en que las líneas de tiempo permiten expresar consultas temporales complejas:


  1. Ordenar permite que las ventanas se definan por sus delimitadores, cuándo comienzan y terminan, en lugar de tener que calcular una "ID de ventana" de cada valor para agrupar.


  2. Ordenar también permite que se usen múltiples líneas de tiempo dentro de la misma expresión, en este caso, pageviews y purchases .


  3. La continuidad permite interpolar valores en momentos arbitrarios y filtrarlos mediante la operación when .


  4. La compatibilidad permite que el resultado de cualquier operación se use con operaciones posteriores para expresar preguntas temporales. Esto permite expresar preguntas complejas como una secuencia de operaciones simples.


Estas capacidades permiten identificar patrones de causa y efecto. Si bien es posible que la compra ahora me haga hacer compras más tarde, otros eventos a menudo tienen una relación más fuerte, por ejemplo, quedarse sin cinta y comprar más, o programar un viaje de campamento y abastecerse. Poder ver la actividad ( pageviews ) dentro de una ventana definida por otros eventos ( purchases ) es importante para comprender la relación entre esos eventos.


Puntuación mínima de revisión

Ya hemos visto cómo las líneas de tiempo permiten trabajar con múltiples tipos de eventos asociados a una misma entidad. Pero a menudo también es necesario trabajar con varias entidades. Por ejemplo, usar información sobre toda la población para normalizar los valores de cada usuario. Nuestro ejemplo final mostrará cómo trabajar con varias entidades y realizar una unión temporal.


La pregunta final que responderemos es "¿Cuál es la revisión mínima promedio del producto (puntuación) en el momento de cada compra?" Para ello, primero trabajaremos con las opiniones asociadas a cada producto para calcular la puntuación media y luego uniremos cada compra con la opinión media correspondiente.


Cambio de entidades

Para comenzar, queremos calcular la revisión promedio del producto (puntuación) para cada artículo. Debido a que las revisiones actualmente están agrupadas por usuario, necesitaremos reagruparlas por artículo, usando la operación de tecla con. Una vez que hayamos hecho eso, podemos usar la agregación media que ya hemos visto.




Búsqueda entre entidades

Para cada compra (agrupada por usuario) queremos buscar el puntaje promedio de revisión del artículo correspondiente. Esto utiliza la operación lookup .





Poniendo todo junto

Poniéndolo todo junto, usamos la búsqueda con una agregación min para determinar la calificación promedio mínima de los artículos comprados por cada usuario.


Reviews.score

| with_key(Reviews.item)

| mean()

| lookup(Purchases.item)

| min()


Este patrón de reagrupación en una entidad diferente, realizar una agregación y buscar el valor (o volver a las entidades originales) es común en las tareas de procesamiento de datos. En este caso, el valor resultante se buscó y se utilizó directamente. En otros casos, es útil para la normalización, como relacionar el valor de cada usuario con los valores promedio en su ciudad.


Ordenar y agrupar permite que las líneas de tiempo expresen claramente las operaciones entre diferentes entidades. El resultado de una búsqueda es desde el punto en el tiempo en el que se realiza la búsqueda. Esto proporciona una combinación "a partir de" temporalmente correcta.


Realizar una combinación en el momento correcto es fundamental para calcular ejemplos de entrenamiento del pasado que sean comparables con los valores de características utilizados al aplicar el modelo. Del mismo modo, garantiza que cualquier panel, visualización o análisis realizado sobre los resultados de la consulta sean realmente correctos como si estuvieran mirando los valores en el pasado, en lugar de usar información que no estaba disponible en ese momento.


Conclusión

Hemos demostrado el poder de las líneas de tiempo como una abstracción de alto nivel para manejar datos temporales. A través de operaciones intuitivas, declarativas y componibles, mostramos cómo las líneas de tiempo permiten la expresión eficiente de consultas temporales sobre eventos y entre eventos. Con ejemplos que van desde agregaciones simples hasta consultas sofisticadas como ventanas dependientes de datos y uniones temporalmente correctas, ilustramos cómo las operaciones de la línea de tiempo se pueden encadenar para producir los resultados previstos. La potencia de las líneas de tiempo radica en su capacidad para expresar fácilmente preguntas temporales simples y extenderse intuitivamente a consultas temporales complejas.


Desde el gasto total hasta el puntaje mínimo de revisión, analizamos cuatro ejemplos ilustrativos que resaltan las capacidades de las escalas de tiempo en las consultas temporales. Exploramos la agregación acumulativa, las ventanas temporales y observamos cómo las ventanas definidas por datos ofrecen la capacidad de expresar preguntas temporales complejas. También mostramos cómo las líneas de tiempo facilitan el manejo de múltiples entidades y las uniones temporales. Estos ejemplos muestran que con los cronogramas, tiene una herramienta poderosa para identificar patrones de causa y efecto y calcular ejemplos de capacitación que son comparablemente válidos al aplicar un modelo.


Próximamente, profundizaremos en la dinámica de las consultas temporales en las escalas de tiempo. Exploraremos cómo estas consultas se ejecutan de manera eficiente aprovechando las propiedades de las líneas de tiempo.\

Te animamos a que Empezar escribiendo sus propias consultas temporales hoy, y únase a la Comunidad Kaskada para más discusiones e información sobre líneas de tiempo y otros temas de procesamiento de datos.


También publicado aquí.