การแบ่งข้อมูลตามเวลา
จากวิดีโอ เราได้เรียนรู้ว่าการแบ่งข้อมูลแบบสุ่มอาจเป็นอันตรายสำหรับข้อมูลอนุกรมเวลา เนื่องจากข้อมูลในอนาคตอาจทำให้โมเดลเกิด overfitting ได้ โดยทั่วไปแล้ว เมื่อมีข้อมูลอนุกรมเวลา คุณจะได้รับข้อมูลใหม่เมื่อพร้อมใช้งาน และอาจต้องการเทรนโมเดลใหม่โดยใช้ข้อมูลล่าสุด ในวิดีโอ เราได้แสดงวิธีแบ่งชุดทดสอบและชุดฝึกสอนแบบเปอร์เซ็นต์ แต่สมมติว่าต้องการเทรนโมเดลด้วยข้อมูลทั้งหมดที่มี ยกเว้น 45 วันสุดท้ายที่จะใช้เป็นชุดทดสอบ
ในแบบฝึกหัดนี้ เราจะสร้างฟังก์ชันเพื่อหาวันที่แบ่งข้อมูล โดยใช้ข้อมูล 45 วันสุดท้ายสำหรับการทดสอบ และข้อมูลที่เหลือสำหรับการฝึกสอน โปรดทราบว่า timedelta() ได้ถูก import ไว้แล้วจากไลบรารีมาตรฐาน datetime ของ python
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Feature Engineering with PySpark
คำแนะนำการฝึกหัด
- สร้างฟังก์ชัน
train_test_split_date()ที่รับ dataframe ชื่อdf, คอลัมน์วันที่ที่ใช้แบ่งข้อมูลsplit_colและจำนวนวันที่ใช้สำหรับชุดทดสอบtest_daysพร้อมกำหนดค่าเริ่มต้นเป็น 45 - หาวันที่
minและmaxของsplit_colโดยใช้,() - หาวันที่สำหรับแบ่งชุดทดสอบและชุดฝึกสอน โดยใช้
max_dateแล้วลบtest_daysออกด้วยtimedelta()ซึ่งรับพารามิเตอร์daysโดยในกรณีนี้ให้ส่งtest_daysเข้าไป - ใช้
OFFMKTDATEเป็นsplit_colเพื่อหาsplit_dateแล้วใช้ค่านั้นกรอง dataframe ออกเป็นสอง dataframe ใหม่ คือ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)