Suporte pontual usando tabelas de recursos de séries temporais

Os dados usados para ensinar um modelo geralmente possuem dependências de tempo incorporadas a ele. Por exemplo, se você está treinando um modelo para prever quais máquinas em um chão de fábrica precisam de manutenção, você pode ter dataset históricos que contenha medições de sensores e dados de uso para muitas máquinas, junto com rótulos de destino que indicam se a máquina precisou de serviço ou não. O dataset pode conter dados para máquinas antes e depois da execução de um serviço de manutenção.

Ao construir o modelo, você deve considerar apenas os valores de recursos até o momento do valor alvo observado (precisa de serviço ou não precisa de serviço). Se você não levar em account explicitamente o carimbo de data/hora de cada observação, poderá usar inadvertidamente valores de recursos medidos após o carimbo de data/hora do valor de destino para treinamento. Isso é chamado de “vazamento de dados” e pode afetar negativamente o desempenho do modelo.

As tabelas de recursos de séries temporais incluem uma coluna key de registro de data e hora que garante que cada linha no dataset de treinamento represente os valores de recursos conhecidos mais recentes a partir do registro de data e hora da linha. Você deve usar tabelas de recursos de séries temporais sempre que os valores dos recursos mudarem ao longo do tempo, por exemplo, com dados de séries temporais, dados baseados em eventos ou dados agregados por tempo.

Observação

  • Com Databricks Runtime 13.3 LTS e acima, qualquer tabela Delta em Unity Catalog com chave primária e chave de registro de data e hora pode ser usada como uma tabela de recurso de série temporal. Recomendamos aplicar Z-ordering em tabelas de séries temporais para obter melhor desempenho em pesquisas pontuais.

  • A funcionalidade de pesquisa pontual às vezes é chamada de “viagem do tempo”. A funcionalidade pontual na loja de recursos do Databricks não está relacionada a Delta Lake viagem do tempo.

  • Para usar a funcionalidade point-in-time, você deve especificar key relacionada ao tempo usando o argumento timeseries_columns (para recurso engenharia no Unity Catalog) ou o argumento timestamp_keys (para recurso Store workspace ). Isso indica que as linhas da tabela de recursos devem ser unidas combinando o valor mais recente para uma key primária específica que não seja posterior ao valor da coluna timestamps_keys, em vez de unir com base em uma correspondência de horário exata. Se você designar apenas uma coluna de série temporal como coluna key primária, o repositório de recursos não aplicará lógica point-in-time à coluna de série temporal durante join. Em vez disso, ele corresponde apenas às linhas com uma correspondência de hora exata, em vez de corresponder a todas as linhas anteriores ao carimbo de data/hora.

Como funcionam as tabelas de recursos de séries temporais

Suponha que você tenha as seguintes tabelas de recursos. Esses dados são retirados do exemplo Notebook.

As tabelas contêm dados do sensor que medem a temperatura, umidade relativa, luz ambiente e dióxido de carbono em uma sala. A tabela de informações básicas indica se uma pessoa estava presente na sala. Cada uma das tabelas possui uma key primária ('room') e uma key de timestamp ('ts'). Para simplificar, apenas os dados de um único valor da key primária ('0') são mostrados.

exemplo de dados da tabela de recursos

A figura a seguir ilustra como a key de carimbo de data/hora é usada para garantir a correção pontual em um dataset de treinamento. Os valores de recursos são correspondidos com base na key primária (não mostrada no diagrama) e na key registro de data e hora , usando uma join AS OF . A join AS OF garante que o valor mais recente do recurso no momento do carimbo de data/hora seja usado no conjunto de treinamento.

como funciona o ponto no tempo

Conforme mostrado na figura, o dataset de treinamento inclui os valores de recursos mais recentes para cada sensor antes do carimbo de data/hora na verdade de campo observada.

Se você criou um dataset de treinamento sem levar em account a key de carimbo de data/hora , você pode ter uma linha com estes valores de recursos e informações básicas observadas:

temperatura

rh

luz

co2

verdade fundamental

15.8

32

212

630

0

No entanto, esta não é uma observação válida para treinamento, porque a leitura de CO2 de 630 foi feita às 8h52, após a observação da verdade de campo às 8h50. Os dados futuros estão “vazando” para o conjunto de treinamento, o que prejudicará o desempenho do modelo.

Requisitos

  • Para recurso engenharia no Unity Catalog: recurso engenharia no cliente Unity Catalog (qualquer versão)

  • Para workspace recurso Store: recurso Store client v0.3.7 e acima

Crie uma tabela de recursos de série temporal no Unity Catalog

