Suporte pontual usando tabelas de recursos de série temporal

Os dados usados para treinar um modelo geralmente apresentam dependências de tempo internas. Por exemplo, caso você esteja treinando um modelo para prever quais computadores de um piso de fábrica precisam de manutenção, talvez você veja conjuntos de dados históricos que contêm medidas de sensor e dados de uso para muitos computadores juntamente com rótulos de destino que indicam se o computador precisava ou não de serviço. O conjunto de dados pode conter dados para computadores antes e depois da execução do serviço de manutenção.

Ao compilar o modelo, você deve levar em consideração apenas valores de recurso até o momento do valor de destino observado (precisa de manutenção ou não precisa de manutenção). Se você não levar explicitamente em conta o carimbo de data/hora de cada observação, poderá usar inadvertidamente valores de recurso 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érie temporal contam com uma coluna de chave de carimbo de data/hora que garante que cada linha no conjunto de dados de treinamento represente os valores de recurso conhecidos e mais recentes a partir do carimbo de data/hora da linha. Você deve usar tabelas de recursos de série temporal sempre que os valores de recurso mudarem ao longo do tempo, por exemplo, com dados de série temporal, dados baseados em eventos ou dados agregados por tempo.

Observação

  • Com o Databricks Runtime 13.3 LTS e versões superiores, qualquer tabela Delta no Catálogo do Unity com chaves primárias e chaves de carimbo de data/hora pode ser usada como uma tabela de recursos de série temporal.
  • Para um melhor desempenho em pesquisas pontuais, o Databricks recomenda que você aplique o Clustering Líquido (nas versões databricks-feature-engineering0.6.0 e superior) ou a Ordenação Z (nas versões databricks-feature-engineering0.6.0 e inferior) às tabelas de série temporal.
  • Às vezes, a funcionalidade de pesquisa pontual é conhecida como “viagem no tempo”. A funcionalidade de pesquisa pontual do Repositório de Recursos do Databricks não está relacionada à viagem no tempo do Delta Lake.

Como funcionam as tabelas de recursos de série temporal

Suponha que você tenha as tabelas de recursos a seguir. Esses dados são obtidos do notebook de exemplo.

As tabelas contêm dados do sensor que medem a temperatura, a umidade relativa, a luz ambiente e o dióxido de carbono em uma sala. A tabela de verdade terrestre indica se uma pessoa estava presente na sala. Cada uma das tabelas tem uma chave primária ('room') e uma chave de carimbo de data/hora ('ts'). Para simplificar, apenas os dados de um único valor da chave primária ('0') são mostrados.

dados de tabela de recurso de exemplo

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

Como a restauração pontual funciona

Conforme mostrado na figura, o conjunto de dados de treinamento inclui os valores de recurso mais recentes para cada sensor antes do carimbo de data/hora na verdade terrestre observada.

Se você criou um conjunto de dados de treinamento sem levar em conta a chave de carimbo de data/hora, talvez tenha uma linha com esses valores de recurso e a verdade terrestre observada:

temp rh luz co2 verdade terrestre
15.8 32 212 630 0

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

Requisitos

  • Para a Engenharia de Recursos no Catálogo do Unity: cliente da Engenharia de Recursos no Catálogo do Unity (qualquer versão).
  • Para o Repositório de Recursos do Workspace: cliente do Repositório de Recursos v0.3.7 e superior.

Para usar a funcionalidade de ponto no tempo, especifique chaves relacionadas ao tempo usando o argumento timeseries_columns (no caso da Engenharia de Recursos no Catálogo do Unity) ou o argumento timestamp_keys (no caso do Repositório de Recursos do Workspace). Isso indica que as linhas da tabela de recursos devem ser unidas por meio da correspondência do valor mais recente para uma chave primária específica que não seja posterior ao valor da coluna timestamps_keys em vez da união com base em uma correspondência de hora exata.

Se você não usar timeseries_columns ou timestamp_keys e só designar uma coluna de série temporal como uma coluna de chave primária, o repositório de recursos não aplicará a lógica pontual à coluna de série temporal durante as junções. Em vez disso, ele corresponderá apenas a linhas com uma correspondência de tempo exata em vez de todas as linhas antes do carimbo de data/hora.

Criar uma tabela de recursos de série temporal no Catálogo do Unity

No Catálogo do Unity, qualquer tabela com uma chave primária TIMESERIES é uma tabela de recursos de série temporal. Confira Criar uma tabela de recursos no Catálogo do Unity para saber como criar uma.

Criar uma tabela de recursos de série temporal no workspace local

