รู้จัก Gradient Boosting แบบเจาะลึก

แชร์ความรู้ภาษา Python ไพทอน การเขียนโปรแกรมภาษาไพทอน

Moderator: mindphp, ผู้ดูแลกระดาน

ภาพประจำตัวสมาชิก
opj
PHP Hero Member
PHP Hero Member
โพสต์: 195
ลงทะเบียนเมื่อ: 16/12/2024 9:05 am

รู้จัก Gradient Boosting แบบเจาะลึก

โพสต์ที่ยังไม่ได้อ่าน โดย opj »

ในยุคที่เทคโนโลยีก้าวหน้าอย่างรวดเร็ว การประมวลผลข้อมูลและการทำนายด้วย Machine Learning ได้กลายเป็นเครื่องมือที่สำคัญในหลายๆ ด้าน เช่น การจำแนกประเภทข้อมูล, การคาดการณ์แนวโน้มในธุรกิจ, หรือแม้แต่การแพทย์ สำหรับการพัฒนาโมเดลที่มีความแม่นยำสูง เช่น Gradient Boosting ถือเป็นหนึ่งในเทคนิคที่มีประสิทธิภาพ ซึ่งช่วยให้การทำนายมีความแม่นยำมากขึ้น

หัวใจหลักของ Gradient Boosting
  1. Loss Function
    Loss Function เป็นตัวชี้วัดข้อผิดพลาดระหว่างค่าที่โมเดลทำนาย และค่าจริง ซึ่ง Gradient Boosting จะพยายามลดค่าของ Loss Function ในแต่ละรอบของการฝึก (training) โดยการเพิ่มโมเดลย่อยเข้ามาช่วยปรับปรุงผลลัพธ์ให้แม่นยำยิ่งขึ้น
    Gradient Boosting จะใช้ Gradient Descent ในการคำนวณค่า Gradient ของ Loss Function เพื่ออัปเดตโมเดลให้ดีขึ้นในแต่ละรอบ
  2. 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
    ในแต่ละรอบของ Gradient Boosting จะสร้าง Weak Learner ใหม่ขึ้นมาที่พยายามแก้ไขข้อผิดพลาดที่โมเดลก่อนหน้าทำไว้
  3. Additive Model
    Additive Model คือกระบวนการรวมโมเดลย่อยที่สร้างขึ้นในแต่ละรอบเข้าด้วยกันอย่างต่อเนื่อง โดยผลลัพธ์ของโมเดลสุดท้ายจะเป็นการรวมผลลัพธ์จากโมเดลย่อยทั้งหมด
    • การรวมโมเดลแบบ Additive นี้ช่วยให้ Gradient Boosting ค่อยๆ ปรับค่าทำนายให้เข้าใกล้ค่าจริงมากขึ้น โดยไม่ปรับเปลี่ยนแบบก้าวกระโดด
การทำงานร่วมกันของทั้ง 3 ส่วน:
Loss Function: ใช้เพื่อคำนวณข้อผิดพลาดระหว่างค่าจริงกับค่าทำนาย และช่วยกำหนดทิศทาง (gradient) ของการอัปเดตในแต่ละรอบ
Weak Learners: ใช้ในการเรียนรู้ข้อผิดพลาด (residuals) จาก Loss Function ในแต่ละรอบ
Additive Model: รวมโมเดลย่อยทั้งหมดเข้าด้วยกันเพื่อปรับปรุงผลลัพธ์ในลักษณะเชิงเส้น

ขั้นตอนหลักของ Gradient Boosting
  1. เริ่มต้นจากการทำนายค่าเบื้องต้น: โมเดลจะเริ่มต้นด้วยการทำนายค่าคงที่ (เช่น ค่าเฉลี่ยของตัวแปรที่ต้องการทำนาย) หรืออาจจะใช้วิธีการเบื้องต้นอื่นๆ ขึ้นอยู่กับลักษณะของปัญหา
  2. การคำนวณข้อผิดพลาด (Residuals): หลังจากที่โมเดลเริ่มทำการทำนายแล้ว จะคำนวณข้อผิดพลาด (หรือ residuals) โดยการหาความแตกต่างระหว่างค่าทำนายที่ได้กับค่าจริง
  3. การสร้างโมเดลใหม่: โมเดลใหม่จะถูกสร้างขึ้นเพื่อทำนายข้อผิดพลาดที่เกิดขึ้นจากขั้นตอนก่อนหน้า โดยทั่วไปจะใช้ Decision Tree เป็นตัวสร้างโมเดลย่อย เนื่องจากมันสามารถจับความสัมพันธ์ที่ไม่เป็นเชิงเส้นได้ดี
  4. การอัปเดตโมเดล: โมเดลใหม่จะถูกเพิ่มเข้าไปในโมเดลที่มีอยู่เดิม โดยจะทำการปรับปรุงทำนายโดยการนำข้อผิดพลาดที่เกิดขึ้นมาทำนายใหม่ ค่าน้ำหนัก (weight) ที่ให้กับโมเดลใหม่จะถูกกำหนดโดยอัตราการเรียนรู้ (learning rate)
  5. ทำซ้ำจนกว่าจะถึงจำนวนรอบที่กำหนด: ขั้นตอนนี้จะทำซ้ำหลายรอบ โดยที่แต่ละโมเดลใหม่จะช่วยปรับปรุงข้อผิดพลาดของโมเดลก่อนหน้า โมเดลทั้งหมดจะร่วมกันสร้างการทำนายที่มีความแม่นยำสูงขึ้น
