Fraud Detection : EP 2 เทคนิคการทำ Feature Selection

Phiratath Nopratanawong
SiamFriends
Published in
3 min readOct 25, 2019

โมเดลไม่สามารถกรอง Feature ด้วยตัวมันเองได้เสมอไป

ในการแข่งนี้ผู้จัดงานแข่งได้ให้ Columns ใน Data 393 Columns แถมยังมีบาง columns ที่เป็น Engineered Feature มาก่อน นอกจากนี้ยังมีหลาย Columns ที่ correlate กันอย่างมากและแถมหน้าตา distribution ใน Train กับ Test data ยังต่างกันอีกทำให้เราต้องทำการ Feature Selection ซึ่งผมจะอธิบายเทคนิคต่าง ๆ ที่คนนิยมใช้กันในการแข่งนี้นะครับ

ทำไมถึงต้องทำ Feature Selection

สาเหตุผลหลัก ๆ ที่ทำ Feature Selection ผมขอแบ่งออกเป็นสองส่วนคือ

1) เพื่อประสิทธิภาพของ Model เช่น Forward and Backward Elimination ,Permutation Feature Importance, Recursive Feature Elimination เป็นต้น

2) เพื่อเลือก Feature ที่ใช้งานได้ใน Test data เช่น Adversarial Validation, Consistency

หลายคนอาจจะคิดว่าให้สร้าง Feature มาเยอะ ๆ ก่อนจากนั้นก็โยนเข้า Model เดี๋ยว Model ก็คงจะเลือกเองว่า Feature ไหนสำคัญซึ่งก็จริงส่วนหนึ่งแต่เราต้องทำความเข้าใจโมเดลที่เราจะใช้ก่อน ซึ่งในที่นี้โมเดลของผมเป็นโมเดลประเภท Gradient Boosting Tree ซึ่งเป็น Greedy Algorithm