Para criar uma tabela de recursos de série temporal no Repositório de Recursos do Espaço de Trabalho local, o DataFrame ou esquema deve conter uma coluna que você designa como a chave de carimbo de tempo.

A partir do cliente do Repositório de Recursos v0.13.4, as colunas de chave de carimbo de data/hora devem ser especificadas no argumento primary_keys. As chaves de registro de data e hora fazem parte das "chaves primárias" que identificam exclusivamente cada linha na tabela de recursos. Como outras colunas de chave primária, as colunas de chave de carimbo de data/hora não podem conter valores NULL.

Engenharia de Recursos no Catálogo do Unity

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,
)

Cliente Workspace Feature Store v0.13.4 e superior

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,
)

Cliente Workspace Feature Store v0.13.3 e inferior

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 precisa ter uma chave de carimbo de data/hora e não pode ter nenhuma coluna de partição. A coluna da chave de carimbo de data/hora deve ser TimestampType ou DateType.

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

Atualizar uma tabela de recursos de série temporal

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

Engenharia de Recursos no Catálogo do Unity

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"
)

Cliente Workspace Feature Store v0.13.4 e superior

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"
)

Há suporte para gravações de streaming em tabelas de recursos de série temporal.

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

Para fazer uma pesquisa pontual de valores de recurso em uma tabela de recursos de série temporal, é preciso especificar uma timestamp_lookup_key na FeatureLookup do recurso, que indica o nome da coluna de DataFrame que contém os carimbos de data/hora em relação aos quais os recursos da série temporal devem ser pesquisados. O Databricks Feature Store recupera os valores dos recursos mais recentes anteriores aos carimbos de data/hora especificados na coluna timestamp_lookup_key do DataFrame e cujas chaves primárias (excluindo as chaves de carimbo de data/hora) correspondem aos valores nas colunas lookup_key do DataFrame, ou null se não houver nenhum valor de recurso desse tipo.

Engenharia de Recursos no Catálogo do Unity

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 habilitado, transmita use_spark_native_join=True para FeatureEngineeringClient.create_training_set. Para isso, é preciso ter o databricks-feature-engineering versão 0.6.0 ou superior.

Repositório de Recursos do Workspace

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 precisa ser uma pesquisa pontual. Portanto, ela precisa especificar uma coluna timestamp_lookup_key a ser usada no 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 do Repositório de Recursos v0.13.0 ou superior ou qualquer versão do cliente da Engenharia de Recursos no Catálogo do Unity, você pode excluir valores de recursos 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 padrão é None (todos os valores de recurso são usados, independentemente da idade).

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

Engenharia de Recursos no Catálogo do Unity

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)
  )
]

Repositório de Recursos do Workspace

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 junção pontual e exclui valores de recurso com mais de 7 dias.

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

Pontuar modelos com tabelas de recursos de série temporal

Quando você pontua um modelo treinado com recursos de tabelas de recursos de série temporal, o Repositório de Recursos do Databricks recupera os recursos apropriados usando pesquisas pontuais com metadados empacotados com o modelo durante o treinamento. O DataFrame fornecido para FeatureEngineeringClient.score_batch (no caso da Engenharia de Recursos no Catálogo do Unity) ou para FeatureStoreClient.score_batch (no caso do Repositório de Recursos do workspace) precisa conter uma coluna de carimbo de data/hora com o mesmo nome e DataType como a 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 habilitado, transmita use_spark_native_join=True para FeatureEngineeringClient.score_batch. Para isso, é preciso ter o databricks-feature-engineering versão 0.6.0 ou superior.

Publicar recursos de série temporal em um repositório online

Use FeatureEngineeringClient.publish_table (no caso da Engenharia de Recursos no Catálogo do Unity) ou FeatureStoreClient.publish_table (no caso do Repositório de Recursos do Workspace) para publicar tabelas de recursos de série temporal em repositórios online. O Feature Store do Databricks publica um instantâneo dos valores de recursos mais recentes para cada chave primária na tabela de recursos no repositório online. O repositório online dá suporte à pesquisa de chave primária, mas não à pesquisa pontual.

Exemplo de notebook: tabela de recursos de série temporal

Esses notebooks de exemplo ilustram PROCs pontuais em tabelas de recursos de série temporal.

Use esses notebooks em espaços de trabalho habilitados para o Catálogo do Unity.

Exemplo de notebook da tabela de recursos de série temporal (Catálogo do Unity)

Obter notebook

O notebook a seguir é projetado para espaços de trabalho que não estão habilitados para o Catálogo do Unity. Ele usa o Feature Store do espaço de trabalho.

Exemplo de notebook de tabela de recursos de série temporal (espaços de trabalho não habilitados para o Catálogo do Unity)

Obter notebook