No Unity Catalog, qualquer tabela com uma primária TIMESERIES key é uma tabela de recursos de série temporal. Consulte Criar uma tabela de recursos no Unity Catalog para saber como criar uma.

Crie uma tabela de recursos de série temporal no espaço de trabalho local

Para criar uma tabela de recursos de série temporal no Feature Store workspace local, o DataFrame ou o esquema deve conter uma coluna designada como a key carimbo de data/hora.

Começando com o cliente da loja de recursos v0.13.4, as colunas key de carimbo de data/hora devem ser especificadas no argumento primary_keys. key carimbo de data/hora faz parte da “ key primária” que identifica exclusivamente cada linha na tabela de recursos. Como outras colunas key primária, as colunas key carimbo de data/hora não podem conter valores NULL.

fe = FeatureEngineeringClient()
# user_features_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fe.create_table(
  name="ml.ads_team.user_features",
  primary_keys=["user_id", "ts"],
  timeseries_columns="ts",
  features_df=user_features_df,
)
fs = FeatureStoreClient()
# user_features_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fs.create_table(
  name="ads_team.user_features",
  primary_keys=["user_id", "ts"],
  timestamp_keys="ts",
  features_df=user_features_df,
)
fs = FeatureStoreClient()
# user_features_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fs.create_table(
  name="ads_team.user_features",
  primary_keys="user_id",
  timestamp_keys="ts",
  features_df=user_features_df,
)

Uma tabela de recursos de série temporal deve ter uma key de carimbo de data/hora e não pode ter nenhuma coluna de partição. A coluna key de data/hora deve ser de TimestampType ou DateType.

Databricks recomenda que as tabelas de recursos de série temporal não tenham mais de duas colunas key primária para garantir gravações e pesquisas de alto desempenho.

Atualizar uma tabela de recursos de série temporal

Ao gravar recursos nas tabelas de recursos da série temporal, seu DataFrame deve fornecer valores para todos os recursos da tabela de recursos, ao contrário das tabelas de recursos regulares. Essa restrição reduz a escassez de valores de recursos em carimbos de data/hora na tabela de recursos de série temporal.

fe = FeatureEngineeringClient()
# daily_users_batch_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fe.write_table(
  "ml.ads_team.user_features",
  daily_users_batch_df,
  mode="merge"
)
fs = FeatureStoreClient()
# daily_users_batch_df DataFrame contains the following columns:
# - user_id
# - ts
# - purchases_30d
# - is_free_trial_active
fs.write_table(
  "ads_team.user_features",
  daily_users_batch_df,
  mode="merge"
)

gravações de transmissão em tabelas de recursos de séries temporais são suportadas.

Crie um conjunto de treinamento com uma tabela de recursos de série temporal

Para executar uma pesquisa de ponto no tempo para valores de recursos de uma tabela de recursos de série temporal, você deve especificar um timestamp_lookup_key no FeatureLookup do recurso, que indica o nome da coluna DataFrame que contém carimbos de data/hora nos quais pesquisar séries temporais características. Databricks Feature Store recupera os valores de recurso mais recentes antes dos carimbos de data/hora especificados na coluna timestamp_lookup_key do DataFrame e cuja key primária (excluindo key carimbo de data/hora) corresponde aos valores nas colunas lookup_key do DataFrame ou null se nenhum valor de recurso existir .

feature_lookups = [
  FeatureLookup(
    table_name="ml.ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts"
  ),
  FeatureLookup(
    table_name="ml.ads_team.ad_features",
    feature_names=["sports_relevance", "food_relevance"],
    lookup_key="ad_id",
  )
]

# raw_clickstream DataFrame contains the following columns:
# - u_id
# - ad_id
# - ad_impression_ts
training_set = fe.create_training_set(
  df=raw_clickstream,
  feature_lookups=feature_lookups,
  exclude_columns=["u_id", "ad_id", "ad_impression_ts"],
  label="did_click",
)
training_df = training_set.load_df()
feature_lookups = [
  FeatureLookup(
    table_name="ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts"
  ),
  FeatureLookup(
    table_name="ads_team.ad_features",
    feature_names=["sports_relevance", "food_relevance"],
    lookup_key="ad_id",
  )
]

# raw_clickstream DataFrame contains the following columns:
# - u_id
# - ad_id
# - ad_impression_ts
training_set = fs.create_training_set(
  df=raw_clickstream,
  feature_lookups=feature_lookups,
  exclude_columns=["u_id", "ad_id", "ad_impression_ts"],
  label="did_click",
)
training_df = training_set.load_df()

Qualquer FeatureLookup em uma tabela de recursos de série temporal deve ser uma pesquisa pontual, portanto, deve especificar uma coluna timestamp_lookup_key para usar em seu DataFrame. A pesquisa pontual não ignora linhas com valores de recursos null armazenados na tabela de recursos de série temporal.

