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
-
Add a
SNAPSHOT BETWEEN $from_snapshot_id AND $to_snapshot_idstatement to limit the query to event data that was added within a specified interval. The$prefix on the snapshot IDs indicates that thy are variables that will be passed in when the query template is executed.
Applying those changes results in the following query:
| code language-python |
|---|
|
Finally, the following code saves the query template in 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}")
Sample output
Template for propensity training data created as ID f3d1ec6b-40c2-4d13-93b6-734c1b3c7235
With the template saved, you can execute the query at any time by referencing the template ID and specify the range of snapshot IDs that should be included in the query. The following query retrieves the snapshots of the original Experience Events dataset:
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")
The following code demonstrates execution of the query template, using the first and last snapshots to query the entire dataset:
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")
Sample output
Query started successfully and got assigned ID c6ea5009-1315-4839-b072-089ae01e74fd - it will take some time to execute
You can define the following function to periodically check the status of the query:
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)
Sample output
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
Next steps:
By reading this document you have learned how to transform data in Adobe Experience Platform into features, or variables, that can be consumed by a machine learning model. The next step in creating feature pipelines from Experience Platform to feed custom models in your machine learning environment is to export feature datasets.