Random Forest โมเดลที่ใช้งานง่ายจากประสบการณ์การทำงานและการแข่งขัน Kaggle

Phiratath Nopratanawong
KBTG Life
Published in
4 min readJan 14, 2021

สำหรับผู้เริ่มต้น สามารถอ่านเกี่ยวกับ Tree-based Algorithm ได้จากบทความนี้

ในหลายครั้งที่ได้รับโจทย์ โมเดลที่คนนิยมเลือกอันดับต้นๆ คงหนีไม่พ้น Random Forest สืบเนื่องจากความใช้งานง่ายและ Overfit ยาก ซึ่งเมื่อเราเข้าใจหลักการทำงานของ Random Forest แล้ว จะไม่แปลกใจเลยว่าทำไมจึงเป็นเช่นนั้น

หลักการทำงาน

Random Forest คือการรวมกันของ Decision Tree หลายต้น การทำงานภายในจะไม่ต่างกับ Decision Tree สักเท่าไหร่นัก แต่สิ่งที่ต่างจะเป็นรูปร่างของ Data ที่ถูกป้อนเข้าไปในแต่ละ Decision Tree ทำให้ตัว Decision Tree มีหน้าตาแตกต่างกันออกไป ดังนั้นต่อให้เราส่ง Sample เดียวกันเข้าไป ก็ไม่จำเป็นว่า Decision Tree ใน Random Forest จะส่งคำตอบเดียวกันออกมา

สำหรับการทำงานของ Random Forest จะมีการสุ่มอยู่ 2 แบบ คือ

  1. การสุ่ม Sample (Bootstrapping)
  2. การสุ่ม Feature

การสุ่มพวกนี้ทำให้ Random Forest เกิดการ Overfit ยากมากๆ เพราะ Tree แต่ละต้นจะเห็น Data ไม่เหมือนกัน

เริ่มด้วยการสุ่ม Sample จะเป็นการสุ่มแบบใส่คืน เพื่อเพิ่มโอกาสให้ตัว Sample ที่มีจำนวนน้อยๆ ได้ปรากฏใน Tree บางต้น ซึ่งโดยเฉลี่ยแล้วแต่ละต้นจะมี Sample ที่ไม่ปรากฏออกมาถึง 1/3 ของ Sample ทั้งหมด เศษส่วนดังกล่าวจะถูกเติมเต็มด้วยการปรากฏซ้ำของ Sample ตัวอื่นๆ อาจเป็น Sample ประเภทที่มีอยู่น้อยจนไม่ได้แสดงบทบาทในการสร้าง Tree แบบปกติ แต่พอมีการสุ่มหยิบ Sample ประเภทนี้มากๆ เข้า ก็จะแสดงบทบาทได้มากขึ้นจนทำให้รูปร่างหน้าตา Tree ต้นนั้นแตกต่างจากต้นอื่นๆ และลดการ Overfit ลง

ยกตัวอย่างเช่น ถ้าเรามี Sample ทั้งหมด 3,000 ตัว Random Forest จะทำการสุ่มทั้งสิ้น 3,000 ครั้งแบบใส่คืน สุดท้าย Tree ของเราจะเห็น Sample ทั้ง 3,000 ตัว แต่ Sample เหล่านี้จะไม่เหมือนตัวตั้งต้น เพราะอาจมีบางตัวไม่ปรากฏ หรือมีบางตัวปรากฏซ้ำ โดยเราสามารถคำนวณได้จากสูตรต่อไปนี้

ให้ N แทนจำนวน Sample ทั้งหมด โอกาสที่ Sample ตัวนั้นจะไม่ออกมาคือ…

และเมื่อเราทำการสุ่มไป N รอบจะได้ว่า

และเมื่อมี N มากๆ จะทำให้ค่านี้เข้าใกล้ 1/e = 36.7% หรือราวๆ 1/3

ส่วนการสุ่ม Feature นั้น ถ้าให้อธิบายว่าทำไมการสุ่มหรือการที่ Decision Tree มีรูปร่างที่ต่างกันถึงช่วยให้โมเดลของเราทำงานได้ดีขึ้น ขอให้ผู้อ่านลองนึกถึงป่าที่มีต้นไม้แค่ประเภทเดียว วันดีคืนดีเกิดเหตุร้ายขึ้น ไม่ว่าจะเป็นโรคระบาดหรือฝูงแมลงรุกราน กลายเป็นว่าต้นไม้เราล้มตายหมด กรณีนี้เหมือนกับการที่โมเดลเราพึ่งพา Feature เพียงไม่กี่ตัวในการทำงาน พอไปใช้งานจริงแล้วดันเจอ Data ส่วนน้อยที่ตอน Training เราอาจมองว่าเป็น Noise แต่ภายหลังกลับเพิ่มจำนวนมากขึ้น จนทำให้โมเดลของเราไม่สามารถทำงานได้อย่างมีประสิทธิภาพ Noise ที่ว่าเปรียบเสมือนแมลงหรือโรคระบาดนั่นเอง หากเรามีต้นไม้เพียงประเภทเดียว โมเดลก็จะทำงานได้แย่ลง

