Fonctionnalités d’ingénierie pour l’apprentissage automatique
Ce document explique comment transformer des données dans Adobe Experience Platform en fonctions, ou variables, qui peuvent être utilisées par un modèle d’apprentissage automatique. Ce processus est appelé ingénierie de fonctionnalités. Utilisez Data Distiller pour calculer des fonctionnalités ML à grande échelle et partager ces fonctionnalités dans votre environnement d’apprentissage automatique. Cela implique les éléments suivants :
- Créez un modèle de requête pour définir les libellés et fonctionnalités cibles que vous souhaitez calculer pour votre modèle.
- Exécution de la requête et stockage des résultats dans un jeu de données de formation
Définition des données de formation define-training-data
L’exemple suivant illustre une requête permettant d’extraire des données de formation d’un jeu de données d’événements d’expérience pour un modèle afin de prédire la propension d’un utilisateur à s’abonner à une newsletter. Les événements d’abonnement sont représentés par le type d’événement web.formFilledOut
et d’autres événements comportementaux du jeu de données sont utilisés pour dériver des fonctionnalités au niveau du profil pour prédire les abonnements.
Requête sur les libellés positifs et négatifs query-positive-and-negative-labels
Un jeu de données complet pour la formation d’un modèle d’apprentissage automatique (supervisé) comprend une variable ou une étiquette cible qui représente le résultat à prévoir, ainsi qu’un ensemble de caractéristiques ou de variables explicatives utilisées pour décrire les exemples de profils utilisés pour entraîner le modèle.
Dans ce cas, le libellé est une variable appelée subscriptionOccurred
qui est égale à 1 si le profil utilisateur a un événement de type web.formFilledOut
et 0 dans le cas contraire. La requête suivante renvoie un ensemble de 50 000 utilisateurs du jeu de données d’événements, y compris tous les utilisateurs avec des libellés positifs (subscriptionOccurred = 1
) plus un utilisateur sélectionné de manière aléatoire avec des libellés négatifs pour remplir la taille d’échantillon de 50 000 utilisateurs. Cela permet de s’assurer que les données d’apprentissage incluent des exemples positifs et négatifs à partir desquels le modèle peut apprendre.
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()
Exemple de sortie
Nombre de classes : 5000
agréger des événements pour définir des fonctionnalités pour ML ; define-features
Avec une requête appropriée, vous pouvez rassembler les événements du jeu de données en fonctionnalités numériques significatives qui peuvent être utilisées pour former un modèle de propension. Vous trouverez ci-dessous des exemples d’événements :
- Nombre d’emails envoyés à des fins marketing et reçus par l’utilisateur.
- Partie de ces courriers électroniques ouverts.
- Partie de ces emails dans laquelle l’utilisateur a sélectionné le lien.
- Nombre de produits qui ont été consultés.
- Nombre de propositions ayant été interactives avec.
- Nombre de propositions rejetées.
- Nombre de liens sélectionnés.
- Nombre de minutes entre deux courriers électroniques consécutifs reçus.
- Nombre de minutes entre deux emails consécutifs ouverts.
- Nombre de minutes entre deux courriers électroniques consécutifs dans lesquels l’utilisateur a effectivement sélectionné le lien.
- Nombre de minutes entre deux consultations consécutives de produit.
- Nombre de minutes entre deux propositions avec lesquelles l’interaction a eu lieu.
- Nombre de minutes entre deux propositions rejetées.
- Nombre de minutes entre deux liens sélectionnés.
La requête suivante agrège ces événements :
code language-python |
---|
|
Exemple de sortie
Combinaison de requêtes de libellés et de fonctionnalités combine-queries
Enfin, la requête de libellés et la requête de fonctionnalités peuvent être combinées en une seule requête qui renvoie un jeu de données d’apprentissage de libellés et de fonctionnalités :
code language-python |
---|
|
Exemple de sortie
Créer un modèle de requête pour calculer incrémentalement les données de formation
Il est généralement conseillé de former régulièrement un modèle à l’aide de données d’apprentissage mises à jour afin de maintenir la précision du modèle au fil du temps. Pour mettre à jour efficacement votre jeu de données de formation, vous pouvez créer un modèle à partir de votre requête de jeu de formation afin de calculer les nouvelles données de formation de manière incrémentielle. Cela vous permet de calculer des libellés et des fonctionnalités uniquement à partir des données qui ont été ajoutées au jeu de données Experience Events d’origine depuis la dernière mise à jour des données d’apprentissage, et d’insérer les nouvelles étiquettes et fonctionnalités dans le jeu de données d’apprentissage existant.
Pour ce faire, quelques modifications doivent être apportées à la requête du jeu de formation :
-
Ajoutez une logique pour créer un nouveau jeu de données d’apprentissage s’il n’existe pas, puis insérez les nouveaux libellés et fonctionnalités dans le jeu de données d’apprentissage existant dans le cas contraire. Cela nécessite une série de deux versions de la requête du jeu de formation :
- Tout d’abord, en utilisant l’instruction
CREATE TABLE IF NOT EXISTS {table_name} AS
- Ensuite, en utilisant l’instruction
INSERT INTO {table_name}
pour le cas où le jeu de données d’apprentissage existe déjà
- Tout d’abord, en utilisant l’instruction
-
Ajoutez une instruction
SNAPSHOT BETWEEN $from_snapshot_id AND $to_snapshot_id
pour limiter la requête aux données d’événement ajoutées dans un intervalle spécifié. Le préfixe$
sur les ID d’instantané indique qu’il s’agit de variables qui seront transmises lors de l’exécution du modèle de requête.
L’application de ces modifications entraîne la requête suivante :
code language-python |
---|
|
Enfin, le code suivant enregistre le modèle de requête dans 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}")
Exemple de sortie
Template for propensity training data created as ID f3d1ec6b-40c2-4d13-93b6-734c1b3c7235
Une fois le modèle enregistré, vous pouvez exécuter la requête à tout moment en référençant l’identifiant du modèle et en spécifiant la plage d’identifiants instantanés à inclure dans la requête. La requête suivante récupère les instantanés du jeu de données Experience Events d’origine :
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")
Le code suivant montre l’exécution du modèle de requête, en utilisant les premier et dernier instantanés pour interroger l’ensemble du jeu de données :
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")
Exemple de sortie
Query started successfully and got assigned ID c6ea5009-1315-4839-b072-089ae01e74fd - it will take some time to execute
Vous pouvez définir la fonction suivante pour vérifier périodiquement le statut de la requête :
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)
Exemple de sortie
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
Étapes suivantes :
En lisant ce document, vous avez appris à transformer des données dans Adobe Experience Platform en fonctionnalités, ou variables, qui peuvent être utilisées par un modèle d’apprentissage automatique. L’étape suivante de la création de pipelines de fonctionnalités à partir d’Experience Platform pour alimenter des modèles personnalisés dans votre environnement d’apprentissage automatique est d’ exporter des jeux de données de fonctionnalités.