Bagging (Bootstrap Aggregating) คือการสุ่มข้อมูลด้วยการแทนที่หลาย ๆ ชุด (bootstrap) ฝึกโมเดลเหมือนกันบนแต่ละชุด แล้วเฉลี่ยหรือโหวตผลลัพธ์ ช่วยลดความแปรปรวนและทำให้โมเดลนิ่งขึ้น หากใช้กับต้นไม้จะนำไปสู่ Random Forest
ขั้นตอน #
- สุ่มข้อมูลจากชุดฝึกแบบ bootstrap เพื่อสร้างชุดย่อยหลายชุด
- ฝึกฐานโมเดล (เช่น decision tree) บนแต่ละชุด
- สำหรับงานจำแนกใช้การโหวต สำหรับงานถดถอยใช้ค่าเฉลี่ย
Bagging เน้นลด variance ของผู้เรียนที่ “เสียงดัง” เช่น decision tree ที่ลึก
โค้ดตัวอย่าง #
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import BaggingRegressor
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
base = DecisionTreeRegressor(max_depth=None, random_state=0)
bagging = BaggingRegressor(
estimator=base,
n_estimators=100,
max_samples=0.8,
max_features=0.8,
bootstrap=True,
oob_score=True,
random_state=0,
)
bagging.fit(X_train, y_train)
pred = bagging.predict(X_test)
print("RMSE:", mean_squared_error(y_test, pred, squared=False))
print("OOB score:", bagging.oob_score_)
พารามิเตอร์ที่สำคัญ #
n_estimators: จำนวนโมเดลย่อย มากขึ้น → แปรปรวนลดลงแต่ใช้เวลามากขึ้นmax_samples,max_features: สัดส่วนข้อมูล/ฟีเจอร์ที่ใช้ต่อโมเดลย่อยbootstrap,bootstrap_features: เลือกสุ่มซ้ำทั้งตัวอย่างหรือฟีเจอร์oob_score: ประเมินประสิทธิภาพจากตัวอย่างที่ไม่ได้ใช้ (out-of-bag) เพื่อเลี่ยงการแบ่ง validation เพิ่ม
ข้อดี / ข้อจำกัด #
| ข้อดี | ข้อจำกัด |
|---|---|
| โค้ดง่าย ขนาน (parallelize) ได้ | ต้องเก็บโมเดลหลายตัว ใช้หน่วยความจำสูง |
| ลด variance ได้มาก | ไม่ลด bias มาก ถ้าโมเดลฐานอ่อนแอเกินไป |
| มี OOB score ไม่ต้องแบ่ง validation | ผลลัพธ์ยากตีความยิ่งกว่าต้นไม้เดี่ยว |
สรุป #
- Bagging = สุ่มซ้ำ + ฝึกหลายโมเดล + เฉลี่ยผล → โมเดลนิ่งขึ้น
- เป็นก้าวแรกก่อน Random Forest / ExtraTrees
- เหมาะกับ learner ที่ variance สูง (tree, neural net ขนาดเล็ก)
- โค้ดไม่ซับซ้อนและมีใน
BaggingClassifier/Regressorให้ใช้ทันที