การลบคอลัมน์ที่มีจำนวนการสังเกตน้อย
หลังจาก feature engineering อย่างเต็มที่แล้ว ควรหยุดทบทวนสิ่งที่สร้างขึ้นมาสักครู่ หากใช้เทคนิคอัตโนมัติกับ categorical feature เช่น การ explode หรือ OneHot Encoding อาจพบว่าตอนนี้มี binary feature ใหม่เพิ่มมาหลายร้อยตัว แม้ว่าหัวข้อการคัดเลือกฟีเจอร์ (feature selection) จะเป็นเนื้อหาของอีกคอร์สหนึ่ง แต่ก็มีขั้นตอนง่าย ๆ ที่ทำได้เพื่อลดมิติของชุดข้อมูล
ในแบบฝึกหัดนี้ จะลบคอลัมน์ที่มีจำนวนการสังเกต (observations) น้อยกว่า 30 รายการ โดย 30 คือจำนวนขั้นต่ำทั่วไปสำหรับนัยสำคัญทางสถิติ หากน้อยกว่านั้น ความสัมพันธ์ที่พบอาจเกิดจากความบังเอิญล้วน ๆ ซึ่งนำไปสู่ปัญหา overfitting ได้
หมายเหตุ: ข้อมูลพร้อมใช้งานใน dataframe df
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Feature Engineering with PySpark
คำแนะนำการฝึกหัด
- ใช้ลูป
forที่เตรียมไว้ซึ่งวนซ้ำผ่านรายการของ binary column คำนวณsumของค่าในคอลัมน์โดยใช้ฟังก์ชันaggจากนั้นใช้collect()เพื่อรันการคำนวณทันที และบันทึกผลลัพธ์ไว้ในobs_count - เปรียบเทียบ
obs_countกับobs_thresholdโดยคำสั่งifควรเป็นจริงเมื่อobs_countมีค่าน้อยกว่าหรือเท่ากับobs_threshold - ลบคอลัมน์ที่ถูกเพิ่มเข้าไปในลิสต์
cols_to_removeโดยใช้drop()และอย่าลืมว่า*ช่วยให้ unpack ลิสต์ได้ - แสดงขนาดก่อนและหลังของ PySpark dataframe โดยใช้
count()สำหรับจำนวนแถว และlen()กับdf.columnsหรือnew_df.columnsเพื่อหาจำนวนคอลัมน์
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
obs_threshold = 30
cols_to_remove = list()
# Inspect first 10 binary columns in list
for col in binary_cols[0:10]:
# Count the number of 1 values in the binary column
obs_count = df.____({col: ____}).____()[0][0]
# If less than our observation threshold, remove
if ____ ____ ____:
cols_to_remove.append(col)
# Drop columns and print starting and ending dataframe shapes
new_df = df.____(*____)
print('Rows: ' + str(df.____()) + ' Columns: ' + str(____(df.____)))
print('Rows: ' + str(new_df.____()) + ' Columns: ' + str(____(new_df.____)))