Bagging

Basic

Bagging (Bootstrap Aggregating) | ปรับลดความแปรปรวนด้วยการสุ่มซ้ำ

Bagging (Bootstrap Aggregating) คือการสุ่มข้อมูลด้วยการแทนที่หลาย ๆ ชุด (bootstrap) ฝึกโมเดลเหมือนกันบนแต่ละชุด แล้วเฉลี่ยหรือโหวตผลลัพธ์ ช่วยลดความแปรปรวนและทำให้โมเดลนิ่งขึ้น หากใช้กับต้นไม้จะนำไปสู่ Random Forest


ขั้นตอน #

  1. สุ่มข้อมูลจากชุดฝึกแบบ bootstrap เพื่อสร้างชุดย่อยหลายชุด
  2. ฝึกฐานโมเดล (เช่น decision tree) บนแต่ละชุด
  3. สำหรับงานจำแนกใช้การโหวต สำหรับงานถดถอยใช้ค่าเฉลี่ย

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 ให้ใช้ทันที