ในส่วนของ Parameter หลักๆ เราจะให้ความสนใจกับ…

  1. n_estimators จำนวน Tree ที่จะใช้
  2. min_samples_leaf จำนวนของ Sample ที่น้อยที่สุดที่จะมีได้ในแต่ละใบ
  3. max_featuresจำนวน Feature สูงสุดในแต่ละ Tree
  4. max_depth ระดับความลึกของ Tree

นอกจาก min_samples_leaf และ max_depth ที่เป็นตัวแปรพื้นฐานของ Decision Tree แล้ว สิ่งที่พิเศษขึ้นมาสำหรับ Random Forest จะมี Max Feature ที่เกี่ยวข้องกับการสุ่ม และ n_estimators หรือจำนวน Tree ที่แต่ละต้นจะไม่ส่งผลต่อกัน ดังนั้นถึงมีต้นไม้มากขึ้นก็ไม่ได้ทำให้ Overfit แต่อย่างใด ต่างจาก Boosting โดยสิ้นเชิง ด้วยคุณสมบัตินี้เองจึงทำให้การ Overfit ใน Random Forest เป็นเรื่องยาก

นอกจากนี้ Random Forest ยังมี OOB Score (Out-of-bag Score) คือการนำ Sample ที่ไม่ได้ใช้งานใน Tree แต่ละต้นมา Validate ตัว Tree เอง นับว่ามีประโยชน์มากในการพิจารณาโมเดลเมื่อเรามี Sample น้อยจนไม่สามารถแยก Test-Train-Validation ได้

และทำไมเราจึงต้องเลือก Max Feature? เหตุผลคือเพื่อควบคุมไม่ให้มี Feature อันใดอันหนึ่งแสดงผลมากเกินไปในแต่ละ Tree เปิดโอกาสให้ Feature อื่นได้แสดงผลออกมาบ้างเพื่อลดการ Overfit ยิ่งลดค่านี้ได้มากเท่าไหร่ จะยิ่งเปิดโอกาสให้ Feature อื่นๆ ร่วมแสดงผลมากเท่านั้น

