Recursos do engenheiro para aprendizado de máquina
Este documento demonstra como você pode transformar dados no Adobe Experience Platform em recursos, ou variáveis, que podem ser consumidos por um modelo de aprendizado de máquina. Esse processo é conhecido como engenharia de recursos. Use o Data Distiller para calcular recursos de aprendizado de máquina em escala e compartilhar esses recursos no seu ambiente de aprendizado de máquina. Isso envolve o seguinte:
- Crie um modelo de consulta para definir os rótulos de destino e os recursos que deseja calcular para o seu modelo
- Executar a consulta e armazenar os resultados em um conjunto de dados de treinamento
Definir os dados de treinamento define-training-data
O exemplo a seguir ilustra uma consulta para derivar dados de treinamento de um conjunto de dados de Eventos de experiência para um modelo prever a propensão de um usuário para assinar um boletim informativo. Os eventos de assinatura são representados pelo tipo de evento web.formFilledOut
, e outros eventos comportamentais no conjunto de dados são usados para derivar recursos de nível de perfil para prever assinaturas.
Consultar rótulos positivos e negativos query-positive-and-negative-labels
Um conjunto de dados completo para treinar um modelo de aprendizado de máquina (supervisionado) inclui uma variável de público-alvo ou rótulo que representa o resultado a ser previsto, e um conjunto de recursos ou variáveis explicativas usadas para descrever os perfis de exemplo usados para treinar o modelo.
Nesse caso, o rótulo é uma variável chamada subscriptionOccurred
que é igual a 1 se o perfil do usuário tiver um evento com tipo web.formFilledOut
, caso contrário é 0. A consulta a seguir retorna um conjunto de 50.000 usuários do conjunto de dados de eventos, incluindo todos os usuários com rótulos positivos (subscriptionOccurred = 1
), além de um conjunto de usuários selecionados aleatoriamente com rótulos negativos para concluir o tamanho da amostra de 50.000 usuários. Isso garante que os dados de treinamento incluam exemplos positivos e negativos para o modelo 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()
Exemplo de saída
Número de classes: 50000
Agregar eventos para definir recursos para ML define-features
Com uma consulta apropriada, você pode coletar os eventos no conjunto de dados em recursos numéricos significativos que podem ser usados para treinar um modelo de propensão. Exemplos de eventos são vistos abaixo:
- Número de emails enviados para fins de marketing e recebidos pelo usuário.
- Parte destes emails foi aberta.
- Parte desses emails em que o usuário selecionou o link.
- Número de produtos que foram exibidos.
- Número de propostas que tiveram interação.
- Número de propostas rejeitadas.
- Número de links selecionados.
- Número de minutos entre dois emails consecutivos recebidos.
- Número de minutos entre dois emails consecutivos abertos.
- Número de minutos entre dois emails consecutivos em que o usuário realmente selecionou o link.
- Número de minutos entre duas visualizações de produto consecutivas.
- Número de minutos entre duas apresentações com as quais houve interação.
- Número de minutos entre duas propostas que foram rejeitadas.
- Número de minutos entre dois links selecionados.
A consulta a seguir agrega esses eventos:
code language-python |
---|
|
Exemplo de saída
Combinar consultas de rótulos e recursos combine-queries
Finalmente, a consulta de rótulos e a consulta de recursos podem ser combinadas em uma única consulta que retorna um conjunto de dados de treinamento de rótulos e recursos:
code language-python |
---|
|
Exemplo de saída
Criar um modelo de consulta para calcular incrementalmente os dados de treinamento
É comum treinar novamente um modelo periodicamente, com dados de treinamento atualizados, para manter a precisão do modelo ao longo do tempo. Como prática recomendada para atualizar com eficiência seu conjunto de dados de treinamento, você pode criar um modelo a partir de sua consulta do conjunto de treinamento para calcular novos dados de treinamento de forma incremental. Isso permite calcular rótulos e recursos somente a partir de dados que foram adicionados ao conjunto de dados original do Experience Events desde que os dados de treinamento foram atualizados pela última vez e inserir os novos rótulos e recursos no conjunto de dados de treinamento existente.
Isso requer algumas modificações no query do conjunto de treinamento:
-
Adicione lógica para criar um novo conjunto de dados de treinamento se ele não existir e insira os novos rótulos e recursos no conjunto de dados de treinamento existente caso contrário. Isso requer uma série de duas versões do query de conjunto de treinamento:
- Primeiro, usando a instrução
CREATE TABLE IF NOT EXISTS {table_name} AS
- Em seguida, usando a instrução
INSERT INTO {table_name}
para o caso em que o conjunto de dados de treinamento já existe
- Primeiro, usando a instrução
-
Adicione uma instrução
SNAPSHOT BETWEEN $from_snapshot_id AND $to_snapshot_id
para limitar a consulta a dados de evento que foram adicionados dentro de um intervalo especificado. O prefixo$
nas IDs de instantâneo indica que elas são variáveis que serão passadas quando o modelo de consulta for executado.
A aplicação dessas alterações resulta na seguinte consulta:
code language-python |
---|
|
Finalmente, o código a seguir salva o template de query no 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}")
Exemplo de saída
Template for propensity training data created as ID f3d1ec6b-40c2-4d13-93b6-734c1b3c7235
Com o modelo salvo, é possível executar a consulta a qualquer momento, fazendo referência à ID do modelo e especificando a faixa de IDs de instantâneo que devem ser incluídas na consulta. A consulta a seguir recupera os instantâneos do conjunto de dados original de Eventos de experiência:
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")
O código a seguir demonstra a execução do modelo de consulta, usando o primeiro e o último instantâneos para consultar todo o conjunto de dados:
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")
Exemplo de saída
Query started successfully and got assigned ID c6ea5009-1315-4839-b072-089ae01e74fd - it will take some time to execute
Você pode definir a seguinte função para verificar periodicamente o status da 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)
Exemplo de saída
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
Próximas etapas:
Ao ler este documento, você aprendeu a transformar dados no Adobe Experience Platform em recursos, ou variáveis, que podem ser consumidos por um modelo de aprendizado de máquina. A próxima etapa na criação de pipelines de recursos do Experience Platform para alimentar modelos personalizados em seu ambiente de aprendizado de máquina é exportar conjuntos de dados de recursos.