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-engineering
0.6.0 e superior) ou a Ordenação Z (nas versõesdatabricks-feature-engineering
0.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.
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.
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.
Como especificar chaves relacionadas ao tempo
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)
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.