Decision Tree ที่มี Depth ต่างๆ กัน
ตัวอย่างการตัดสินใจของ Random Forest (ref: https://jakevdp.github.io/PythonDataScienceHandbook/05.08-random-forests.html)
ตัวอย่าง Random Forest ที่มี Depth น้อย ๆ Over-Regularized Random Forest (ref: https://www.kaggle.com/general/76963)

ประสิทธิภาพของ Random Forest จากประสบการณ์

จากการที่ผู้เขียนได้มีโอกาสนำ Random Forest ไปใช้ในการทำงานและการแข่งขันหลายรายการ ขอหยิบ 2 รายการสำคัญๆ ที่ Random Forest ได้แสดงประสิทธิภาพอย่างยอดเยี่ยมมาฝากกันครับ

  1. อันดับ 244 จาก 6381 (ref)
  2. อันดับ 19 จาก 354 (ref)

โดยในการแข่งขัน Shopee นั้น ผู้เขียนสามารถคว้าระดับต้นๆ ในการแข่งขันมาได้จากการใช้ Random Forest เพียงแค่โมเดลเดียว

Private Score ไม่ต่างกับ Public Score มากนัก แสดงถึงการไม่ Overfit
ระดับการแข่งขันที่มากขึ้นถึง 31 อันดับ แสดงให้เห็นว่าผู้เข้าแข่งขันคนอื่นๆ มีการ Overfit

ตัวอย่างการใช้งาน

ตัวอย่าง Notebook ที่ใช้งาน Random Forest

การใช้งาน Random Forest หลักๆ คือการเตรียมข้อมูลครับ เงื่อนไขคือทุก Columns ต้องเป็นตัวเลข ห้ามมี String มิเช่นนั้น Random Forest จะทำงานไม่ได้ เราจึงต้องทำการเปลี่ยน Column ที่เป็น String ให้กลายเป็นตัวเลขเสียก่อน ในตัวอย่าง Notebook ที่ผู้เขียนยกมาได้ใช้ Label Encoder ทำการ Map String เป็นตัวเลขตรงๆ โดยปราศจากนัยสำคัญ เช่น ‘แมว’ -> 1, ‘หมา’ -> 2 โดยที่ไม่มีเหตุผลรองรับว่าทำไมหมาต้องเป็น 2 และแมวต้องเป็น 1 เป็นการแปลงที่ง่ายที่สุดเหมาะแก่การใช้เป็น Baseline

ตัวอย่างการทำ Label Encoder ใน Notebook

เมื่อเราเตรียม Data เสร็จแล้ว เราจะสามารถนำไปเทรนโมเดลได้

การประกาศโมเดล Random Forest

ในส่วนของการเลือก Hyperparameter ผู้เขียนแนะนำให้ใช้ Grid Search แบบง่ายๆ ไม่ต้องใส่ค่าเยอะมาก เพราะจะเสียเวลาในการ Run จริงๆ แล้วส่วนตัวไม่แนะนำให้ใส่ใจกับ Haperparameter เท่าไหร่ เนื่องจากเป็นส่วนที่ Automate ได้และไม่ค่อยช่วยให้ Score เพิ่มขึ้นมากนัก

Feature Selection

ตัวอย่างการเลือก Feature ด้วย Correlation (ref: https://chrisalbon.com/machine_learning/feature_selection/drop_highly_correlated_features/)

ถ้าผู้อ่านเข้าใจหลักการทำงานของ Random Forest แล้ว การเลือก Feature โดยการใช้ Correlation จะช่วยให้ต้นไม้ของเรามีความหลากหลายมากขึ้น เช่น ในกรณีที่เราใส่ Max Features ไปน้อยๆ แต่ถ้า Feature เรามีความ Correlate มากก็จะไม่ช่วยให้ป่าของเราหลากหลายขึ้น เราจึงต้องทำการเลือกทิ้ง Feature ที่มีความ Correlate ออกไปเสียก่อน

สำหรับการเลือกประเภทของ Correlation ผู้เขียนขอแนะนำว่าถ้าใช้โมเดลประเภท Tree ให้เลือกใช้ ‘Spearman’ แทนที่จะเป็น ‘Pearson’ เพราะว่าในการทำงานของ Tree โมเดลของเราจะไม่สนใจค่าจริงๆ ของข้อมูลสักเท่าไหร่ แต่จะสนใจลำดับหรือ Ranking ของข้อมูลเสียมากกว่า (เลือกแค่ค่ามากกว่าหรือน้อยกว่าค่านี้ในตอนตัดสินใจ) ดังนั้นการเลือกโดยใช้ Spearman Correlation จะตอบโจทย์มากที่สุดเพราะเป็นการเทียบ Correlation จาก Ranking ไม่ใช่จากค่าตรงๆ

ตัวอย่าง Spearman vs Pearson Correlation
ตัวอย่าง Spearman Correlation = 1

ถ้าผู้อ่านสนใจการทำงานของโมเดลประเภท Tree ให้ลองศึกษาต่อที่บทความนี้ได้ครับ

หลังจากที่ผู้เขียนได้ทำการ Feature Selection ด้วยวิธีข้างต้น สามารถช่วยให้โมเดลใน Notebook ที่ยกตัวอย่างมานั้นทำงานได้ดีขึ้นจาก 0.905 เป็น 0.910 ซึ่งถือว่ามีนัยสำคัญมากในการแข่งขัน

การใช้วิธีเลือก Feature ด้วยวิธีที่นี้สามารถนำไปใช้งานกับ LightGBM, Xgboost หรือโมเดล Tree ประเภทอื่นๆ ได้ แนะนำผู้อ่านให้ลองไปทำการทดลองใน Notebook Kaggle ถือเป็นการเรียนรู้ที่ดีเลยทีเดียว

ท้ายสุดนี้ผู้เขียนขอบอกว่า Random Forest นับเป็นโมเดลที่เป็น Baseline ที่ดี เพราะสามารถทดสอบได้เร็วและเรียบง่ายไม่ต้องกลัว Overfit แต่เราควรเข้าใจเหตุผลเบื้องหลังด้วยว่าทำไมถึง Overfit ยาก หลักการทำงานคืออะไร เพื่อให้เราสามารถพัฒนาการทำงานของโมเดลได้ดียิ่งขึ้น

Keep Learning and Don’t Overfit !

สำหรับชาวเทคคนไหนที่สนใจเรื่องราวดีๆ แบบนี้ หรืออยากเรียนรู้เกี่ยวกับ Product ใหม่ๆ ของ KBTG สามารถติดตามรายละเอียดกันได้ที่เว็บไซต์ www.kbtg.tech

--

--