รูปประกอบ Greedy Algorithm ( https://www.techopedia.com/definition/16931/greedy-algorithm)

Greedy Algorithm จะเลือกทางที่ง่ายและตรงตามจุดประสงค์เราที่สุดเช่นจากรูปเราต้องการให้ผลรวมตามเส้นทางที่เลือกมีค่ามากที่สุดซึ่งก็คือทางสีส้ม แต่ Greedy Algorithm จะเลือกตามทางสีน้ำเงินซึ่งในระดับแรกมาค่ามากที่สุดซึ่งคือ 28 แทนที่จะเป็น 12 ส่งผลให้เราอาจไม่ได้ค่าที่มากที่สุด ภาษาบ้าน ๆ Greedy Algorithm จะเลือกแต่ทางที่สบาย ๆ ง่าย ๆ โดยไม่ได้ดูหนทางที่เป็นไปได้ทั้งหมด

ซึ่ง Gradient Boosting Tree (GBT) หรือ Tree model อื่น ๆ ก็ทำเช่นกันคือ GBT จะเลือก Feature ที่แบ่ง Target ได้ดีที่สุดออกมาก่อนซึ่งจริง ๆ แล้วอาจมีบาง Feature ที่จะทำงานได้ดีเมื่อมาอยู่รวมกันแต่กลับถูก Feature อื่น ๆ บดบังจนหมด นอกจากนี้ยังมีปัญหา Over-fitting อีก เมื่อเรามี Feature ที่มากเกินไปทำให้เราสามารถจะแบ่ง Data ได้แทบทุกจุด นับเป็นอีกจุดอ่อนร้ายแรงของ GBT

ปัญหาอีกอย่างคือเมื่อ Train กับ Test มีหน้าตาไม่เหมือนกันหรือไม่มีความ Consistency ทำให้ Model ที่ทำงานได้ดีใน Train แต่กลับทำงานได้ไม่ดีใน Test

ตัวอย่าง Column ที่ไม่มีความ Consistency สีน้ำเงินคือ Train ส้ม คือ Test

วิธีการตรวจสอบก็ง่ายและตรงไปตรงมาคือให้ทำ model มาตรวจโดยให้ Target = 1 เมื่อเป็น Data จาก Test และ 0 เมื่อเป็น Data จาก Train ทำให้เราทราบว่า Feature ไหนสามารถแยก Train ออกจาก Test ได้ดี (หน้าตาต่างกันมาก) นั้นเอง

ตัวอย่าง Feature Importance จากการทำ model ใน ลิงค์ด้านล่าง

อีกวิธีก็ง่ายกว่าคือไม่ต้องทำ Model แต่แค่ใช้ ค่า ROC score ( Area Under the Receiver Operating Characteristic Curve ) มาตรวจโดยให้ Target = 1 เมื่อเป็น Data จาก Test และ 0 เมื่อเป็น Data จาก Train โดย ROC score จะคำนวนโดยแค่ว่า ลำดับของ Feature ที่เราสนใจเป็นยังไงกล่าวคือ ถ้าได้ค่า = 0.5 คือ Data มีการกระจายตัวที่ดีมากแต่ถ้าได้ ค่า น้อยกว่า 0.4 หรือมากกว่า 0.6 ก็แสดงว่า Data กระจายตัวได้ไม่ดีเพราะแค่เอา Feature มาเรียงลำดับก็สามารถบอกได้แล้วว่าอันไหนเป็น Train หรือ Test

ตัวอย่างเช่น ให้ y_scores แทน ค่าจาก Columns ที่เราจะทำการตรวจสอบ

ตัวอย่างที่แสดงว่า Test กับ Train มีหน้าตาคล้ายกันทำให้ ROC score เข้าใกล้ 0.5

ถ้าเราลองให้ Test กับ Train หน้าตาต่างกันล่ะ

ทำการบวก 0.1 ให้กับตัว Target = 1

จะเห็นว่าค่า ROC score มีค่ามากขึ้นเพราะลำดับของ y_scores เปลี่ยนไปนั้นเอง

หากเราเจอ feature ที่มีคุณสมบัติแยกชุดข้อมูล train กับ test ได้ดีก็ควรที่จะนำออกไปจากโมเดลนั่นเอง

ซึ่งในการแข่งนี้ผมได้ทำ Adversarial Validation และ Forward and Backward Elimination แต่ในส่วนของ Permutation Feature Importance และ Recursive Feature Elimination ผมไม่ได้ทำเนื่องด้วยเหตุผลเพราะ RAM ไม่พอและกินเวลานานมากถ้าใครจะทำผมแนะนำให้สุ่ม Data มาส่วนหนึ่งก็พอ แต่แค่การทำ Feature Selection ที่กล่าวมาก็เพียงพอที่จะทำให้ Model ผมไม่เกิดปัญหา Over-fitting และทำให้ลำดับผมไม่ตกมากในการแข่งครั้งนี้

ในระหว่างการแข่งขัน เราจะเห็น Score ที่คิดจาก test set เพียง 20% ส่วนอีก 80% จะเปิดเผยเมื่อการแข่งขันจบลง และนำมาคำนวนเพื่อหาผู้ชนะ

จะเห็นว่าอันดับมีการเปลี่ยนแปลงมากมีทั้งคนขึ้นมาถึง 1000 อันดับ
Scatter plot ของ Ranking X = Rank ใน Public Y = Rank ใน Private (https://www.kaggle.com/c/ieee-fraud-detection/discussion/111670#latest-644413)

ถ้าเรามองตามแกน X จะเห็นว่าอันดับของคนส่วนใหญ่นั้นมีการตกลงอย่างมากซึ่งเกิดจากการ over-fitting

หลังจากที่เราพูดถึง feature engineering กันแล้วขั้นตอนต่อไปคือการนำข้อมูลที่เราเตรียมไป train โมเดลนั่นเอง

--

--