AdaBoost (Adaptive Boosting) สำหรับงานถดถอยฝึก weak learner ทีละตัวโดยให้น้ำหนักมากขึ้นกับจุดที่โมเดลก่อนหน้าทำนายผิด เพื่อให้โมเดลรวมจับทิศทางของข้อมูลได้ดีขึ้น
1. สัญชาติญาณ #
- เริ่มต้นด้วยตัวอย่างที่มีน้ำหนักเท่ากัน
- วัดความผิดพลาดของ weak learner ตัวแรก แล้วเพิ่มน้ำหนักให้ตัวอย่างที่พยากรณ์ผิดมาก
- ฝึก weak learner ตัวใหม่ด้วยน้ำหนักใหม่
- ทำซ้ำจนได้โมเดลหลายตัว สุดท้ายหาค่าเฉลี่ยถ่วงน้ำหนักตามความแม่น (\(\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_estimatorsestimator: มักใช้ 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 ของข้อมูล