使用具有時間點支持的時間序列特性表
Databricks Feature Store支持需要時間點正確性的用例。
用於訓練模型的數據通常具有內置的時間依賴性。例如,如果您正在訓練一個模型來預測工廠車間的哪些機器需要維護,那麼您可能擁有曆史數據集,其中包含許多機器的傳感器測量和使用數據,以及指示機器是否需要服務的目標標簽。數據集可能包含執行維護服務之前和之後的機器數據。
在構建模型時,必須隻考慮觀察到目標值(需要服務或不需要服務)之前的特征值。如果你沒有明確地考慮每個觀察的時間戳,你可能會無意中使用目標值的時間戳之後測量的特征值進行訓練。這被稱為“數據泄漏”,可能會對模型的性能產生負麵影響。
時間序列特征表包括一個時間戳鍵列,以確保訓練數據集中的每一行都表示該行時間戳的最新已知特征值。當特征值隨時間變化時,您應該使用時間序列特征表,例如時間序列數據、基於事件的數據或時間聚合的數據。
請注意
時間序列特征表是如何工作的
假設您有以下特性表。此數據取自例如筆記本電腦.
這些表包含傳感器數據,測量房間內的溫度、相對濕度、環境光和二氧化碳。地麵真實值表顯示了一個人是否出現在房間裏。每個表都有一個主鍵(' room ')和一個時間戳鍵(' ts ')。為簡單起見,隻顯示主鍵(' 0 ')的單個值的數據。
下圖說明了如何使用時間戳鍵來確保訓練數據集中時間點的正確性。使用AS OF連接,特性值基於主鍵(圖中沒有顯示)和時間戳鍵進行匹配。AS OF連接確保在訓練集中使用時間戳時特征的最新值。
如圖所示,訓練數據集包括每個傳感器在觀測到的地麵真相上的時間戳之前的最新特征值。
如果你創建了一個訓練數據集而不考慮時間戳鍵,你可能會有一行帶有這些特征值和觀察到的ground truth:
臨時 |
rh |
光 |
二氧化碳 |
地麵實況 |
---|---|---|---|---|
15.8 |
32 |
212 |
630 |
0 |
然而,這對訓練來說並不是一個有效的觀察結果,因為二氧化碳630的讀數是在8:52,在8:50的地麵真實值觀測之後拍攝的。未來的數據正在“泄露”到訓練集中,這將損害模型的性能。
在Databricks feature Store中創建一個時間序列特征表
要創建時間序列特性表,DataFrame或模式必須包含指定為時間戳鍵的列。
fs=FeatureStoreClient()# user_features_df數據幀包含以下列:# - user_id# - ts# - purchases_30d . ## - is_free_trial_activefs.create_table(的名字=“ads_team.user_features”,鍵=“user_id”,timestamp_keys=“t”,features_df=user_features_df,)
時間序列特征表必須有一個時間戳鍵,不能有任何分區列。時間戳鍵列必須為TimestampType
或DateType
也不能是主鍵。
Databricks建議時間序列特征表不超過兩個主鍵列,以確保性能寫入和查找。
更新時間序列特征表
當將特征寫入時間序列特征表時,你的DataFrame必須為特征表中的所有特征提供值,這與常規的特征表不同。此約束降低了時間序列特征表中跨時間戳的特征值的稀疏性。
fs=FeatureStoreClient()DataFrame包含以下列:# - user_id# - ts# - purchases_30d . ## - is_free_trial_activefs.write_table(“ads_team.user_features”,daily_users_batch_df,模式=“合並”)
支持流式寫入時間序列特征表。
創建一個帶有時間序列特征表的訓練集
若要對時間序列特征表中的特征值執行時間點查找,必須指定timestamp_lookup_key
在功能的FeatureLookup
,它指示包含時間戳的DataFrame列的名稱,要根據該列查找時間序列特征。Databricks Feature Store檢索DataFrame的時間戳之前的最新特征值timestamp_lookup_key
列,並且其主鍵與DataFrame中的值匹配lookup_key
列,或零
如果不存在這樣的特性值。
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數據幀包含以下列:# - u_id# - ad_id# - ad_印象派training_set=fs.create_training_set(raw_clickstream,feature_lookups=feature_lookups,exclude_columns=[“u_id”,“ad_id”,“ad_impression_ts”],標簽=“did_click”,)training_df=training_set.load_df()
任何FeatureLookup
在時間序列特征表上必須是一個時間點查找,因此它必須指定timestamp_lookup_key
列用於你的數據框架。時間點查找不會跳過零
存儲在時間序列特征表中的特征值。