การปรับ Feature ด้านเวลา
ตลอดคอร์สนี้เราได้พูดถึงอันตรายของการรั่วไหลของข้อมูล (data leakage) ที่อาจเกิดขึ้นระหว่างการ train โมเดล ปัญหานี้ทำให้โมเดลแสดงค่าความแม่นยำที่ดูดีเกินจริง แต่เมื่อนำข้อมูลจริงมาใช้งาน ผลลัพธ์มักไม่เป็นไปตามที่คาดหวัง
ในแบบฝึกหัดนี้ เราจะทำให้ DAYSONMARKET สะท้อนเฉพาะข้อมูลที่มีอยู่ ณ เวลาที่ทำการพยากรณ์ กล่าวคือ หากบ้านยังอยู่ในตลาด เราไม่ทราบว่าจะอยู่อีกกี่วัน จึงต้องปรับ test_df ให้สอดคล้องกับข้อมูลที่มีอยู่จริง ณ วันที่ 2017-12-10
หมายเหตุ: ตัวอย่างนี้จะใช้ฟังก์ชัน lit() ซึ่งใช้สำหรับส่งค่าเดี่ยวในกรณีที่ฟังก์ชันคาดหวังคอลัมน์ทั้งคอลัมน์
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Feature Engineering with PySpark
คำแนะนำการฝึกหัด
- Import ฟังก์ชันต่อไปนี้จาก
pyspark.sql.functionsเพื่อใช้งานในภายหลัง ได้แก่datediff(),to_date(),lit() - แปลง string วันที่ '2017-12-10' ให้เป็น date ของ PySpark โดยเรียก
lit()กับค่านั้นก่อน แล้วจึงเรียกto_date() - สร้าง
test_dfโดยกรองข้อมูลที่OFFMKTDATEมากกว่าหรือเท่ากับsplit_dateและLISTDATEน้อยกว่าหรือเท่ากับsplit_dateโดยใช้where() - แทนที่
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()