Funciones de ingeniero para el aprendizaje automático
Este documento muestra cómo transformar datos en Adobe Experience Platform en características o variables que un modelo de aprendizaje automático puede consumir. Este proceso se conoce como ingeniería de características. Utilice Data Distiller para calcular las funciones de ML a escala y compartirlas en su entorno de aprendizaje automático. Esto implica lo siguiente:
- Cree una plantilla de consulta para definir las etiquetas y funciones de destino que desea calcular para el modelo
- Ejecute la consulta y almacene los resultados en un conjunto de datos de aprendizaje
Definición de los datos de formación define-training-data
El siguiente ejemplo ilustra una consulta para derivar datos de formación de un conjunto de datos de eventos de experiencia para un modelo a fin de predecir la tendencia de un usuario a suscribirse a un boletín informativo. Los eventos de suscripción están representados por el tipo de evento web.formFilledOut
, y otros eventos de comportamiento del conjunto de datos se utilizan para derivar características de nivel de perfil para predecir suscripciones.
Etiquetas positivas y negativas de consulta query-positive-and-negative-labels
Un conjunto de datos completo para la formación de un modelo de aprendizaje automático (supervisado) incluye una variable o etiqueta de destino que representa el resultado que se va a predecir, y un conjunto de funciones o variables explicativas utilizadas para describir los perfiles de ejemplo utilizados para entrenar el modelo.
En este caso, la etiqueta es una variable denominada subscriptionOccurred
que es igual a 1 si el perfil de usuario tiene un evento de tipo web.formFilledOut
y 0 en caso contrario. La siguiente consulta devuelve un conjunto de 50 000 usuarios del conjunto de datos de eventos, incluidos todos los usuarios con etiquetas positivas (subscriptionOccurred = 1
) más un conjunto de usuarios seleccionados aleatoriamente con etiquetas negativas para completar el tamaño de muestra de 50 000 usuarios. Esto garantiza que los datos de formación incluyan ejemplos positivos y negativos de los que el modelo puede aprender.
from aepp import queryservice
dd_conn = queryservice.QueryService().connection()
dd_cursor = queryservice.InteractiveQuery2(dd_conn)
query_labels = f"""
SELECT *
FROM (
SELECT
eventType,
_{tenant_id}.user_id as userId,
SUM(CASE WHEN eventType='web.formFilledOut' THEN 1 ELSE 0 END)
OVER (PARTITION BY _{tenant_id}.user_id)
AS "subscriptionOccurred",
row_number() OVER (PARTITION BY _{tenant_id}.user_id ORDER BY randn()) AS random_row_number_for_user
FROM {table_name}
)
WHERE (subscriptionOccurred = 1 AND eventType = 'web.formFilledOut') OR (subscriptionOccurred = 0 AND random_row_number_for_user = 1)
"""
df_labels = dd_cursor.query(query_labels, output="dataframe")
print(f"Number of classes: {len(df_labels)}")
df_labels.head()
Salida de ejemplo
Número de clases: 50000
Agregar eventos para definir las características de ML define-features
Con una consulta adecuada, puede reunir los eventos del conjunto de datos en funciones numéricas significativas que se pueden utilizar para entrenar un modelo de tendencia. A continuación se muestran ejemplos de eventos:
- Número de correos electrónicos enviados con fines de marketing y recibidos por el usuario.
- Parte de estos correos electrónicos que se abrieron.
- Parte de estos correos electrónicos donde el usuario seleccionó el vínculo.
- Número de productos que se vieron.
- Número de propuestas que interactuaron con.
- Número de propuestas que se descartaron.
- Número de vínculos seleccionados.
- Número de minutos entre dos correos electrónicos consecutivos recibidos.
- Número de minutos entre dos correos electrónicos consecutivos abiertos.
- Número de minutos entre dos correos electrónicos consecutivos en los que el usuario seleccionó el vínculo.
- Número de minutos entre dos vistas de producto consecutivas.
- Número de minutos entre dos propuestas con las que se interactuó.
- Número de minutos entre dos propuestas que se descartaron.
- Número de minutos entre dos vínculos seleccionados.
La siguiente consulta agrega estos eventos:
code language-python |
---|
|
Salida de ejemplo
Combinación de etiquetas y consultas de funciones combine-queries
Por último, la consulta de etiquetas y la consulta de características se pueden combinar en una sola consulta que devuelve un conjunto de datos de formación de etiquetas y características:
code language-python |
---|
|
Salida de ejemplo
Creación de una plantilla de consulta para calcular de forma incremental los datos de formación
Es habitual volver a entrenar periódicamente un modelo con datos de formación actualizados para mantener su precisión a lo largo del tiempo. Como práctica recomendada para actualizar de forma eficaz el conjunto de datos de formación, puede crear una plantilla a partir de la consulta del conjunto de formación para calcular los nuevos datos de formación de forma incremental. Esto le permite calcular etiquetas y características únicamente a partir de datos que se añadieron al conjunto de datos de eventos de experiencia original desde la última actualización de los datos de aprendizaje e insertar las nuevas etiquetas y características en el conjunto de datos de aprendizaje existente.
Para ello, es necesario realizar algunas modificaciones en la consulta del conjunto de formación:
-
Añada la lógica para crear un nuevo conjunto de datos de aprendizaje si no existe e inserte las nuevas etiquetas y funciones en el conjunto de datos de aprendizaje existente en caso contrario. Esto requiere una serie de dos versiones de la consulta del conjunto de formación:
- Primero, se usa la instrucción
CREATE TABLE IF NOT EXISTS {table_name} AS
- A continuación, utilice la instrucción
INSERT INTO {table_name}
para el caso en el que ya existe el conjunto de datos de aprendizaje
- Primero, se usa la instrucción
-
Agregue una instrucción
SNAPSHOT BETWEEN $from_snapshot_id AND $to_snapshot_id
para limitar la consulta a los datos de evento que se agregaron dentro de un intervalo especificado. El prefijo$
de los identificadores de instantánea indica que son variables que se pasarán cuando se ejecute la plantilla de consulta.
La aplicación de estos cambios resulta en la siguiente consulta:
code language-python |
---|
|
Por último, el siguiente código guarda la plantilla de consulta en Data Distiller:
template_res = dd.createQueryTemplate({
"sql": query_training_set_template,
"queryParameters": {},
"name": "Template for propensity training data"
})
template_id = template_res["id"]
print(f"Template for propensity training data created as ID {template_id}")
Salida de ejemplo
Template for propensity training data created as ID f3d1ec6b-40c2-4d13-93b6-734c1b3c7235
Con la plantilla guardada, puede ejecutar la consulta en cualquier momento haciendo referencia al ID de plantilla y especificando el rango de ID de instantánea que debe incluirse en la consulta. La siguiente consulta recupera las instantáneas del conjunto de datos de eventos de experiencia original:
query_snapshots = f"""
SELECT snapshot_id
FROM (
SELECT history_meta('{table_name}')
)
WHERE is_current = true OR snapshot_generation = 0
ORDER BY snapshot_generation ASC
"""
df_snapshots = dd_cursor.query(query_snapshots, output="dataframe")
El siguiente código muestra la ejecución de la plantilla de consulta, utilizando la primera y la última instantánea para consultar todo el conjunto de datos:
snapshot_start_id = str(df_snapshots["snapshot_id"].iloc[0])
snapshot_end_id = str(df_snapshots["snapshot_id"].iloc[1])
query_final_res = qs.postQueries(
name=f"[CMLE][Week2] Query to generate training data created by {username}",
templateId=template_id,
queryParameters={
"from_snapshot_id": snapshot_start_id,
"to_snapshot_id": snapshot_end_id,
},
dbname=f"{cat_conn.sandbox}:all"
)
query_final_id = query_final_res["id"]
print(f"Query started successfully and got assigned ID {query_final_id} - it will take some time to execute")
Salida de ejemplo
Query started successfully and got assigned ID c6ea5009-1315-4839-b072-089ae01e74fd - it will take some time to execute
Puede definir la siguiente función para comprobar periódicamente el estado de la consulta:
def wait_for_query_completion(query_id):
while True:
query_info = qs.getQuery(query_id)
query_state = query_info["state"]
if query_state in ["SUCCESS", "FAILED"]:
break
print("Query is still in progress, sleeping…")
time.sleep(60)
duration_secs = query_info["elapsedTime"] / 1000
if query_state == "SUCCESS":
print(f"Query completed successfully in {duration_secs} seconds")
else:
print(f"Query failed with the following errors:", file=sys.stderr)
for error in query_info["errors"]:
print(f"Error code {error['code']}: {error['message']}", file=sys.stderr)
wait_for_query_completion(query_final_id)
Salida de ejemplo
Query is still in progress, sleeping…
Query is still in progress, sleeping…
Query is still in progress, sleeping…
Query is still in progress, sleeping…
Query is still in progress, sleeping…
Query is still in progress, sleeping…
Query is still in progress, sleeping…
Query is still in progress, sleeping…
Query completed successfully in 473.8 seconds
Pasos siguientes:
Al leer este documento, ha aprendido a transformar datos en Adobe Experience Platform en funciones o variables que un modelo de aprendizaje automático puede consumir. El siguiente paso para crear canalizaciones de características de Experience Platform para alimentar modelos personalizados en su entorno de aprendizaje automático es exportar conjuntos de datos de características.