Suporte pontual usando tabelas de recursos de séries temporais

Este artigo descreve como usar a correção point-in-time para criar um treinamento dataset que reflita com precisão os valores do recurso no momento em que uma observação de rótulo foi registrada. Isso é importante para evitar o vazamento de dados, que ocorre quando o senhor usa valores de recurso para treinamento de modelos que não estavam disponíveis no momento em que o rótulo foi registrado. Esse tipo de erro pode ser difícil de detectar 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.

O diagrama a seguir mostra como o carimbo de data/hora key é usado. O valor do recurso registrado para cada registro de data e hora é o valor mais recente antes desse registro de data e hora, indicado pelo círculo laranja contornado. Se nenhum valor tiver sido registrado, o valor do recurso será nulo. Para obter mais detalhes, consulte Como funcionam as tabelas de recurso de séries temporais.

valores de recurso que chegam em momentos diferentes.

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.

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