機器學習的工程師功能
本檔案示範如何將Adobe Experience Platform中的資料轉換為 功能 或變數,以供機器學習模型使用。 此程式稱為 功能工程。 使用Data Distiller大規模計算ML功能,並將這些功能與您的機器學習環境共用。 這涉及下列專案:
- 建立查詢範本,以定義您要為您的模型計算的目標標籤和特徵
- 執行查詢並將結果儲存在訓練資料集中
定義您的訓練資料 define-training-data
下列範例說明如何查詢從Experience Events資料集衍生培訓資料,讓模型預測使用者訂閱電子報的傾向。 訂閱事件由事件型別web.formFilledOut
表示,資料集中的其他行為事件可用來衍生設定檔層級功能以預測訂閱。
查詢正面和負面標籤 query-positive-and-negative-labels
訓練(監督)機器學習模型的完整資料集包括目標變數或標籤,代表要預測的結果,以及一組功能或說明變數,用於描述用來訓練模型的範例設定檔。
在此案例中,標籤是名為subscriptionOccurred
的變數,如果使用者設定檔具有型別為web.formFilledOut
的事件,則等於1,否則為0。 下列查詢會從事件資料集中傳回一組50,000位使用者,包含所有具有正數標籤(subscriptionOccurred = 1
)的使用者,加上隨機選取具有負數標籤的使用者,以完成50,000位使用者範例大小。 這可確保訓練資料包含正面和負面範例,以供模型學習。
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()
範例輸出
類別數目: 50000
為機器學習定義功能的彙總事件 define-features
透過適當的查詢,您可以將資料集中的事件收集到有意義的、數值的功能中,以便用於訓練傾向模型。 範例事件顯示如下:
- 使用者為了行銷目的而傳送和接收的 電子郵件數目。
- 這些電子郵件中 已開啟 的部分。
- 使用者 已選取 連結的電子郵件部分。
- 已檢視的產品數目。
- 與 互動的 主張數目。
- 被解除的 主張數目。
- 已選取的 個連結數目。
- 收到兩封連續電子郵件的間隔分鐘數。
- 連續開啟兩封電子郵件的間隔分鐘數。
- 使用者實際選取連結的兩封連續電子郵件之間的分鐘數。
- 兩次連續產品檢視之間的分鐘數。
- 與兩個建議互動的分鐘數。
- 兩個被駁回的建議之間的分鐘數。
- 選取的兩個連結之間的分鐘數。
下列查詢會彙總這些事件:
code language-python |
---|
|
範例輸出
結合標籤和功能查詢 combine-queries
最後,標籤查詢和功能查詢可以合併到單一查詢中,以傳回標籤和功能的訓練資料集:
code language-python |
---|
|
範例輸出
建立查詢範本以逐步計算培訓資料
通常使用更新的訓練資料定期重新訓練模型,以隨著時間保持模型的準確性。 為了有效更新您的訓練資料集,最佳實務是透過訓練集查詢建立範本,以增量方式計算新的訓練資料。 這可讓您僅從上次更新訓練資料以來新增至原始體驗事件資料集的資料計算標籤和功能,並將新標籤和功能插入現有訓練資料集。
若要這麼做,需要對訓練集查詢進行一些修改:
-
新增邏輯以建立不存在的新訓練資料集,否則請將新標籤和功能插入現有訓練資料集中。 這需要訓練集查詢的一系列兩個版本:
- 首先,使用
CREATE TABLE IF NOT EXISTS {table_name} AS
陳述式 - 接著,針對訓練資料集已存在的情況使用
INSERT INTO {table_name}
陳述式
- 首先,使用
-
新增
SNAPSHOT BETWEEN $from_snapshot_id AND $to_snapshot_id
陳述式,將查詢限制在指定間隔內新增的事件資料。 快照ID上的$
首碼表示它們是在執行查詢範本時要傳入的變數。
套用這些變更會導致下列查詢:
code language-python |
---|
|
最後,下列程式碼會將查詢範本儲存在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}")
範例輸出
Template for propensity training data created as ID f3d1ec6b-40c2-4d13-93b6-734c1b3c7235
在儲存範本後,您可以透過參考範本ID來隨時執行查詢,並指定應包含在查詢中的快照ID範圍。 下列查詢會擷取原始Experience Events資料集的快照:
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")
下列程式碼會示範如何使用第一個和最後一個快照來查詢整個資料集,進而執行查詢範本:
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")
範例輸出
Query started successfully and got assigned ID c6ea5009-1315-4839-b072-089ae01e74fd - it will take some time to execute
您可以定義以下函式以定期檢查查詢的狀態:
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)
範例輸出
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
後續步驟:
閱讀本檔案後,您已瞭解如何將Adobe Experience Platform中的資料轉換為機器學習模型可以使用的功能或變數。 在機器學習環境中建立從Experience Platform到摘要自訂模型的功能管道的下一個步驟是匯出功能資料集。