Ingenjörsfunktioner för maskininlärning
Det här dokumentet visar hur du kan omvandla data i Adobe Experience Platform till funktioner, eller variabler, som kan användas av en maskininlärningsmodell. Den här processen kallas funktionsteknik. Använd Data Distiller för att beräkna HTML-funktioner i stor skala och dela dem med din maskininlärningsmiljö. Detta inbegriper följande:
- Skapa en frågemall för att definiera de måletiketter och funktioner som du vill beräkna för modellen
- Kör frågan och lagra resultaten i en utbildningsdatauppsättning
Definiera utbildningsdata define-training-data
I följande exempel visas en fråga om att hämta utbildningsdata från en Experience Events-datauppsättning för en modell för att förutsäga en användares benägenhet att prenumerera på ett nyhetsbrev. Prenumerationshändelser representeras av händelsetypen web.formFilledOut
, och andra beteendehändelser i datauppsättningen används för att härleda profilnivåfunktioner för att förutsäga prenumerationer.
Frågepositiva och negativa etiketter query-positive-and-negative-labels
En komplett datauppsättning för utbildning av en (övervakad) maskininlärningsmodell innehåller en målvariabel eller en etikett som representerar det resultat som ska förutses och en uppsättning funktioner eller förklarande variabler som används för att beskriva de exempelprofiler som används för att utbilda modellen.
I det här fallet är etiketten en variabel med namnet subscriptionOccurred
som är lika med 1 om användarprofilen har en händelse med typen web.formFilledOut
, i annat fall 0. Följande fråga returnerar en uppsättning om 50 000 användare från händelsedatamängden, inklusive alla användare med positiva etiketter (subscriptionOccurred = 1
) plus en uppsättning slumpmässigt valda användare med negativa etiketter för att slutföra exempelstorleken för 50 000 användare. Detta garanterar att utbildningsdata innehåller både positiva och negativa exempel för modellen att lära sig av.
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()
Exempelutdata
Antal klasser: 50000
Samla ihop händelser för att definiera funktioner för XML define-features
Med en lämplig fråga kan du samla ihop händelserna i datauppsättningen till meningsfulla numeriska funktioner som kan användas för att utbilda en benägenhetsmodell. Exempelhändelser visas nedan:
- Antal e-postmeddelanden som skickades i marknadsföringssyfte och togs emot av användaren.
- En del av de här e-postmeddelandena som öppnades.
- Delar av de här e-postmeddelandena där användaren markerade länken.
- Antal produkter som visades.
- Antal förslag som interagerats med.
- Antal förslag som avvisats.
- Antal länkar som markerats.
- Antal minuter mellan två på varandra följande e-postmeddelanden som tagits emot.
- Antal minuter mellan två på varandra följande e-postmeddelanden som öppnats.
- Antal minuter mellan två på varandra följande e-postmeddelanden där användaren faktiskt markerade länken.
- Antal minuter mellan två produktvyer i följd.
- Antal minuter mellan två förslag som interagerats med.
- Antal minuter mellan två förslag som avvisats.
- Antal minuter mellan två markerade länkar.
Följande fråga sammanställer dessa händelser:
code language-python |
---|
|
Exempelutdata
Kombinera etiketter och funktionsfrågor combine-queries
Slutligen kan etikettfrågan och funktionsfrågan kombineras till en enda fråga som returnerar en utbildningsdatauppsättning med etiketter och funktioner:
code language-python |
---|
|
Exempelutdata
Skapa en frågemall för att stegvis beräkna utbildningsdata
Det är typiskt att regelbundet utbilda om en modell med uppdaterade utbildningsdata för att bibehålla modellens precision över tid. Ett tips om hur du effektivt uppdaterar dina utbildningsdata är att du kan skapa en mall utifrån din fråga om utbildningar för att beräkna nya utbildningsdata stegvis. På så sätt kan ni bara beräkna etiketter och funktioner från data som lades till i den ursprungliga Experience Events-datauppsättningen sedan utbildningsinformationen senast uppdaterades, och infoga de nya etiketterna och funktionerna i den befintliga utbildningsdatauppsättningen.
Om du gör det måste du göra några ändringar i utbildningsfrågan:
-
Lägg till logik för att skapa en ny utbildningsdatauppsättning om den inte finns, och infoga de nya etiketterna och funktionerna i den befintliga utbildningsdatauppsättningen i annat fall. Detta kräver en serie med två versioner av frågan om utbildningsuppsättningen:
- Först använder du programsatsen
CREATE TABLE IF NOT EXISTS {table_name} AS
- Därefter använder du programsatsen
INSERT INTO {table_name}
för det fall där utbildningsdatauppsättningen redan finns
- Först använder du programsatsen
-
Lägg till en
SNAPSHOT BETWEEN $from_snapshot_id AND $to_snapshot_id
-sats för att begränsa frågan till händelsedata som har lagts till inom ett angivet intervall. Prefixet$
för ögonblicksbilds-ID:n anger att de är variabler som skickas in när frågemallen körs.
Om du tillämpar dessa ändringar får du följande fråga:
code language-python |
---|
|
Slutligen sparar följande kod frågemallen i 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}")
Exempelutdata
Template for propensity training data created as ID f3d1ec6b-40c2-4d13-93b6-734c1b3c7235
När mallen har sparats kan du köra frågan när som helst genom att referera till mall-ID:t och ange intervallet med ögonblicksbild-ID:n som ska inkluderas i frågan. Följande fråga hämtar ögonblicksbilder av den ursprungliga Experience Events-datauppsättningen:
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")
I följande kod visas hur frågemallen körs, med hjälp av den första och den sista ögonblicksbilden för att fråga hela datauppsättningen:
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")
Exempelutdata
Query started successfully and got assigned ID c6ea5009-1315-4839-b072-089ae01e74fd - it will take some time to execute
Du kan definiera följande funktion för att regelbundet kontrollera status för frågan:
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)
Exempelutdata
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
Nästa steg:
Genom att läsa det här dokumentet har du lärt dig att omvandla data i Adobe Experience Platform till funktioner, eller variabler, som kan användas av en maskininlärningsmodell. Nästa steg på vägen mot att skapa funktionsledningar från Experience Platform till anpassade modeller i maskininlärningsmiljön är att exportera funktionsdatauppsättningar.