다음을 통해 공유


특정 시점 지원과 함께 시계열 기능 테이블 사용

모델을 학습시키는 데 사용되는 데이터에는 종종 시간 종속성이 기본 제공되어 있습니다. 예를 들어 유지 관리가 필요한 공장 현장의 컴퓨터를 예측하는 모델을 학습하는 경우 컴퓨터가 서비스가 필요한지 여부를 나타내는 대상 레이블과 함께 많은 컴퓨터의 센서 측정 및 사용량 현황 데이터를 포함하는 기록 데이터 세트가 있을 수 있습니다. 데이터 세트에는 유지 관리 서비스가 수행되기 전과 후에 컴퓨터에 대한 데이터가 포함될 수 있습니다.

모델을 빌드할 때 관찰된 대상 값(서비스가 필요하거나 서비스가 필요하지 않음)까지 기능 값만 고려해야 합니다. 각 관찰의 타임스탬프를 명시적으로 고려하지 않으면 학습을 위해 대상 값의 타임스탬프 이후에 측정된 기능 값을 실수로 사용할 수 있습니다. 이를 "데이터 유출"이라고 하며 모델의 성능에 부정적인 영향을 줄 수 있습니다.

시계열 기능 테이블에는 학습 데이터 세트의 각 행이 행의 타임스탬프 기준으로 알려진 최신 기능 값을 나타내도록 하는 타임스탬프 키 열이 포함되어 있습니다. 시계열 데이터, 이벤트 기반 데이터 또는 시간 집계 데이터와 같이 시간에 따라 기능 값이 변경될 때마다 시계열 기능 테이블을 사용해야 합니다.

참고 항목

  • Databricks Runtime 13.3 LTS 이상을 사용하면 기본 키와 타임스탬프 키가 있는 Unity Catalog의 델타 테이블을 시계열 기능 테이블로 사용할 수 있습니다. 지정 시간 조회에서 성능을 향상시키려면 시계열 테이블에 Z-Ordering을 적용하는 것이 좋습니다.
  • 특정 시점 조회 기능을 ‘시간 이동’이라고도 합니다. Databricks 기능 저장소의 특정 시점 기능은 Delta Lake 시간 이동과 관련이 없습니다.
  • 지정 시간 기능을 사용하려면 인수(Unity 카탈로그의 기능 엔지니어링용) 또는 timestamp_keys 인수(작업 영역 기능 저장소의 경우)를 사용하여 timeseries_columns 시간 관련 키를 지정해야 합니다. 이는 정확한 시간 일치를 기반으로 조인하는 대신 열 값보다 늦지 않은 특정 기본 키의 timestamps_keys 최신 값을 일치시켜 기능 테이블 행을 조인해야 했음을 나타냅니다. 타이머 열을 기본 키 열로만 지정하는 경우 기능 저장소는 조인하는 동안 시간별 논리를 timeseries 열에 적용하지 않습니다. 대신 타임스탬프 이전의 모든 행을 일치시키는 대신 정확한 시간 일치를 가진 행만 일치합니다.

시계열 기능 테이블의 작동 방식

다음 기능 테이블이 있다고 가정해 보겠습니다. 이 데이터는 예제 Notebook에서 가져옵니다.

테이블에는 실내의 온도, 상대 습도, 주변 광원 및 이산화탄소를 측정하는 센서 데이터가 포함되어 있습니다. 지상 진리 표는 사람이 방에 있었는지를 나타냅니다. 각 테이블에는 기본 키('room')와 타임스탬프 키('ts')가 있습니다. 간단히 하기 위해 기본 키('0')의 단일 값에 대한 데이터만 표시됩니다.

기능 테이블 데이터 예제

다음 그림에서는 타임스탬프 키를 사용하여 학습 데이터 세트의 지정 시간 정확성을 보장하는 방법을 보여 줍니다. 기능 값은 AS OF 조인을 사용하여 기본 키(다이어그램에 표시되지 않음) 및 타임스탬프 키를 기반으로 일치합니다. AS OF 조인은 타임스탬프 당시 기능의 최신 값이 학습 집합에 사용되도록 합니다.

특정 시점의 작동 방식

그림에 표시된 것처럼 학습 데이터 세트에는 관찰된 지상 진리에 대한 타임스탬프 이전의 각 센서에 대한 최신 기능 값이 포함됩니다.

타임스탬프 키를 고려하지 않고 학습 데이터 세트를 만든 경우 다음과 같은 기능 값과 관찰된 기본 진리가 있는 행이 있을 수 있습니다.

temp rh light co2 지상 진리
15.8 32 212 630 0

그러나 630의 co2 판독값이 8시 52분에 지상 진리를 관찰한 후 8시 52분에 촬영되었기 때문에 이것은 훈련에 대한 유효한 관찰이 아닙니다. 향후 데이터는 학습 집합에 "누출"되므로 모델의 성능이 저하됩니다.

요구 사항

  • Unity 카탈로그의 기능 엔지니어링: Unity 카탈로그 클라이언트의 기능 엔지니어링(모든 버전)
  • 작업 영역 기능 저장소의 경우: Feature Store 클라이언트 v0.3.7 이상

Unity 카탈로그에서 시계열 기능 테이블 만들기

Unity 카탈로그에서 TIMESERIES 기본 키가 있는 테이블은 시계열 기능 테이블입니다. 만드는 방법은 Unity 카탈로그에서 기능 테이블 만들기를 참조하세요.

로컬 작업 영역에서 시계열 기능 테이블 만들기

로컬 작업 영역 기능 저장소에서 시계열 기능 테이블을 만들려면 DataFrame 또는 스키마에 타임스탬프 키로 지정한 열이 포함되어야 합니다.

