開始使用免費開始

建立時間切分

在影片中,我們學到對時間序列隨機切分可能很危險,因為來自未來的資料會讓模型過度擬合。時間序列常見的情況是資料隨時間陸續新增,你會想用最新資料重新訓練模型。影片示範了以比例切分訓練集與測試集,但假設你想用除最後 45 天以外的所有可用資料來訓練,並把最後 45 天當作測試集。

在這個練習中,我們會建立一個函式來找出切分日期,讓最後 45 天的資料用於測試,其餘用於訓練。請注意,timedelta() 已經替你從標準 python 函式庫 datetime 匯入。

本練習屬於課程

使用 PySpark 進行特徵工程

檢視課程

練習說明

  • 建立函式 train_test_split_date(),參數包含資料框 df、用來切分的日期欄位 split_col,以及測試集使用的天數 test_days,並將其預設值設為 45。
  • 使用 ,() 找出 split_colminmax 日期。
  • 使用 max_date 減去 test_days 來找到測試與訓練的切分日期,做法是使用接受 days 參數的 timedelta(),此處傳入 test_days
  • OFFMKTDATE 作為 split_col,找出 split_date,並用它將資料框過濾成 train_dftest_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) 
編輯並執行程式碼