Technische Funktionen für maschinelles Lernen
Dieses Dokument zeigt, wie Sie Daten in Adobe Experience Platform in features oder Variablen umwandeln können, die von einem maschinellen Lernmodell genutzt werden können. Dieser Prozess wird als Funktionsentwicklung bezeichnet. Verwenden Sie Data Distiller, um ML-Funktionen im Maßstab zu berechnen und diese Funktionen für Ihre maschinelle Lernumgebung freizugeben. Dies umfasst Folgendes:
- Erstellen Sie eine Abfragevorlage, um die Zielbeschriftungen und Funktionen zu definieren, die Sie für Ihr Modell berechnen möchten
- Ausführen der Abfrage und Speichern der Ergebnisse in einem Trainings-Datensatz
Trainings-Daten definieren define-training-data
Das folgende Beispiel zeigt eine Abfrage zum Ableiten von Trainings-Daten aus einem Experience Events-Datensatz für ein Modell, um die Neigung eines Benutzers vorherzusagen, einen Newsletter zu abonnieren. Abonnementereignisse werden durch den Ereignistyp "web.formFilledOut
"dargestellt und andere Verhaltensereignisse im Datensatz werden verwendet, um Funktionen auf Profilebene abzuleiten, um Abonnements vorherzusagen.
Positive und negative Bezeichnungen abfragen query-positive-and-negative-labels
Ein vollständiger Datensatz zum Trainieren eines (beaufsichtigten) maschinellen Lernmodells umfasst eine Zielvariable oder einen Titel, die bzw. der das voraussichtliche Ergebnis darstellt, sowie eine Reihe von Funktionen oder erklärenden Variablen, die zur Beschreibung der Beispielprofile verwendet werden, die zum Trainieren des Modells verwendet werden.
In diesem Fall ist die Beschriftung eine Variable mit dem Namen subscriptionOccurred
, die gleich 1 ist, wenn das Benutzerprofil über ein Ereignis mit dem Typ web.formFilledOut
verfügt, andernfalls 0. Die folgende Abfrage gibt eine Gruppe von 50.000 Benutzern aus dem Ereignis-Datensatz zurück, einschließlich aller Benutzer mit positiven Bezeichnungen (subscriptionOccurred = 1
) sowie eines Sets, die zufällig ausgewählt wurden, mit negativen Bezeichnungen, um die Beispielgröße für 50.000 Benutzer abzuschließen. Dadurch wird sichergestellt, dass die Trainings-Daten sowohl positive als auch negative Beispiele enthalten, aus denen das Modell lernen kann.
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()
Beispielausgabe
Anzahl der Klassen: 50000
Aggregieren von Ereignissen zur Definition von Funktionen für ML define-features
Mit einer geeigneten Abfrage können Sie die Ereignisse im Datensatz in aussagekräftige, numerische Merkmale erfassen, die zum Trainieren eines Tendenzmodells verwendet werden können. Unten finden Sie Beispielereignisse:
- Anzahl der E-Mails, die zu Marketingzwecken gesendet und vom Benutzer empfangen wurden.
- Teil dieser E-Mails, die geöffnet waren.
- Teil dieser E-Mails, in dem der Benutzer den Link ausgewählt hat.
- Anzahl der angezeigten Produkte.
- Anzahl der Vorschläge, die mit interagiert wurden.
- Anzahl der verworfenen Vorschläge.
- Anzahl der ausgewählten Links.
- Anzahl der Minuten zwischen zwei aufeinander folgenden E-Mails.
- Anzahl der Minuten zwischen zwei aufeinander folgenden geöffneten E-Mails.
- Anzahl der Minuten zwischen zwei aufeinander folgenden E-Mails, in denen der Benutzer den Link tatsächlich ausgewählt hat.
- Anzahl der Minuten zwischen zwei aufeinander folgenden Produktansichten.
- Anzahl der Minuten zwischen zwei Vorschlägen, mit denen interagiert wurde
- Anzahl der Minuten zwischen zwei verworfenen Vorschlägen.
- Anzahl der Minuten zwischen zwei ausgewählten Links.
Die folgende Abfrage aggregiert diese Ereignisse:
code language-python |
---|
|
Beispielausgabe
Kombinieren von Bezeichnungen und Funktionsabfragen combine-queries
Schließlich können die Bezeichnungsabfrage und die Funktionenabfrage zu einer einzigen Abfrage kombiniert werden, die einen Trainings-Datensatz mit Bezeichnungen und Funktionen zurückgibt:
code language-python |
---|
|
Beispielausgabe
Erstellen einer Abfragevorlage zur inkrementellen Berechnung von Trainings-Daten
Es ist typisch, ein Modell regelmäßig mit aktualisierten Trainings-Daten neu zu trainieren, um die Genauigkeit des Modells im Laufe der Zeit beizubehalten. Als Best Practice für eine effiziente Aktualisierung Ihres Trainings-Datensatzes können Sie eine Vorlage aus Ihrer Trainings-Set-Abfrage erstellen, um neue Trainings-Daten schrittweise zu berechnen. Auf diese Weise können Sie Bezeichnungen und Funktionen nur aus Daten berechnen, die seit der letzten Aktualisierung der Trainings-Daten zum ursprünglichen Experience Events-Datensatz hinzugefügt wurden, und die neuen Bezeichnungen und Funktionen in den vorhandenen Trainings-Datensatz einfügen.
Dazu müssen einige Änderungen an der Trainings-Set-Abfrage vorgenommen werden:
-
Fügen Sie eine Logik hinzu, um einen neuen Trainings-Datensatz zu erstellen, falls dieser nicht vorhanden ist, und fügen Sie andernfalls die neuen Bezeichnungen und Funktionen in den vorhandenen Trainings-Datensatz ein. Dies erfordert eine Reihe von zwei Versionen der Trainings-Set-Abfrage:
- Verwenden Sie zunächst die Anweisung
CREATE TABLE IF NOT EXISTS {table_name} AS
. - Verwenden Sie als Nächstes die
INSERT INTO {table_name}
-Anweisung für den Fall, dass der Trainings-Datensatz bereits vorhanden ist.
- Verwenden Sie zunächst die Anweisung
-
Fügen Sie eine
SNAPSHOT BETWEEN $from_snapshot_id AND $to_snapshot_id
-Anweisung hinzu, um die Abfrage auf Ereignisdaten zu beschränken, die innerhalb eines bestimmten Intervalls hinzugefügt wurden. Das Präfix$
für die Snapshot-IDs zeigt an, dass es sich um Variablen handelt, die bei der Ausführung der Abfragevorlage übergeben werden.
Die Anwendung dieser Änderungen führt zur folgenden Abfrage:
code language-python |
---|
|
Schließlich speichert der folgende Code die Abfragevorlage 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}")
Beispielausgabe
Template for propensity training data created as ID f3d1ec6b-40c2-4d13-93b6-734c1b3c7235
Wenn die Vorlage gespeichert ist, können Sie die Abfrage jederzeit ausführen, indem Sie auf die Vorlagen-ID verweisen und den Bereich der Snapshot-IDs angeben, die in die Abfrage einbezogen werden sollen. Mit der folgenden Abfrage werden die Momentaufnahmen des ursprünglichen Experience Events-Datensatzes abgerufen:
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")
Der folgende Code veranschaulicht die Ausführung der Abfragevorlage und verwendet die ersten und letzten Momentaufnahmen, um den gesamten Datensatz abzufragen:
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")
Beispielausgabe
Query started successfully and got assigned ID c6ea5009-1315-4839-b072-089ae01e74fd - it will take some time to execute
Sie können die folgende Funktion definieren, um den Status der Abfrage regelmäßig zu überprüfen:
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)
Beispielausgabe
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ächste Schritte:
Durch Lesen dieses Dokuments haben Sie gelernt, wie Sie Daten in Adobe Experience Platform in Funktionen oder Variablen umwandeln können, die von einem maschinellen Lernmodell genutzt werden können. Der nächste Schritt beim Erstellen von Funktions-Pipelines aus Experience Platform, um benutzerdefinierte Modelle in Ihrer maschinellen Lernumgebung zu speisen, besteht darin, Feature-Datensätze zu exportieren.