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.
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 (paradatabricks-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.
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.
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 o espaço de trabalho recurso Store (legado): cliente recurso Store 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.
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.