AdaBoost (regression)

Basic

AdaBoost สำหรับการถดถอย | ปรับน้ำหนักเพื่อไล่จับจุดยาก

AdaBoost (Adaptive Boosting) สำหรับงานถดถอยฝึก weak learner ทีละตัวโดยให้น้ำหนักมากขึ้นกับจุดที่โมเดลก่อนหน้าทำนายผิด เพื่อให้โมเดลรวมจับทิศทางของข้อมูลได้ดีขึ้น


1. สัญชาติญาณ #

  1. เริ่มต้นด้วยตัวอย่างที่มีน้ำหนักเท่ากัน
  2. วัดความผิดพลาดของ weak learner ตัวแรก แล้วเพิ่มน้ำหนักให้ตัวอย่างที่พยากรณ์ผิดมาก
  3. ฝึก weak learner ตัวใหม่ด้วยน้ำหนักใหม่
  4. ทำซ้ำจนได้โมเดลหลายตัว สุดท้ายหาค่าเฉลี่ยถ่วงน้ำหนักตามความแม่น (\(\alpha_t\))

2. สูตร (AdaBoost.R2) #

นิยามความผิดพลาดสัมพัทธ์ (loss=“linear”):

$$ e_i^{(m)} = \frac{|y_i - h^{(m)}(x_i)|}{E_{\max}^{(m)}},\qquad E_{\max}^{(m)} = \max_j |y_j - h^{(m)}(x_j)|. $$

อัตราความผิดพลาดแบบถ่วงน้ำหนัก:

$$ \varepsilon^{(m)} = \sum_i w_i^{(m)} e_i^{(m)},\qquad \beta^{(m)} = \frac{\varepsilon^{(m)}}{1-\varepsilon^{(m)}},\qquad \alpha^{(m)} = \log\frac{1-\varepsilon^{(m)}}{\varepsilon^{(m)}}. $$

อัปเดตน้ำหนักตัวอย่าง:

$$ w_i^{(m+1)} \propto w_i^{(m)} \bigl(\beta^{(m)}\bigr)^{1 - e_i^{(m)}}. $$

พยากรณ์สุดท้าย (scikit-learn จะใช้ weighted median ภายใน):

$$ \hat{y}(x) = \frac{\sum_{m=1}^M \alpha^{(m)} h^{(m)}(x)}{\sum_{m=1}^M \alpha^{(m)}}. $$


3. ตัวอย่างโค้ด #

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor

X = np.linspace(-10, 10, 500)[:, np.newaxis]
y = (np.sin(X).ravel() + np.cos(4 * X).ravel()) * 10 + 10 + np.linspace(-2, 2, 500)

reg = AdaBoostRegressor(
    estimator=DecisionTreeRegressor(max_depth=5, random_state=0),
    n_estimators=100,
    learning_rate=0.8,
    loss="linear",
    random_state=100,
).fit(X, y)
y_pred = reg.predict(X)

plt.figure(figsize=(10, 5))
plt.scatter(X, y, c="k", marker="x", s=15, label="ข้อมูลจริง")
plt.plot(X, y_pred, c="r", lw=1.5, label="AdaBoost ทำนาย")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

4. เลือก loss #

  • loss="linear" (ค่าเริ่มต้น): สมดุลที่สุด
  • loss="square": เน้นจุดที่ผิดมากเป็นพิเศษ (ไวต่อ outlier)
  • loss="exponential": ไวที่สุด ระวัง noise สูง

5. การตั้งค่าที่สำคัญ #

  • n_estimators: จำนวน weak learner มากขึ้น → แม่นยำขึ้นแต่ช้าขึ้น
  • learning_rate: เล็กลงทำให้ต้องเพิ่ม n_estimators
  • estimator: มักใช้ decision tree ตื้น ๆ (max_depth 2–4)
  • loss: ควบคุมความไวต่อ outlier

6. ทิปเชิงปฏิบัติ #

  • ตรวจสอบทั้ง RMSE และ MAE เพราะแต่ละตัวไวต่อ outlier ต่างกัน
  • ข้อมูลเสียงดังมากควรลด noise ก่อน หรือใช้ loss="linear"
  • ใช้ early stopping (เช่น เพิ่ม n_estimators ทีละน้อยแล้วดู validation)
  • ใช้ random_state เพื่อการทำซ้ำ
  • เปรียบเทียบกับ Gradient Boosting / HistGB / XGBoost เพื่อประเมิน trade-off ด้านความเร็ว

สรุป #

  • AdaBoost.R2 ปรับน้ำหนักตัวอย่างเพื่อไล่แก้จุดที่โมเดลก่อนหน้าทำผิด
  • ช่วยสร้างฟังก์ชันพยากรณ์ที่นุ่มนวลจาก weak learner ตื้น ๆ
  • ปรับ learning_rate × n_estimators × ความลึกของต้นไม้ ให้สมดุล
  • เลือก loss ให้เหมาะกับระดับ noise ของข้อมูล