Partilhar via


Usar tabelas de recursos de séries cronológicas com suporte point-in-time

Os dados usados para treinar um modelo geralmente têm dependências de tempo incorporadas nele. Por exemplo, se você estiver treinando um modelo para prever quais máquinas em um chão de fábrica precisam de manutenção, você pode ter conjuntos de dados históricos que contêm medições de sensores e dados de uso para muitas máquinas, juntamente com rótulos de destino que indicam se a máquina precisava de serviço ou não. O conjunto de dados pode conter dados para máquinas antes e depois da execução de um serviço de manutenção.

Ao criar o modelo, você deve considerar apenas os valores de recurso até o momento do valor de destino observado (precisa de serviço ou não precisa de serviço). Se você não levar em conta explicitamente 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éries temporais incluem 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 mais recentes como do carimbo de data/hora da linha. Você deve usar tabelas de recursos de séries temporais sempre que os valores de recursos mudarem ao longo do tempo, por exemplo, com dados de séries temporais, dados baseados em eventos ou dados agregados por tempo.

Nota

  • Com o Databricks Runtime 13.3 LTS e superior, qualquer tabela Delta no Unity Catalog com chaves primárias e chaves de carimbo de data/hora pode ser usada como uma tabela de recursos de série temporal. Recomendamos a aplicação do Z-Ordering em tabelas de séries cronológicas para um melhor desempenho em pesquisas point-in-time.
  • A funcionalidade de pesquisa point-in-time é por vezes referida como "viagem no tempo". A funcionalidade point-in-time no Databricks Feature Store não está relacionada à viagem no tempo do Delta Lake.
  • Para usar a funcionalidade point-in-time, você deve especificar chaves relacionadas ao tempo usando o timeseries_columns argumento (para Feature Engineering no Unity Catalog) ou o argumento (para Workspace timestamp_keys Feature Store). Isso indica que as linhas da tabela de recursos devem ser unidas combinando o valor mais recente para uma chave primária específica que não seja posterior ao valor da coluna, em vez de unir com base em uma correspondência de timestamps_keys tempo exata. Se você designar apenas uma coluna de série temporal como uma coluna de chave primária, o repositório de recursos não aplicará lógica point-in-time à coluna de série temporal durante as junções. Em vez disso, ele corresponde apenas a 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. Estes dados são retirados do bloco de notas de exemplo.

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

Exemplo de dados da tabela de recursos

A figura a seguir ilustra como a chave de carimbo de data/hora é usada para garantir a correção point-in-time em um conjunto de dados de treinamento. Os valores de feição 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 ASSOCIAÇÃ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 funciona o Point In Time

Como 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 do solo observado.

Se você criou um conjunto de dados de treinamento sem levar em conta a chave de carimbo de data/hora, poderá ter uma linha com estes valores de recurso e a verdade do terreno observado:

temp RH luz CO2 verdade fundamental
15.8 32 212 630 0

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

Requisitos

  • Para Engenharia de Recursos no Catálogo Unity: Engenharia de Recursos no cliente do Catálogo Unity (qualquer versão)
  • Para o Repositório de Recursos do Espaço de Trabalho: Cliente do Repositório de Recursos v0.3.7 e superior

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

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

Criar 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 Repositório de Recursos de Espaço de Trabalho local, o DataFrame ou esquema deve conter uma coluna que você designa como a chave de carimbo de data/hora.

A partir do cliente do Feature Store v0.13.4, as colunas de chave de carimbo primary_keys de data/hora devem ser especificadas no argumento. As chaves de carimbo de data/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 NULL valores.

Engenharia de recursos no catálogo da unidade

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 de armazenamento de recursos de espaço de trabalho 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 de armazenamento de recursos de espaço de trabalho 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 deve ter uma chave de carimbo de data/hora e não pode ter colunas de partição. A coluna de chave de carimbo de data/hora deve ser de TimestampType ou DateType.

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

Atualizar uma tabela de recursos de série temporal

Ao escrever recursos nas tabelas de recursos de séries temporais, seu DataFrame deve fornecer valores para todos os recursos da tabela de recursos, ao contrário das tabelas de recursos comuns. Essa restrição reduz a parsidade de valores de recursos entre carimbos de data/hora na tabela de recursos de séries temporais.

Engenharia de recursos no catálogo da unidade

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 de armazenamento de recursos de espaço de trabalho 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 streaming de gravações em tabelas de recursos de séries temporais.

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

