บันทึก training data science EP 8: Ensemble – Avenger's ensemble
ตอนก่อนหน้า: บันทึก training data science EP 7: Metrics – สินค้าที่ผ่าน QC
ที่ผ่านๆ มา เราใช้ model หนึ่งตัว ระบุ features (columns) พร้อม parameters หนึ่งชุด เพื่อวิเคราะห์และคาดการณ์ผลลัพท์
และล่าสุด EP 7 เราได้ใช้ model selection เพื่อเฟ้นหา parameter หนึ่งชุดที่จะทำให้ model หนึ่งตัวให้ผลลัพท์ที่ดีที่สุดบน Features หนึ่งชุดที่เรากำหนดขึ้นมา
คำถามคือ ถ้าเรามี features หลายตัว ซึ่งเราไม่รู้ว่าเราต้องการตัวไหน แต่ผลลัพท์คือ model หนึ่งตัวที่ต้องตัดสินใจบน features เหล่านั้น เราจะทำอย่างไร
Ensemble
Ensemble เป็น class นึงที่อยู่ใน scikit-learn ฮะ มันมีความสามารถในการใช้ algorithm หลายๆ ตัวบน features ต่างๆ กันเพื่อให้ได้ผลลัพท์ที่ดีที่สุดฮะ (หรืออีกความหมายนึง คือ ใช้ estimator ร่วมกันหลายตัวแทนที่จะใช้แค่ตัวเดียว)
ตัวอย่างเช่น เราอยากรู้ราคาบ้านแถวใจกลางเมือง แต่ว่าข้อมูลที่เราหามานั้นมีหลายมิติมาก ไม่ว่าจะเป็นพิกัดเอย ขนาดบ้านเอย ราคาที่ดินแถวนั้น จำนวนชั้น จำนวนห้อง เรตติ้งจากเว็บอื่น และอีกมากมาย เราไม่สามารถเลือกได้ว่าจะหยิบมิติไหนดีมาเป็น features ป้อนให้ estimator และนี่แหละคือเหตุผลการคงอยู่ของ Ensemble ฮะ
Ensemble ในครั้งนี้จะเป็น Bagging และ Random Forest แหละฮะ
Bagging
Bagging ย่อมาจาก Bootstrap Aggregating คือ การสร้าง estimator ต่างๆ กัน จากการสุ่มข้อมูลตั้งต้นขึ้นมา โดยเลือกเอา features ทุกตัวมาคำนวณ โดย parameter ของ Bagging เนี่ย หลักๆ ที่ผมเคยใช้ ได้แก่
base_estimator
ระบุ estimator ตั้งต้นของเราฮะ โดยค่าเริ่มต้นจะเป็น Decision Treen_estimators
ระบุจำนวน estimator ที่จะสร้างต่างๆ กัน ค่าเริ่มต้นคือ 10max_samples
ระบุจำนวนข้อมูลตั้งต้นที่จะสุ่มขึ้นมา เป็น subset นั่นเองว่าจะสุ่มหยิบมากี่ค่าเพื่อ train
จากนั้นก็ .fit()
และ .predict()
สุดท้ายก็ดูผลประกอบการฮะ ว่ามันดีแย่แค่ไหน

ข้างบน เราได้ import sklearn.ensemble
มาก่อน แล้วสร้าง BaggingRegressor()
ที่ข้างในมี DecisionTreeRegressor()
อีกทีนึง กำหนดค่า n_estimators
เป็น 5 และ max_samples
เป็น 25 พอลอง predict ดูแล้วพบว่ามีค่า MedAE อยู่ที่ 65,667

เราลองสร้างมาอีกสามตัว กำหนดค่า n_estimators
และ max_samples
ต่างๆ กัน ก็พบว่า อันแรกดีที่สุดฮะ

ไหนๆ เราก็ผ่าน GridSearchCV()
มาแล้ว ก็ใช้มัน brute force หา parameter ที่ดีกว่าแล้วกันฮะ เราก็แค่ใส่ estimator เหมือนกับสี่ตัวอย่างข้างบน แล้วระบุ parameter set, scoring และค่า cv ฮะ

เมื่อคำนวณ MedAE มีค่าเพียง 63,443 น้อยกว่า estimator ตัวแรกอีกฮะ แปลว่าเราเจอ estimator นี้แหละที่พอใช้งานต่อได้ และ estimator ตัวนี้ใช้ไป 16 features จากข้อมูลเดิมที่มี 44 features ฮะ
Reference link:
- https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingRegressor.html
- https://towardsdatascience.com/ensemble-methods-in-machine-learning-what-are-they-and-why-use-them-68ec3f9fef5f
Random Forest
นอกจาก Bagging ก็ยังมี Random Forest ที่ต่างกันตรงที่ Random Forest จะเลือกเอา Features บางตัวมาคำนวณฮะ
สำหรับ Random Forest เราไม่ต้องใส่ base_estimator
นะฮะ เพราะตัวมันเองพัฒนามาจาก Decision tree อยู่แล้ว เราก็แค่ใส่ parameter แบบเดียวกันกับ Decision tree ไป แล้วก็ .fit()
และ .predict()
มันฮะ

และกลายเป็นว่า เมื่อใช้ GridSearchCV()
เราได้สร้าง Estimator จาก Random Forest ที่มี MedAE น้อยกว่า Bagging ตะกี้อีกแน่ะ คือมีแค่ 14,334 อันนี้ดีกว่าฮะ โดยมันใช้ไป 17 features
Reference link:
- https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
- https://stats.stackexchange.com/questions/264129/what-is-the-difference-between-bagging-and-random-forest-if-only-one-explanatory
สำหรับตอนนี้ ต้องสารภาพว่า ตัวผมเองต้องฝึกใช้งานมันเยอะหน่อยฮะ ส่วนตัวค่อนข้างเข้าใจมันไม่ละเอียดเท่าไหร่
เรื่องหน้าจะเป็นอะไร จะมาเหลาให้อ่านกันฮะ
บาย
ตอนต่อไป: บันทึก training data science EP 9: NetworkX – แผนที่ตัวกวน(ใจ) ที่ไม่ได้อยู่ในฮอกวอตส์