หัวใจหลักของ Gradient Boosting
- Loss Function
Loss Function เป็นตัวชี้วัดข้อผิดพลาดระหว่างค่าที่โมเดลทำนาย และค่าจริง ซึ่ง Gradient Boosting จะพยายามลดค่าของ Loss Function ในแต่ละรอบของการฝึก (training) โดยการเพิ่มโมเดลย่อยเข้ามาช่วยปรับปรุงผลลัพธ์ให้แม่นยำยิ่งขึ้น
Gradient Boosting จะใช้ Gradient Descent ในการคำนวณค่า Gradient ของ Loss Function เพื่ออัปเดตโมเดลให้ดีขึ้นในแต่ละรอบ - Weak Learners
Weak Learners เป็นโมเดลพื้นฐานที่ Gradient Boosting ใช้เพื่อเรียนรู้ข้อผิดพลาดหรือ Residuals ของโมเดลก่อนหน้า โดยใน Gradient Boosting มักใช้ Decision Tree ขนาดเล็กที่มีความลึกจำกัด (เช่น 1-3 ระดับ) เพื่อเป็น Weak Learners
คุณสมบัติของ Weak Learners:- เป็นโมเดลง่ายๆ ที่มีการเรียนรู้แบบ Greedy Algorithm เพื่อแบ่งข้อมูลตามคุณลักษณะ (features) ที่เหมาะสมที่สุด
- มีข้อได้เปรียบในการจัดการกับข้อมูลที่ไม่เป็นเชิงเส้น (Non-linear relationships)
- โมเดลต้นไม้ขนาดเล็กช่วยลดการ overfitting และเพิ่มความสามารถในการ generalize
- Additive Model
Additive Model คือกระบวนการรวมโมเดลย่อยที่สร้างขึ้นในแต่ละรอบเข้าด้วยกันอย่างต่อเนื่อง โดยผลลัพธ์ของโมเดลสุดท้ายจะเป็นการรวมผลลัพธ์จากโมเดลย่อยทั้งหมด- การรวมโมเดลแบบ Additive นี้ช่วยให้ Gradient Boosting ค่อยๆ ปรับค่าทำนายให้เข้าใกล้ค่าจริงมากขึ้น โดยไม่ปรับเปลี่ยนแบบก้าวกระโดด
Loss Function: ใช้เพื่อคำนวณข้อผิดพลาดระหว่างค่าจริงกับค่าทำนาย และช่วยกำหนดทิศทาง (gradient) ของการอัปเดตในแต่ละรอบ
Weak Learners: ใช้ในการเรียนรู้ข้อผิดพลาด (residuals) จาก Loss Function ในแต่ละรอบ
Additive Model: รวมโมเดลย่อยทั้งหมดเข้าด้วยกันเพื่อปรับปรุงผลลัพธ์ในลักษณะเชิงเส้น
ขั้นตอนหลักของ Gradient Boosting
- เริ่มต้นจากการทำนายค่าเบื้องต้น: โมเดลจะเริ่มต้นด้วยการทำนายค่าคงที่ (เช่น ค่าเฉลี่ยของตัวแปรที่ต้องการทำนาย) หรืออาจจะใช้วิธีการเบื้องต้นอื่นๆ ขึ้นอยู่กับลักษณะของปัญหา
- การคำนวณข้อผิดพลาด (Residuals): หลังจากที่โมเดลเริ่มทำการทำนายแล้ว จะคำนวณข้อผิดพลาด (หรือ residuals) โดยการหาความแตกต่างระหว่างค่าทำนายที่ได้กับค่าจริง
- การสร้างโมเดลใหม่: โมเดลใหม่จะถูกสร้างขึ้นเพื่อทำนายข้อผิดพลาดที่เกิดขึ้นจากขั้นตอนก่อนหน้า โดยทั่วไปจะใช้ Decision Tree เป็นตัวสร้างโมเดลย่อย เนื่องจากมันสามารถจับความสัมพันธ์ที่ไม่เป็นเชิงเส้นได้ดี
- การอัปเดตโมเดล: โมเดลใหม่จะถูกเพิ่มเข้าไปในโมเดลที่มีอยู่เดิม โดยจะทำการปรับปรุงทำนายโดยการนำข้อผิดพลาดที่เกิดขึ้นมาทำนายใหม่ ค่าน้ำหนัก (weight) ที่ให้กับโมเดลใหม่จะถูกกำหนดโดยอัตราการเรียนรู้ (learning rate)
- ทำซ้ำจนกว่าจะถึงจำนวนรอบที่กำหนด: ขั้นตอนนี้จะทำซ้ำหลายรอบ โดยที่แต่ละโมเดลใหม่จะช่วยปรับปรุงข้อผิดพลาดของโมเดลก่อนหน้า โมเดลทั้งหมดจะร่วมกันสร้างการทำนายที่มีความแม่นยำสูงขึ้น
- XGBoost (Extreme Gradient Boosting) เป็นหนึ่งในอัลกอริธึมที่ได้รับความนิยมมากที่สุดและมีประสิทธิภาพสูงในการแข่งขันทาง Data Science
- LightGBM เป็นอีกหนึ่งอัลกอริธึมที่ได้รับความนิยม ซึ่งมีข้อดีในด้านความเร็วและการใช้งานที่สามารถจัดการกับข้อมูลขนาดใหญ่ได้ดีกว่า
- CatBoost เป็นเทคนิคของ Gradient Boosting ที่ถูกออกแบบมาเพื่อจัดการกับข้อมูลที่มีค่าหมวดหมู่ (categorical features) ได้ดีกว่า
- ประสิทธิภาพสูง: โดยเฉพาะในกรณีที่มีการปรับแต่งพารามิเตอร์ให้เหมาะสม
- ไม่ต้องการการเตรียมข้อมูลมาก: เนื่องจากการใช้งาน Decision Trees ซึ่งสามารถจัดการกับข้อมูลที่ไม่เป็นเชิงเส้นได้ดี
- รองรับการทำงานกับข้อมูลประเภทต่างๆ: เช่น ข้อมูลตัวเลขและข้อมูลหมวดหมู่
- การคำนวณช้า: เนื่องจากต้องสร้างโมเดลหลายๆ ตัว โดยเฉพาะเมื่อจำนวนโมเดลมาก
- เสี่ยงต่อ Overfitting: ถ้าเลือกจำนวนต้นไม้หรือความลึกมากเกินไป
ใช้ชุดข้อมูล Digits Dataset เป็นหนึ่งในชุดข้อมูลตัวอย่างที่มาพร้อมกับไลบรารี Scikit-learn สำหรับปัญหา Multi-class Classification โดยชุดข้อมูลนี้ใช้สำหรับการจดจำตัวเลข (Digit Recognition)
- Import Libraries
โค้ด: เลือกทั้งหมด
from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report
- GradientBoostingClassifier: โมเดลสำหรับ Classification ที่ใช้ Gradient Boosting ในการสร้าง Decision Trees
l - oad_digits: ใช้สำหรับโหลด Digits Dataset จาก Scikit-learn
- train_test_split: ฟังก์ชันสำหรับแบ่งข้อมูลเป็น Training set และ Testing set
- accuracy_score: เมตริกสำหรับวัดความแม่นยำของโมเดล
- classification_report: รายงานประสิทธิภาพของโมเดล (Precision, Recall, F1-score)
- GradientBoostingClassifier: โมเดลสำหรับ Classification ที่ใช้ Gradient Boosting ในการสร้าง Decision Trees
- โหลด Digits Dataset
โค้ด: เลือกทั้งหมด
digits = load_digits() X = digits.data y = digits.target
- digits.data: Features (ตัวเลขพิกเซล 64 ค่าในรูปแบบ 1D vector)
- digits.target: Labels (ตัวเลข 0-9 ที่ต้องการให้โมเดลทำนาย)
- แบ่งข้อมูลเป็น Training และ Testing sets
โค้ด: เลือกทั้งหมด
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
- test_size=0.2: แบ่งข้อมูล 20% สำหรับ Testing และอีก 80% สำหรับ Training
- random_state=42: ตั้งค่า seed เพื่อให้การสุ่มแบ่งข้อมูลให้ผลลัพธ์เหมือนเดิมทุกครั้งที่รัน
- สร้างและฝึกโมเดล Gradient Boosting
โค้ด: เลือกทั้งหมด
gb_clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42) gb_clf.fit(X_train, y_train)
- GradientBoostingClassifier: โมเดล Gradient Boosting สำหรับ Classification
- n_estimators=100: จำนวนต้นไม้ที่ใช้ (100 ต้น)
- learning_rate=0.1: ควบคุมขนาดการอัปเดตน้ำหนักในแต่ละรอบ (ค่าที่เล็กลงช่วยลดการ Overfitting)
- max_depth=3: ความลึกสูงสุดของแต่ละ Decision Tree
- random_state=42: กำหนดค่า seed เพื่อให้ผลลัพธ์เดิม
- ทำนายผลลัพธ์
โค้ด: เลือกทั้งหมด
y_pred = gb_clf.predict(X_test)
- ใช้โมเดลที่ฝึกแล้วทำนาย Labels ของข้อมูลใน Testing set (X_test)
- ผลลัพธ์ y_pred: ค่าที่โมเดลทำนายได้ (ตัวเลข 0-9)
- ประเมินผลลัพธ์
- ความแม่นยำ (Accuracy)
ค่าความแม่นยำ แสดงดังภาพ
โค้ด: เลือกทั้งหมด
print("Accuracy:", accuracy_score(y_test, y_pred))
- accuracy_score: คำนวณค่าความแม่นยำจากสัดส่วนของคำทำนายที่ถูกต้อง
- รายงานผลการจำแนกประเภท (Classification Report)
รายงานผลการจำแนกประเภท แสดงดังภาพ
โค้ด: เลือกทั้งหมด
print("\nClassification Report:\n", classification_report(y_test, y_pred))
- classification_report: แสดงเมตริกสำคัญในแต่ละคลาส เช่น
- Precision: สัดส่วนของการทำนายที่ถูกต้องจากทั้งหมดที่ทำนายว่าเป็นคลาสนั้น
- Recall: สัดส่วนของการทำนายที่ถูกต้องจากจำนวนจริงในคลาสนั้น
- F1-score: ค่าเฉลี่ยของ Precision และ Recall
- classification_report: แสดงเมตริกสำคัญในแต่ละคลาส เช่น
- ความแม่นยำ (Accuracy)
Gradient Boosting เป็นเทคนิค Machine Learning ที่ผสมผสานโมเดลย่อยหลายตัวเพื่อเพิ่มความแม่นยำในการทำนาย โดยแต่ละโมเดลจะถูกสร้างขึ้นเพื่อแก้ไขข้อผิดพลาดของโมเดลก่อนหน้า เทคนิคนี้เหมาะสำหรับงาน Classification และ Regression โดยสามารถจัดการข้อมูลที่ซับซ้อนหรือมี Noise ได้อย่างมีประสิทธิภาพ ข้อดีคือความยืดหยุ่นในการปรับแต่งพารามิเตอร์ เช่น จำนวนต้นไม้, ความลึก และค่า learning rate ช่วยให้ปรับโมเดลให้เหมาะสมกับปัญหาเฉพาะได้
อ้างอิง
https://medium.com/@nontakul.p/gradient-boosting-คืออะไร-72d19a7751fa
https://guopai.github.io/ml-blog11.html
https://www.coraline.co.th/posts/forecasting-model-ด้วย-machine-learning
https://www.geeksforgeeks.org/ml-gradient-boosting/