ตัวอย่างของ Gradient Boosting
  • XGBoost (Extreme Gradient Boosting) เป็นหนึ่งในอัลกอริธึมที่ได้รับความนิยมมากที่สุดและมีประสิทธิภาพสูงในการแข่งขันทาง Data Science
  • LightGBM เป็นอีกหนึ่งอัลกอริธึมที่ได้รับความนิยม ซึ่งมีข้อดีในด้านความเร็วและการใช้งานที่สามารถจัดการกับข้อมูลขนาดใหญ่ได้ดีกว่า
  • CatBoost เป็นเทคนิคของ Gradient Boosting ที่ถูกออกแบบมาเพื่อจัดการกับข้อมูลที่มีค่าหมวดหมู่ (categorical features) ได้ดีกว่า
ข้อดีของ Gradient Boosting
  • ประสิทธิภาพสูง: โดยเฉพาะในกรณีที่มีการปรับแต่งพารามิเตอร์ให้เหมาะสม
  • ไม่ต้องการการเตรียมข้อมูลมาก: เนื่องจากการใช้งาน Decision Trees ซึ่งสามารถจัดการกับข้อมูลที่ไม่เป็นเชิงเส้นได้ดี
  • รองรับการทำงานกับข้อมูลประเภทต่างๆ: เช่น ข้อมูลตัวเลขและข้อมูลหมวดหมู่
ข้อเสียของ Gradient Boosting
  • การคำนวณช้า: เนื่องจากต้องสร้างโมเดลหลายๆ ตัว โดยเฉพาะเมื่อจำนวนโมเดลมาก
  • เสี่ยงต่อ Overfitting: ถ้าเลือกจำนวนต้นไม้หรือความลึกมากเกินไป
ตัวอย่างโค้ด
ใช้ชุดข้อมูล Digits Dataset เป็นหนึ่งในชุดข้อมูลตัวอย่างที่มาพร้อมกับไลบรารี Scikit-learn สำหรับปัญหา Multi-class Classification โดยชุดข้อมูลนี้ใช้สำหรับการจดจำตัวเลข (Digit Recognition)
  1. 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)
  2. โหลด Digits Dataset

    โค้ด: เลือกทั้งหมด

    digits = load_digits()
    X = digits.data
    y = digits.target
    
    • digits.data: Features (ตัวเลขพิกเซล 64 ค่าในรูปแบบ 1D vector)
    • digits.target: Labels (ตัวเลข 0-9 ที่ต้องการให้โมเดลทำนาย)
  3. แบ่งข้อมูลเป็น 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 เพื่อให้การสุ่มแบ่งข้อมูลให้ผลลัพธ์เหมือนเดิมทุกครั้งที่รัน
  4. สร้างและฝึกโมเดล 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 เพื่อให้ผลลัพธ์เดิม
  5. ทำนายผลลัพธ์

    โค้ด: เลือกทั้งหมด

    y_pred = gb_clf.predict(X_test)
    
    • ใช้โมเดลที่ฝึกแล้วทำนาย Labels ของข้อมูลใน Testing set (X_test)
    • ผลลัพธ์ y_pred: ค่าที่โมเดลทำนายได้ (ตัวเลข 0-9)
  6. ประเมินผลลัพธ์
    1. ความแม่นยำ (Accuracy)

      โค้ด: เลือกทั้งหมด

      print("Accuracy:", accuracy_score(y_test, y_pred))
      ค่าความแม่นยำ แสดงดังภาพ
      accuracy.png
      accuracy.png (16.52 KiB) Viewed 1202 times
      • accuracy_score: คำนวณค่าความแม่นยำจากสัดส่วนของคำทำนายที่ถูกต้อง
    2. รายงานผลการจำแนกประเภท (Classification Report)

      โค้ด: เลือกทั้งหมด

      print("\nClassification Report:\n", classification_report(y_test, y_pred))
      
      รายงานผลการจำแนกประเภท แสดงดังภาพ
      Report.png
      Report.png (71.09 KiB) Viewed 1202 times
      • classification_report: แสดงเมตริกสำคัญในแต่ละคลาส เช่น
        • Precision: สัดส่วนของการทำนายที่ถูกต้องจากทั้งหมดที่ทำนายว่าเป็นคลาสนั้น
        • Recall: สัดส่วนของการทำนายที่ถูกต้องจากจำนวนจริงในคลาสนั้น
        • F1-score: ค่าเฉลี่ยของ Precision และ Recall
สรุป
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/
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 3