建立時間切分
在影片中,我們學到對時間序列隨機切分可能很危險,因為來自未來的資料會讓模型過度擬合。時間序列常見的情況是資料隨時間陸續新增,你會想用最新資料重新訓練模型。影片示範了以比例切分訓練集與測試集,但假設你想用除最後 45 天以外的所有可用資料來訓練,並把最後 45 天當作測試集。
在這個練習中,我們會建立一個函式來找出切分日期,讓最後 45 天的資料用於測試,其餘用於訓練。請注意,timedelta() 已經替你從標準 python 函式庫 datetime 匯入。
本練習屬於課程
使用 PySpark 進行特徵工程
練習說明
- 建立函式
train_test_split_date(),參數包含資料框df、用來切分的日期欄位split_col,以及測試集使用的天數test_days,並將其預設值設為 45。 - 使用
,()找出split_col的min與max日期。 - 使用
max_date減去test_days來找到測試與訓練的切分日期,做法是使用接受days參數的timedelta(),此處傳入test_days。 - 以
OFFMKTDATE作為split_col,找出split_date,並用它將資料框過濾成train_df與test_df兩個新資料框,其中test_df只包含最後 45 天的資料。另請確保test_df只包含在切分日以前已經上架的房屋,方法是過濾df['LISTDATE']小於或等於split_date。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
def train_test_split_date(df, split_col, test_days=____):
"""Calculate the date to split test and training sets"""
# Find how many days our data spans
max_date = df.____({____: ____}).collect()[0][0]
min_date = df.____({____: ____}).collect()[0][0]
# Subtract an integer number of days from the last date in dataset
split_date = ____ - timedelta(days=____)
return split_date
# Find the date to use in spitting test and train
split_date = train_test_split_date(df, ____)
# Create Sequential Test and Training Sets
____ = df.where(df[____] < split_date)
____ = df.where(df[____] >= split_date).where(df[____] <= split_date)