시계열 기능 테이블을 사용한 특정 시점 지원
이 문서에서는 지정 시간 정확성을 사용하여 레이블 관찰이 기록된 시점의 기능 값을 정확하게 반영하는 학습 데이터 세트를 만드는 방법을 설명합니다. 이는 레이블이 기록될 때 사용할 수 없었던 모델 학습에 기능 값을 사용할 때 발생하는 데이터 누출을 방지하는 데 중요합니다. 이러한 유형의 오류는 감지하기 어려울 수 있으며 모델의 성능에 부정적인 영향을 줄 수 있습니다.
시계열 기능 테이블에는 학습 데이터 세트의 각 행이 행의 타임스탬프 기준으로 알려진 최신 기능 값을 나타내도록 하는 타임스탬프 키 열이 포함되어 있습니다. 시계열 데이터, 이벤트 기반 데이터 또는 시간 집계 데이터와 같이 시간에 따라 기능 값이 변경되는 경우 시계열 기능 테이블을 사용해야 합니다.
다음 다이어그램에서는 타임스탬프 키를 사용하는 방법을 보여 있습니다. 각 타임스탬프에 대해 기록된 기능 값은 해당 타임스탬프 이전의 최신 값이며, 윤곽선이 있는 주황색 원으로 표시됩니다. 값이 기록되지 않은 경우 기능 값은 null입니다. 자세한 내용은 시계열 기능 테이블의 작동 방식을 참조 하세요.
참고 항목
- Databricks Runtime 13.3 LTS 이상을 사용하면 기본 키와 타임스탬프 키가 있는 Unity Catalog의 델타 테이블을 시계열 기능 테이블로 사용할 수 있습니다.
- 지정 시간 조회에서 성능을 향상시키려면 Databricks는 시계열 테이블에 Liquid 클러스터링(
databricks-feature-engineering
0.6.0 이상) 또는 Z-Ordering(databricks-feature-engineering
0.6.0 이하)을 적용하는 것이 좋습니다. - 특정 시점 조회 기능을 ‘시간 이동’이라고도 합니다. Databricks 기능 저장소의 특정 시점 기능은 Delta Lake 시간 이동과 관련이 없습니다.
시계열 기능 테이블의 작동 방식
다음 기능 테이블이 있다고 가정해 보겠습니다. 이 데이터는 예제 Notebook에서 가져옵니다.
테이블에는 실내의 온도, 상대 습도, 주변 광원 및 이산화탄소를 측정하는 센서 데이터가 포함되어 있습니다. 근거 진리 표는 사람이 방에 있었는지를 나타냅니다. 각 테이블에는 기본 키('room')와 타임스탬프 키('ts')가 있습니다. 간단히 하기 위해 기본 키('0')의 단일 값에 대한 데이터만 표시됩니다.
다음 그림에서는 타임스탬프 키를 사용하여 학습 데이터 세트의 지정 시간 정확성을 보장하는 방법을 보여줍니다. 기능 값은 AS OF 조인을 사용하여 기본 키(다이어그램에 표시되지 않음) 및 타임스탬프 키를 기반으로 일치합니다. AS OF 조인은 타임스탬프 당시 기능의 최신 값이 학습 집합에 사용되도록 합니다.
그림에 표시된 것처럼 학습 데이터 세트에는 관찰된 근거 진리에 대한 타임스탬프 이전의 각 센서에 대한 최신 기능 값이 포함됩니다.
타임스탬프 키를 고려하지 않고 학습 데이터 세트를 만든 경우 다음과 같은 기능 값과 관찰된 기본 진리가 있는 행이 있을 수 있습니다.
temp | rh | light | co2 | 참값(Ground truth) |
---|---|---|---|---|
15.8 | 32 | 212 | 630 | 0 |
그러나 630의 co2 판독값이 8시 50분에 근거 진리를 관찰한 후 8시 52분에 촬영되었기 때문에 이것은 학습에 대한 유효한 관찰이 아닙니다. 향후 데이터는 학습 집합에 "누출"되므로 모델의 성능이 저하됩니다.
요구 사항
- Unity 카탈로그의 기능 엔지니어링: Unity 카탈로그 클라이언트의 기능 엔지니어링(모든 버전).
- 작업 영역 기능 저장소의 경우: Feature Store 클라이언트 v0.3.7 이상.
시간 관련 키를 지정하는 방법
지정 시간 기능을 사용하려면 timeseries_columns
인수(Unity 카탈로그의 기능 엔지니어링용) 또는 timestamp_keys
인수(작업 영역 기능 저장소의 경우)를 사용하여 시간 관련 키를 지정해야 합니다. 이는 정확한 시간 일치를 기반으로 조인하는 대신 timestamps_keys
열 값보다 늦지 않은 특정 기본 키의 최신 값을 일치시켜 기능 테이블 행을 조인해야 했음을 나타냅니다.
timeseries_columns
또는 timestamp_keys
를 사용하지 않고 시계열 열만 기본 키 열로 지정한 경우, 피처 저장소는 조인 중에 시계열 열에 지점별 논리를 적용하지 않습니다. 대신 타임스탬프 이전의 모든 행을 일치시키는 대신 정확한 시간 일치를 가진 행만 일치합니다.
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,
)
Workspace Feature Store 클라이언트 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,
)
Workspace Feature Store 클라이언트 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,
)
시계열 기능 테이블은 타임스탬프가 하나 있어야 하고 파티션 열을 포함할 수 없습니다. 타임스탬프 키 열은 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"
)
Workspace Feature Store 클라이언트 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"
)
시계열 기능 테이블에 대한 스트리밍 쓰기가 지원됩니다.
시계열 기능 테이블을 사용하여 학습 집합 만들기
시계열 기능 테이블에서 기능 값의 특정 시점을 조회하려면 기능의 FeatureLookup
에 timestamp_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()
팁
Photon을 사용할 때 더 빠른 조회 성능을 위해 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
은 특정 시점 조회여야 하므로, DataFrame에서 사용할 timestamp_lookup_key
열을 지정해야 합니다. 특정 시점 조회는 시계열 기능 테이블에 저장된 기능 값이 null
인 행을 건너뛰지 않습니다.
기록 기능 값에 대한 시간 제한 설정
Feature Store 클라이언트 v0.13.0 이상 또는 Unity 카탈로그 클라이언트의 기능 엔지니어링 버전을 사용하면 이전 타임스탬프가 있는 기능 값을 학습 집합에서 제외할 수 있습니다. 이렇게 하려면 FeatureLookup
에서 매개 변수 lookback_window
를 사용합니다.
데이터 형식 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 Catalog의 Feature Engineering용) 또는 FeatureStoreClient.score_batch
(Workspace Feature Store용)에 제공하는 DataFrame에는 FeatureEngineeringClient.create_training_set
또는 FeatureStoreClient.create_training_set
에 제공된 FeatureLookup
의 timestamp_lookup_key
와 동일한 이름 및 DataType
를 갖는 타임스탬프 열이 포함되어야 합니다.
팁
Photon을 사용할 때 더 빠른 조회 성능을 위해 use_spark_native_join=True
을 FeatureEngineeringClient.score_batch
으로 전달 합니다. databricks-feature-engineering
버전 0.6.0 이상이 필요합니다.
온라인 저장소에 시계열 기능 게시
FeatureEngineeringClient.publish_table
(Unity Catalog의 피처 엔지니어링용) 또는 FeatureStoreClient.publish_table
(Workspace Feature Store용)을 사용하여 시계열 피처 테이블을 온라인 스토어에 게시할 수 있습니다. Databricks 기능 저장소는 기능 테이블의 각 기본 키에 대한 최신 기능 값의 스냅샷을 온라인 저장소에 게시합니다. 온라인 저장소는 기본 키 조회를 지원하지만 특정 시점 조회는 지원하지 않습니다.
Notebook 예제:시계열 기능 테이블
다음 예제 Notebook에서는 시계열 기능 테이블의 지정 시간 조회를 보여 줍니다.
Unity 카탈로그에 사용하도록 설정된 작업 영역에서 이 Notebook을 사용합니다.
시계열 기능 테이블 예제 Notebook(Unity 카탈로그)
다음 Notebook은 Unity 카탈로그에 대해 사용하도록 설정되지 않은 작업 영역을 위해 설계되었습니다. 작업 영역 기능 저장소를 사용합니다.