기능 저장소 클라이언트 v0.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,
)

작업 영역 기능 저장소 클라이언트 v0.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,
)

작업 영역 기능 저장소 클라이언트 v0.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,
)

시계열 기능 테이블은 타임스탬프가 하나 있어야 하고 파티션 열을 포함할 수 없습니다. 타임스탬프 키 열 TimestampTypeDateType

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"
)

작업 영역 기능 저장소 클라이언트 v0.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"
)

시계열 기능 테이블에 대한 스트리밍 쓰기가 지원됩니다.

시계열 기능 테이블을 사용하여 학습 집합 만들기

시계열 기능 테이블에서 기능 값의 특정 시점을 조회하려면 기능의 FeatureLookuptimestamp_lookup_key을 지정해야 합니다. 이는 시계열 기능을 조회할 타임스탬프가 포함된 DataFrame 열의 이름을 나타냅니다. Databricks 기능 저장소는 DataFrame의 timestamp_lookup_key 열에 지정된 타임스탬프 이전에 최신 기능 값을 검색하며, 기본 키(타임스탬프 키 제외)가 DataFrame 열의 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()

작업 영역 기능 저장소

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은 특정 시점 조회여야 하므로, DataFrame에서 사용할 timestamp_lookup_key 열을 지정해야 합니다. 특정 시점 조회는 시계열 기능 테이블에 저장된 기능 값이 null인 행을 건너뛰지 않습니다.

기록 기능 값에 대한 시간 제한 설정

Feature Store 클라이언트 v0.13.0 이상 또는 Unity 카탈로그 클라이언트의 기능 엔지니어링 버전을 사용하면 이전 타임스탬프가 있는 기능 값을 학습 집합에서 제외할 수 있습니다. 이렇게 하려면 .에서 매개 변수 lookback_windowFeatureLookup사용합니다.

데이터 형식 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)
  )
]

FeatureLookup와 함께 호출 create_training_set 하면 지정 시간 조인이 자동으로 수행되고 7일보다 오래된 기능 값이 제외됩니다.

조회 창은 학습 및 일괄 처리 유추 중에 적용됩니다. 온라인 유추 중에는 조회 창에 관계없이 항상 최신 기능 값이 사용됩니다.

시계열 기능 테이블을 사용하여 모델 채점

시계열 기능 테이블의 기능으로 학습된 모델을 채점할 때 Databricks 기능 저장소에서는 학습 중에 모델과 함께 패키지된 메타데이터와 함께 특정 시점 조회를 사용해 적절한 기능을 검색합니다. 제공하는 FeatureEngineeringClient.score_batch 데이터 프레임(Unity 카탈로그의 기능 엔지니어링용) 또는 FeatureStoreClient.score_batch (작업 영역 기능 저장소의 경우) 제공된 FeatureStoreClient.create_training_setFeatureEngineeringClient.create_training_set 이름과 DataTypetimestamp_lookup_keyFeatureLookup 같은 타임스탬프 열을 포함해야 합니다.

온라인 저장소에 시계열 기능 게시

(Unity 카탈로그의 기능 엔지니어링) 또는 FeatureStoreClient.publish_table (작업 영역 기능 저장소의 경우) 시계열 기능 테이블을 온라인 상점에 게시하는 데 사용할 FeatureEngineeringClient.publish_table 수 있습니다. Databricks 기능 저장소는 온라인 스토어를 만든 OnlineStoreSpec에 따라 스냅샷 또는 시계열 데이터 창을 온라인 저장소에 게시하는 기능을 제공합니다. 표에는 각 게시 모드에 대한 세부 정보가 표시됩니다.

온라인 스토어 공급자 스냅샷 게시 모드 창 게시 모드
Azure Cosmos DB(v0.5.0 이상) X
Azure MySQL(단일 서버) X
Azure SQL Server X

시계열 스냅샷 게시

그러면 기능 테이블의 각 기본 키에 대한 최신 기능 값이 게시됩니다. 온라인 저장소는 기본 키 조회를 지원하지만 특정 시점 조회는 지원하지 않습니다.

TTL(Time to live)을 지원하지 않는 온라인 스토어의 경우 Databricks 기능 저장소는 스냅샷 게시 모드만 지원합니다. TTL(Time to live)을 지원하는 온라인 스토어의 경우 OnlineStoreSpec에서 생성 시 TTL(ttlTime to Live)을 지정하지 않는 한 기본 게시 모드는 스냅샷입니다.

시계열 창 게시

그러면 기능 테이블의 각 기본 키에 대한 모든 기능 값이 온라인 저장소에 게시되고 만료된 레코드가 자동으로 제거됩니다. 레코드의 타임스탬프(UTC)가 이전의 지정된 TTL(Time to Live) 기간보다 긴 경우 레코드가 만료된 것으로 간주됩니다. TTL(Time to Live)에 대한 자세한 내용은 클라우드 관련 설명서를 참조하세요.

온라인 스토어는 기본 키 조회를 지원하고 최신 타임스탬프를 사용하여 기능 값을 자동으로 검색합니다.

이 게시 모드를 사용하려면 OnlineStoreSpec에서 온라인 스토어를 만들 때 TTL(ttlTime to Live)에 대한 값을 제공해야 합니다. ttl는 설정하고 나면 변경할 수 없습니다. 모든 후속 게시 호출은 ttl을(를) 상속하며 OnlineStoreSpec에서 명시적으로 정의할 필요가 없습니다.

Notebook 예제: 시계열 기능 테이블

다음 Notebook에서는 작업 영역 기능 저장소의 시계열 기능 테이블에 대한 지정 시간 조회를 보여 줍니다.

시계열 기능 테이블 예제 Notebook

전자 필기장 가져오기