Definir um limite de tempo para valores históricos de recursos

Com o cliente recurso Store v0.13.0 ou acima, ou qualquer versão do recurso engenharia no cliente Unity Catalog, você pode excluir valores de recurso com carimbos de data/hora mais antigos do conjunto de treinamento. Para fazer isso, use o parâmetro lookback_window no FeatureLookup.

O tipo de dados de lookback_window deve ser datetime.timedelta e o valor default é None (todos os valores de recurso são usados, independentemente da idade).

Por exemplo, o código a seguir exclui todos os valores de recursos com mais de 7 dias:

from datetime import timedelta

feature_lookups = [
  FeatureLookup(
    table_name="ml.ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts",
    lookback_window=timedelta(days=7)
  )
]
from datetime import timedelta

feature_lookups = [
  FeatureLookup(
    table_name="ads_team.user_features",
    feature_names=["purchases_30d", "is_free_trial_active"],
    lookup_key="u_id",
    timestamp_lookup_key="ad_impression_ts",
    lookback_window=timedelta(days=7)
  )
]

Quando você chama create_training_set com o FeatureLookup acima, ele executa automaticamente a join pontual e exclui valores de recursos com mais de 7 dias.

A janela de lookback é aplicada durante o treinamento e inferência de lotes. Durante a inferência online, o valor do recurso mais recente é sempre usado, independentemente da janela de lookback.

Modelos de pontuação com tabelas de recursos de séries temporais

Quando você pontua um modelo treinado com recurso de tabelas de recursos de séries temporais, o Databricks recurso Store recupera o recurso apropriado usando pesquisas pontuais com pacote de metadados com o modelo durante o treinamento. O DataFrame que você fornece para FeatureEngineeringClient.score_batch (para recurso de engenharia no Unity Catalog) ou FeatureStoreClient.score_batch (para workspace recurso Store) deve conter uma coluna de carimbo de data/hora com o mesmo nome e DataType que o timestamp_lookup_key do FeatureLookup fornecido para FeatureEngineeringClient.create_training_set ou FeatureStoreClient.create_training_set.

Publicar feições de séries temporais em um armazenamento online

Você pode usar FeatureEngineeringClient.publish_table (para engenharia de recursos no Unity Catalog) ou FeatureStoreClient.publish_table (para armazenamento de recursos workspace ) para publicar tabelas de recursos de série temporal em lojas online. Databricks recurso Store fornece a funcionalidade de publicar um Snapshot ou uma janela de dados de série temporal para o armazenamento online, dependendo do OnlineStoreSpec que criou o armazenamento online. A tabela mostra detalhes de cada modo de publicação.

provedor de armazenamento on-line

Modo de publicação Snapshot

Modo de publicação da janela

Amazon DynamoDB (v0.3.8e acima)

x

x

Amazon Aurora (compatível com MySQL)

x

Amazon RDS MySQL

x

Publicar um Snapshotde série temporal

Isso publica os valores de recursos mais recentes para cada key primária na tabela de recursos. O armazenamento online suporta pesquisa key primária, mas não suporta pesquisa pontual.

Para lojas online que não oferecem suporte ao time to live, Databricks recurso Store oferece suporte apenas ao modo de publicação Snapshot . Para lojas on-line que oferecem suporte ao tempo de vida, o modo de publicação default é Snapshot , a menos que o tempo de vida (ttl) seja especificado em OnlineStoreSpec no momento da criação.

Publicar uma janela de série temporal

Isso publica todos os valores de recursos para cada key primária na tabela de recursos para o armazenamento online e remove automaticamente os registros expirados. Um registro é considerado expirado se o carimbo de data/hora do registro (em UTC) for maior que o tempo de vida especificado no passado. Consulte a documentação específica cloudpara obter detalhes sobre o tempo de vida.

O armazenamento online oferece suporte à pesquisa key primária e recupera automaticamente o valor do recurso com o registro de data e hora mais recente.

Para usar este modo de publicação, você deve fornecer um valor de tempo de vida (ttl) no OnlineStoreSpec ao criar o armazenamento online. O ttl não pode ser alterado depois de definido. Todas as chamadas de publicação subsequentes herdam o ttl e não precisam defini-lo explicitamente no OnlineStoreSpec.

Exemplo Notebook : tabela de recursos de série temporal

O Notebook a seguir ilustra pesquisas pontuais em tabelas de recursos de séries temporais no workspace Feature Store.

Exemplo de tabela de recursos de séries temporais Notebook

Abra o bloco de anotações em outra guia