Поддержка временных рядов с помощью таблиц функций временных рядов
В этой статье описывается, как использовать правильность на определенный момент времени для создания обучающего набора данных, который точно отражает значения признаков по состоянию на время записи наблюдения меток. Это важно, чтобы предотвратить утечку данных, которая возникает при использовании значений признаков для обучения моделей, которые были недоступны в момент записи метки. Этот тип ошибки может быть трудно обнаружить и негативно повлиять на производительность модели.
Таблицы функций временных рядов включают ключевой столбец метки времени, который гарантирует, что каждая строка в наборе данных обучения представляет последние известные значения признаков в виде метки времени строки. Таблицы функций временных рядов следует использовать всякий раз, когда значения признаков изменяются со временем, например с данными временных рядов, данными на основе событий или агрегированными данными времени.
На следующей схеме показано, как используется ключ метки времени. Значение функции, записанное для каждой метки времени, является последним значением до этой метки времени, указанной очертания оранжевым кругом. Если значения не были записаны, значение функции равно NULL. Дополнительные сведения см. в статье о работе таблиц функций временных рядов.
Примечание.
- В Databricks Runtime 13.3 LTS и более поздних версиях любая таблица Delta в каталоге Unity с первичными ключами и ключами метки времени можно использовать в качестве таблицы функций временных рядов.
- Для повышения производительности при поиске на определенный момент времени Databricks рекомендует применять Liquid Clustering (для
databricks-feature-engineering
0.6.0 и более поздних версий) или Z-Упорядочение (дляdatabricks-feature-engineering
0.6.0 и ниже) в таблицах временных рядов. - Функции поиска на момент времени иногда называются переходом по времени. Функции поиска на момент времени в хранилище признаков Databricks не связаны с переходом по времени Delta Lake.
Как работают таблицы функций временных рядов
Предположим, что у вас есть следующие таблицы функций. Эти данные взяты из примера записной книжки.
Таблицы содержат данные датчика, измеряя температуру, относительную влажность, окружающую свет и углекислый газ в помещении. Таблица истины земли указывает, присутствует ли человек в комнате. У каждой таблицы есть первичный ключ ("room") и ключ метки времени (ts). Для простоты отображаются только данные для одного значения первичного ключа ('0').
На следующем рисунке показано, как используется ключ метки времени для обеспечения правильности на определенный момент времени в обучающем наборе данных. Значения признаков сопоставляются на основе первичного ключа (не показанного на схеме) и ключа метки времени с использованием соединения AS OF. Соединение AS OF гарантирует, что последнее значение функции во время метки времени используется в наборе обучения.
Как показано на рисунке, набор данных обучения включает последние значения признаков для каждого датчика до метки времени на наблюдаемой земле правде.
Если вы создали обучающий набор данных без учета ключа метки времени, возможно, у вас есть строка с этими значениями признаков и наблюдаемая истина на основе:
temp | rh | light | co2 | земная правда |
---|---|---|---|---|
15,8 | 32 | 212 | 630 | 0 |
Однако это не допустимое наблюдение за обучением, потому что со2 чтение 630 было принято в 8:52, после наблюдения за землей правдой в 8:50. Будущие данные "утечка" в обучающий набор, что приведет к повышению производительности модели.
Требования
- Для проектирования компонентов в каталоге Unity: проектирование компонентов в клиенте каталога Unity (любая версия).
- Для хранилища компонентов рабочей области (устаревшая версия): клиент Магазина компонентов версии 0.3.7 и более поздних версий.
Указание ключей, связанных с временем
Чтобы использовать функциональные возможности точки во времени, необходимо указать ключи, связанные с временем, с помощью timeseries_columns
аргумента (для конструктора компонентов в каталоге Unity) или timestamp_keys
аргумента (для хранилища компонентов рабочей области). Это означает, что строки таблицы признаков должны быть присоединены путем сопоставления последнего значения для определенного первичного timestamps_keys
ключа, который не превышает значение столбца, а не присоединение на основе точного совпадения времени.
Если вы не используете timeseries_columns
или timestamp_keys
не назначаете только столбец таймерий в качестве столбца первичного ключа, хранилище функций не применяет логику времени к столбцу таймерий во время соединения. Вместо этого он соответствует только строкам с точным совпадением времени вместо сопоставления всех строк до метки времени.
Создание таблицы функций временных рядов в каталоге Unity
В каталоге Unity любая таблица с первичным ключом TIMESERIES — это таблица функций временных рядов. Сведения о создании таблицы компонентов в каталоге Unity см. в статье "Создание таблицы компонентов".
Создание таблицы функций временных рядов в локальной рабочей области
Чтобы создать таблицу функций временных рядов в локальном хранилище компонентов рабочей области, кадр данных или схема должна содержать столбец, назначенный в качестве ключа метки времени.
Начиная с клиента Магазина компонентов версии 0.13.4 в аргументе необходимо указать ключевые primary_keys
столбцы метки времени. Ключи метки времени являются частью "первичных ключей", которые однозначно определяют каждую строку в таблице признаков. Как и другие столбцы первичного ключа, ключевые столбцы метки времени не могут содержать NULL
значения.
Проектирование компонентов в каталоге 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,
)
Клиент Хранилища компонентов рабочей области версии 0.13.4 и более поздних версий
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,
)
Клиент Хранилища компонентов рабочей области версии 0.13.3 и ниже
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,
)
Таблица признаков временного ряда должна содержать один ключ метки времени и не должна содержать столбцов секционирования. Ключевой столбец метки времени должен иметь TimestampType
значение или DateType
.
Согласно рекомендациям Databricks, таблицы признаков временного ряда не должны содержать более двух столбцов первичного ключа, чтобы обеспечить производительность операций записи и поиска.
Обновление таблицы признаков временного ряда
При записи признаков в таблицы признаков временного ряда (в отличие от обычных таблиц признаков) в DataFrame должны содержаться значения для всех признаков таблицы признаков. Это ограничение снижает степень незаполненности значений признаков по меткам времени в таблице признаков временного ряда.
Проектирование компонентов в каталоге 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"
)
Клиент Хранилища компонентов рабочей области версии 0.13.4 и более поздних версий
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"
)
В таблицах признаков временного ряда поддерживается потоковая запись.
Создание обучающего набора с таблицей признаков временного ряда
Чтобы выполнить поиск на момент времени для значений признаков из таблицы признаков временного ряда, необходимо указать в параметре timestamp_lookup_key
признака ключ FeatureLookup
— имя столбца DataFrame, который содержит метки времени для поиска признаков временного ряда. Databricks Feature Store извлекает последние значения признаков до меток времени, указанных в столбце DataFrame, и первичные ключи (за исключением ключей метки времени) соответствуют значениям в столбцах dataFrame timestamp_lookup_key
lookup_key
или null
если такое значение функции не существует.
Проектирование компонентов в каталоге 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()
Совет
Для повышения производительности подстановки при включении Фотона передайте use_spark_native_join=True
в FeatureEngineeringClient.create_training_set
. Для этого требуется databricks-feature-engineering
версия 0.6.0 или более поздней.
Хранилище компонентов рабочей области
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()
Любой поиск FeatureLookup
в таблице признаков временного ряда должен представлять собой поиск на момент времени, поэтому он должен указывать столбец timestamp_lookup_key
для использования в DataFrame. Поиск на момент времени не пропускает строки со значениями признака null
, хранящимися в таблице признаков временного ряда.
Установка ограничения времени для исторических значений признаков
С помощью клиента Магазина компонентов версии 0.13.0 или более поздней версии или любой версии конструктора компонентов в клиенте каталога Unity можно исключить значения компонентов со старыми метками времени из обучающего набора. Для этого используйте параметр lookback_window
в файле FeatureLookup
.
Тип lookback_window
данных должен быть datetime.timedelta
, и значение по умолчанию — None
(все значения признаков используются независимо от возраста).
Например, следующий код исключает любые значения признаков, которые старше 7 дней:
Проектирование компонентов в каталоге 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)
)
]
Хранилище компонентов рабочей области
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)
)
]
При вызове create_training_set
с приведенным выше FeatureLookup
параметром он автоматически выполняет соединение между точками во времени и исключает значения функций старше 7 дней.
Окно обратного просмотра применяется во время обучения и пакетного вывода. Во время вывода в Интернете всегда используется последнее значение функции независимо от окна обратного просмотра.
Оценка моделей с помощью таблиц признаков временного ряда
При оценке модели, обученной на основе признаков из таблиц признаков временного ряда, хранилище признаков Databricks извлекает соответствующие признаки с помощью поиска на момент времени с использованием метаданных, упакованных в модель на этапе обучения. Предоставленный кадр FeatureEngineeringClient.score_batch
данных (для проектирования компонентов в каталоге Unity) или FeatureStoreClient.score_batch
(для хранилища компонентов рабочей области) должен содержать столбец метки времени с таким же именем и DataType
timestamp_lookup_key
FeatureLookup
как предоставленный FeatureEngineeringClient.create_training_set
или.FeatureStoreClient.create_training_set
Совет
Для повышения производительности подстановки при включении Фотона передайте use_spark_native_join=True
в FeatureEngineeringClient.score_batch
. Для этого требуется databricks-feature-engineering
версия 0.6.0 или более поздней.
Публикация признаков временного ряда в онлайн-хранилище
Вы можете использовать FeatureEngineeringClient.publish_table
(для проектирования компонентов в каталоге Unity) или FeatureStoreClient.publish_table
(для хранилища компонентов рабочей области) для публикации таблиц функций временных рядов в интернет-магазинах. Databricks Feature Store публикует моментальный снимок последних значений функций для каждого первичного ключа в таблице компонентов в интернет-магазине. Онлайн-хранилище поддерживает поиск по первичному ключу, но не поддерживает поиск на момент времени.
Пример записной книжки: таблица функций временных рядов
В этих примерах записные книжки иллюстрируют поиски на определенный момент времени в таблицах функций временных рядов.
Используйте эту записную книжку в рабочих областях, включенных для каталога Unity.
Пример записной книжки для таблицы функций временных рядов (каталог Unity)
Следующая записная книжка предназначена для рабочих областей, которые не включены для каталога Unity. В нем используется хранилище компонентов рабочей области.