创建时间切分
在视频中,您已经了解到,为时间序列随机划分数据是有风险的,因为来自未来的数据会让模型过拟合。时间序列场景下,您通常会在有新数据时获取并希望用最新数据重新训练模型。视频里我们演示了如何按比例划分训练集和测试集。但假设您希望用除最后 45 天之外的所有可用数据来训练,并将最后 45 天的数据作为测试集。
在本练习中,我们将编写一个函数来找到切分日期:使用最后 45 天的数据做测试,剩余数据做训练。请注意,标准 python 库 datetime 中的 timedelta() 已为您导入。
本练习是课程的一部分
使用 PySpark 进行特征工程
练习说明
- 创建函数
train_test_split_date(),其入参为数据框df、用于切分的日期列split_col,以及测试集天数test_days,并将test_days的默认值设为 45。 - 使用
,()查找split_col的min和max日期。 - 使用
max_date并通过timedelta()(接收days参数,此处传入test_days)减去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)