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.

  • Para obter melhor desempenho em pesquisas pontuais, o site Databricks recomenda que o senhor aplique o Liquid clustering (para databricks-feature-engineering 0.6.0 e acima) ou Z-ordering (para databricks-feature-engineering 0.6.0 e abaixo) em tabelas de séries temporais.

  • 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.

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 em Unity Catalog: recurso engenharia em Unity Catalog cliente (qualquer versão).

  • Para workspace repositório de recursos: repositório de recursos 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()

Dica

Para obter um desempenho de pesquisa mais rápido quando o Photon estiver ativado, passe use_spark_native_join=True para FeatureEngineeringClient.create_training_set. Isso requer a versão databricks-feature-engineering 0.6.0 ou superior.

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.

Dica

Para obter um desempenho de pesquisa mais rápido quando o Photon estiver ativado, passe use_spark_native_join=True para FeatureEngineeringClient.score_batch. Isso requer a versão databricks-feature-engineering 0.6.0 ou superior.

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

O senhor pode usar FeatureEngineeringClient.publish_table (para recurso engenharia in Unity Catalog) ou FeatureStoreClient.publish_table (para workspace repositório de recursos) para publicar tabelas de recurso de série temporal em lojas on-line. Databricks O repositório de recursos oferece a funcionalidade de publicar um Snapshot ou uma janela de dados de séries temporais no armazenamento on-line, dependendo do provedor de armazenamento on-line. A tabela a seguir mostra os modos suportados por cada provedor.

provedor de armazenamento on-line

Snapshot modo

Modo de 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

No modo Snapshot, publish_table publica os valores de recurso mais recentes para cada key primário na tabela de recursos. O armazenamento on-line suporta a pesquisa primária key, mas não suporta a pesquisa point-in-time.

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

No modo janela, publish_table publica todos os valores de recurso para cada key primário na tabela de recurso para o armazenamento on-line e remove automaticamente os registros expirados. Um registro é considerado expirado se o carimbo de data/hora do registro (em UTC) for maior do que o tempo especificado para viver a duração no passado. Consulte a documentação específica do site 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.

No modo janela, o senhor deve fornecer um valor para o tempo de vida (ttl) no campo OnlineStoreSpec ao criar o armazenamento on-line. 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

Estes exemplos do Notebook ilustram pesquisas pontuais em tabelas de recurso de séries temporais.

Use este Notebook em um espaço de trabalho habilitado para Unity Catalog.

Exemplo de tabela de recurso de série temporal Notebook (Unity Catalog)

Abra o bloco de anotações em outra guia

O Notebook a seguir foi projetado para espaços de trabalho que não estão habilitados para Unity Catalog. Ele usa o espaço de trabalho repositório de recursos.

Exemplo de tabela de recurso de série temporal Notebook (espaço de trabalho não habilitado para Unity Catalog)

Abra o bloco de anotações em outra guia