Suporte point-in-time usando tabelas de recursos de séries cronológicas
Este artigo descreve como usar a correção point-in-time para criar um conjunto de dados de treinamento que reflita com precisão os valores do recurso a partir do momento em que uma observação de rótulo foi registrada. Isso é importante para evitar o vazamento de dados, que ocorre quando você usa valores de recurso para treinamento de modelo que não estavam disponíveis no momento em que o rótulo foi gravado. Esse tipo de erro pode ser difícil de detetar 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.
O diagrama a seguir mostra como a chave de carimbo de data/hora é usada. O valor do recurso registrado para cada carimbo de data/hora é o valor mais recente antes desse carimbo de data/hora, indicado pelo círculo laranja delineado. Se nenhum valor tiver sido registrado, o valor do recurso será nulo. Para obter mais detalhes, consulte Como funcionam as tabelas de recursos de séries temporais.
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.
- Para um melhor desempenho em pesquisas point-in-time, o Databricks recomenda que você aplique Liquid Clustering (para
databricks-feature-engineering
0.6.0 e acima) ou Z-Ordering (paradatabricks-feature-engineering
0.6.0 e abaixo) em tabelas de séries temporais. - 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.
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.
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 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 Workspace Feature Store (legado): Feature Store client v0.3.7 e superior.
Como especificar chaves relacionadas ao tempo
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ê não usar timeseries_columns
ou timestamp_keys
e designar apenas uma coluna de série cronológica como uma coluna de chave primária, o repositório de recursos não aplicará lógica point-in-time à coluna de séries cronológicas 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.
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 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 do 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 do Repositório 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 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 do 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 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 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()
Gorjeta
Para um desempenho de pesquisa mais rápido quando o Photon estiver ativado, passe use_spark_native_join=True
para FeatureEngineeringClient.create_training_set
. Isto requer a databricks-feature-engineering
versão 0.6.0 ou superior.
Loja 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 lookback_window
, e o valor padrão é datetime.timedelta
(todos os valores de None
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 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)
)
]
Loja 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_batch
para 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 DataType
data/hora com o mesmo nome e timestamp_lookup_key
o FeatureLookup
do fornecido para FeatureEngineeringClient.create_training_set
ou FeatureStoreClient.create_training_set
.
Gorjeta
Para um desempenho de pesquisa mais rápido quando o Photon estiver ativado, passe use_spark_native_join=True
para FeatureEngineeringClient.score_batch
. Isto requer a databricks-feature-engineering
versão 0.6.0 ou superior.
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 publica um instantâneo dos valores de recursos mais recentes para cada chave primária na tabela de recursos na loja online. A loja online suporta pesquisa de chave primária, mas não suporta pesquisa point-in-time.
Exemplo de bloco de notas: Tabela de funcionalidades de séries cronológicas
Estes blocos de anotações de exemplo ilustram pesquisas point-in-time em tabelas de recursos de séries temporais.
Use este bloco de anotações em espaços de trabalho habilitados para o Catálogo Unity.
Bloco de anotações de exemplo de tabela de recursos de série temporal (Catálogo Unity)
O bloco de anotações a seguir foi projetado para espaços de trabalho que não estão habilitados para o Catálogo Unity. Ele usa o Workspace Feature Store.