Использование таблиц функций временных рядов с поддержкой поддержки точки во времени

Данные, используемые для обучения модели, часто имеют зависимости времени, встроенные в него. Например, если вы обучаете модель для прогнозирования необходимости обслуживания компьютеров на заводской площадке, у вас могут быть исторические наборы данных, содержащие измерения датчиков и данные об использовании для многих компьютеров, а также целевые метки, указывающие, требуется ли служба компьютера или нет. Набор данных может содержать данные для компьютеров до и после выполнения обслуживания.

При сборке модели необходимо учитывать только значения признаков до времени наблюдаемого целевого значения (требуется служба или не требуется служба). Если вы явно не учитываете метку времени каждого наблюдения, вы можете случайно использовать значения признаков, измеряемые после метки времени целевого значения для обучения. Это называется "утечкой данных" и может отрицательно повлиять на производительность модели.

Таблицы функций временных рядов включают ключевой столбец метки времени, который гарантирует, что каждая строка в наборе данных обучения представляет последние известные значения признаков в виде метки времени строки. Таблицы функций временных рядов следует использовать всякий раз, когда значения признаков изменяются со временем, например с данными временных рядов, данными на основе событий или агрегированными данными времени.

Примечание.

  • В Databricks Runtime 13.3 LTS и более поздних версиях любая таблица Delta в каталоге Unity с первичными ключами и ключами метки времени можно использовать в качестве таблицы функций временных рядов. Мы рекомендуем применять Z-Ordering к таблицам временных рядов для повышения производительности при поиске на определенный момент времени.
  • Функции поиска на момент времени иногда называются переходом по времени. Функции поиска на момент времени в хранилище признаков Databricks не связаны с переходом по времени Delta Lake.
  • Чтобы использовать функциональные возможности точки во времени, необходимо указать ключи, связанные с временем, с помощью timeseries_columns аргумента (для конструктора компонентов в каталоге Unity) или timestamp_keys аргумента (для хранилища компонентов рабочей области). Это означает, что строки таблицы признаков должны быть присоединены путем сопоставления последнего значения для определенного первичного timestamps_keys ключа, который не превышает значение столбца, а не присоединение на основе точного совпадения времени. Если вы назначаете только столбец таймерий в качестве первичного ключевого столбца, хранилище функций не применяет логику времени к столбцу таймерий во время соединения. Вместо этого он соответствует только строкам с точным совпадением времени вместо сопоставления всех строк до метки времени.

Как работают таблицы функций временных рядов

Предположим, что у вас есть следующие таблицы функций. Эти данные взяты из примера записной книжки.

Таблицы содержат данные датчика, измеряя температуру, относительную влажность, окружающую свет и углекислый газ в помещении. Таблица истины земли указывает, присутствует ли человек в комнате. У каждой таблицы есть первичный ключ ("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 и более поздних версий

Создание таблицы функций временных рядов в каталоге 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"
)

В таблицах признаков временного ряда поддерживается потоковая запись.

Создание обучающего набора с таблицей признаков временного ряда

Чтобы выполнить поиск на момент времени для значений признаков из таблицы признаков временного ряда, необходимо указать в параметре FeatureLookupпризнака ключ timestamp_lookup_key — имя столбца DataFrame, который содержит метки времени для поиска признаков временного ряда. Databricks Feature Store извлекает последние значения признаков до меток времени, указанных в столбце DataFrame, и первичные ключи (за исключением ключей метки времени) соответствуют значениям в столбцах dataFrame timestamp_lookup_keylookup_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()

Хранилище функций рабочей области

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 (для хранилища компонентов рабочей области) должен содержать столбец метки времени с таким же именем и DataTypeFeatureLookuptimestamp_lookup_key как предоставленный FeatureEngineeringClient.create_training_set или.FeatureStoreClient.create_training_set

Публикация признаков временного ряда в онлайн-хранилище

Вы можете использовать FeatureEngineeringClient.publish_table (для проектирования компонентов в каталоге Unity) или FeatureStoreClient.publish_table (для хранилища компонентов рабочей области) для публикации таблиц функций временных рядов в интернет-магазинах. Хранилище признаков Databricks позволяет публиковать снимки или окна данных временных рядов в интернет-магазине, в зависимости от спецификации OnlineStoreSpec, с помощью которой создавался интернет-магазин. В таблице показаны сведения о каждом режиме публикации.

Поставщик интернет-магазина Режим публикации моментальных снимков Режим публикации окон
Azure Cosmos DB (версия 0.5.0 и выше) X
Azure MySQL (отдельный сервер) X
Azure SQL Server X

Публикация моментальных снимков временных рядов

При этом публикуются последние значения признаков для каждого первичного ключа в таблице признаков. Онлайн-хранилище поддерживает поиск по первичному ключу, но не поддерживает поиск на момент времени.

Для интернет-магазинов, которые не поддерживают срок жизни, хранилище признаков Databricks поддерживает только режим публикации моментальных снимков. Для интернет-магазинов, которые поддерживают срок жизни, режим публикации по умолчанию — это моментальный снимок, если только не указано время жизни (ttl) в OnlineStoreSpec во время создания.

Публикация окон временных рядов

При этом публикуются все значения признаков для каждого первичного ключа в таблице признаков в интернет-магазине и автоматически удаляются просроченные записи. Запись считается просроченной, если метка времени записи (в формате UTC) превышает указанное время жизни в прошлом. Дополнительные сведения о времени жизни см. в документации по облачной среде.

Интернет-магазин поддерживает поиск первичного ключа и автоматически извлекает значение признака с последней меткой времени.

Чтобы использовать этот режим публикации, необходимо указать значение времени жизни (ttl) в OnlineStoreSpec при создании веб-магазина. ttl нельзя изменить после настройки. Все последующие вызовы публикации наследуют ttl, и явно определять в OnlineStoreSpec при этом не обязательно.

Пример записной книжки: таблица функций временных рядов

Следующая записная книжка иллюстрирует поиск на определенный момент времени в таблицах функций временных рядов в хранилище компонентов рабочей области.

Пример записной книжки для таблицы признаков временного ряда

Получить записную книжку