Para executar uma pesquisa point-in-time de valores de recursos de uma tabela de recursos de série temporal, você deve especificar um timestamp_lookup_key no , do recurso FeatureLookup, que indica o nome da coluna DataFrame que contém carimbos de data/hora em relação aos quais pesquisar recursos de séries temporais. O Databricks Feature Store recupera os valores de recurso mais recentes antes dos carimbos de data/hora especificados na coluna do DataFrame e cujas chaves primárias timestamp_lookup_key (excluindo chaves de carimbo de data/hora) correspondem aos valores nas colunas do lookup_key DataFrame, ou null se esse valor de recurso não existir.

Engenharia de recursos no catálogo da unidade

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

Repositório de recursos do espaço de trabalho

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 uma em uma tabela de recursos de série temporal deve ser uma pesquisa point-in-time, portanto, deve especificar uma timestamp_lookup_key coluna para usar em seu DataFrame. A pesquisa point-in-time não ignora linhas com null valores de recursos armazenados na tabela de recursos de séries temporais.

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

Com o cliente do Feature Store v0.13.0 ou superior, ou qualquer versão do Feature Engineering no cliente do Unity Catalog, 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 deve ser datetime.timedelta, e o valor padrão é None (todos os valores de lookback_window recurso são usados, independentemente da idade).

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

Engenharia de recursos no catálogo da unidade

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 espaço de trabalho

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ê liga create_training_set com o acima FeatureLookup, ele executa automaticamente a junção point-in-time e exclui valores de recurso com mais de 7 dias.

A janela de retrospetiva é 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 retrospetiva.

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

Quando você pontua um modelo treinado com recursos de tabelas de recursos de séries temporais, o Databricks Feature Store recupera os recursos apropriados usando pesquisas point-in-time com metadados empacotados com o modelo durante o treinamento. O DataFrame que você fornece (FeatureEngineeringClient.score_batchpara Engenharia de Recursos no Catálogo Unity) ou FeatureStoreClient.score_batch (para o Repositório de Recursos de Espaço de Trabalho) deve conter uma coluna de carimbo de FeatureLookup data/hora com o mesmo nome e DataType o timestamp_lookup_key do fornecido para FeatureEngineeringClient.create_training_set ou FeatureStoreClient.create_training_set.

Publicar recursos de séries cronológicas em uma loja online

Você pode usar FeatureEngineeringClient.publish_table (para Engenharia de Recursos no Catálogo Unity) ou FeatureStoreClient.publish_table (para o Repositório de Recursos do Espaço de Trabalho) para publicar tabelas de recursos de séries temporais em lojas online. O Databricks Feature Store fornece a funcionalidade de publicar um instantâneo ou uma janela de dados de séries cronológicas na loja online, dependendo do OnlineStoreSpec que criou a loja online. A tabela mostra detalhes para cada modo de publicação.

Fornecedor de loja online Modo de publicação de instantâneo Modo de publicação de janela
Azure Cosmos DB (v0.5.0 e superior) X
Azure MySQL (Servidor Único) X
Azure SQL Server X

Publicar um instantâneo de série temporal

Isso publica os valores de recurso mais recentes para cada chave primária na tabela de recursos. A loja online suporta pesquisa de chave primária, mas não suporta pesquisa point-in-time.

Para lojas online que não suportam tempo de vida, o Databricks Feature Store suporta apenas o modo de publicação de instantâneo. Para lojas online que suportam tempo de vida, o modo de publicação padrão é instantâneo, a menos que o OnlineStoreSpec tempo de vida (ttl) seja especificado no no momento da criação.

Publicar uma janela de série temporal

Isso publica todos os valores de recurso para cada chave primária na tabela de recursos na loja online 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 duração de vida no passado. Consulte a documentação específica da nuvem para obter detalhes sobre o tempo de vida.

A loja online suporta a pesquisa de chave primária e recupera automaticamente o valor do recurso com o carimbo de data/hora mais recente.

Para usar esse modo de publicação, você deve fornecer um valor para o tempo de vida (ttl) no momento em que OnlineStoreSpec você cria a loja online. O ttl não pode ser alterado uma vez definido. Todas as chamadas de publicação subsequentes herdam o ttl e não são obrigados a defini-lo explicitamente no OnlineStoreSpec.

Exemplo de bloco de notas: Tabela de funcionalidades de séries cronológicas

O bloco de anotações a seguir ilustra pesquisas point-in-time em tabelas de recursos de séries temporais no Workspace Feature Store.

Exemplo de tabela de recursos de série temporal

Obter o bloco de notas