调整时间特征
在整个课程中,我们多次提到在训练过程中向模型泄露信息的风险。数据泄露会让模型在准确率等指标上看起来非常理想,但一旦用真实数据运行,结果往往令人失望。
在本练习中,我们要确保 DAYSONMARKET 只反映预测时点能够获得的信息。也就是说,如果房子仍在售,我们并不知道它还会在市场上停留多少天。因此需要调整 test_df,使其反映截至 2017-12-10 我们当前掌握的信息。
注意:本例将使用 lit() 函数。该函数用于在函数调用期望整列时传入单个值。
本练习是课程的一部分
使用 PySpark 进行特征工程
练习说明
- 从
pyspark.sql.functions导入以下函数以便后续使用:datediff()、to_date()、lit()。 - 先对日期字符串 '2017-12-10' 调用字面量函数
lit(),再调用to_date(),将其转换为 PySpark 日期类型。 - 使用
where()过滤创建test_df:筛选OFFMKTDATE大于等于split_date且LISTDATE小于等于split_date的记录。 - 用新计算的列替换
DAYSONMARKET:新列名为DAYSONMARKET,其值为split_date与LISTDATE的差值,使用datediff()完成日期差计算。使用提供的代码检查新列与原列。
交互式实操练习
通过完成这段示例代码来试试这个练习。
from pyspark.sql.functions import ____, ____, ____
split_date = ____(____('2017-12-10'))
# Create Sequential Test set
test_df = df.____(df[____] >= ____).____(df[____] <= ____)
# Create a copy of DAYSONMARKET to review later
test_df = test_df.withColumn('DAYSONMARKET_Original', test_df['DAYSONMARKET'])
# Recalculate DAYSONMARKET from what we know on our split date
test_df = test_df.withColumn(____, ____(____, ____))
# Review the difference
test_df[['LISTDATE', 'OFFMKTDATE', 'DAYSONMARKET_Original', 'DAYSONMARKET']].show()