Boruta

Basic

Boruta | เลือกคุณลักษณะที่สำคัญด้วย Random Forest

Boruta คืออัลกอริทึมเลือกคุณลักษณะที่คัดเฉพาะฟีเจอร์ที่มีประโยชน์จริง ช่วยเพิ่มความแม่นยำ ทำให้ตีความง่ายขึ้น และลดต้นทุนคำนวณด้วยการตัดฟีเจอร์ที่ไม่จำเป็น


1. ทำไมต้องเลือกคุณลักษณะ #

  • ข้อมูลมิติสูง
    ฟีเจอร์มากเกินไปทำให้ noise เพิ่มและเกิด overfitting ได้ง่าย

  • ต้นทุนคำนวณ
    ลดฟีเจอร์ที่ไม่จำเป็น ทำให้ฝึกและทำนายเร็วขึ้น

  • การตีความ
    ระบุได้ชัดว่าฟีเจอร์ใดมีผลจริงต่อการตัดสินใจของโมเดล


2. หลักการของ Boruta (แบบเข้าใจง่าย) #

  1. ฝึก Random Forest ด้วยฟีเจอร์ทั้งหมด
  2. คำนวณความสำคัญของแต่ละฟีเจอร์
  3. สร้าง “shadow features” ด้วยการสุ่มสลับค่าฟีเจอร์เป็นฐานเปรียบเทียบ
  4. หากฟีเจอร์จริงสำคัญกว่า shadow → สำคัญ ถ้าต่ำกว่า → ไม่สำคัญ
  5. ทำซ้ำเพื่อให้ผลลัพธ์เสถียร

3. ตัวอย่างการใช้งาน (CSV) #

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from boruta import BorutaPy

# Load data
X = pd.read_csv("examples/test_X.csv", index_col=0).values
y = pd.read_csv("examples/test_y.csv", header=None, index_col=0).values.ravel()

# Random Forest
rf = RandomForestClassifier(n_jobs=-1, class_weight="balanced", max_depth=5)

# Boruta
feat_selector = BorutaPy(rf, n_estimators="auto", verbose=2, random_state=1)
feat_selector.fit(X, y)

print("Selected features:", feat_selector.support_)
print("Feature ranking:", feat_selector.ranking_)

# Keep only important features
X_filtered = feat_selector.transform(X)

4. ทดลองกับข้อมูลสังเคราะห์ #

ตรวจว่า Boruta คงฟีเจอร์สำคัญและตัดฟีเจอร์ที่ไม่จำเป็นได้หรือไม่

ทุกฟีเจอร์มีประโยชน์ (ไม่ตัดออก) #

from sklearn.datasets import make_classification
from xgboost import XGBClassifier

X, y = make_classification(
    n_samples=1000, n_features=10,
    n_informative=10, n_redundant=0, n_classes=2,
    random_state=0, shuffle=False
)
model = XGBClassifier(max_depth=4)

feat_selector = BorutaPy(model, n_estimators="auto", verbose=2, random_state=1)
feat_selector.fit(X, y)
X_filtered = feat_selector.transform(X)

print(f"{X.shape[1]} --> {X_filtered.shape[1]}")

หากทุกฟีเจอร์มีประโยชน์ จะไม่ถูกตัดออก


ฟีเจอร์ส่วนใหญ่ไม่จำเป็น (ตัดออก) #

X, y = make_classification(
    n_samples=2000, n_features=100,
    n_informative=10, n_redundant=0, n_classes=2,
    random_state=0, shuffle=False
)
model = XGBClassifier(max_depth=5)

feat_selector = BorutaPy(model, n_estimators="auto", verbose=2, random_state=1)
feat_selector.fit(X, y)
X_filtered = feat_selector.transform(X)

print(f"{X.shape[1]} --> {X_filtered.shape[1]}")

จาก 100 ฟีเจอร์ เหลือ 10 ฟีเจอร์ที่มีประโยชน์


5. จุดสำคัญในงานจริง #

  • เหมาะกับโมเดลต้นไม้ (Random Forest, XGBoost) เป็นพิเศษ
  • ช่วยตัดฟีเจอร์ที่เป็น noise ได้ดี
  • ต้นทุนคำนวณสูงขึ้นเมื่อจำนวนฟีเจอร์มาก
  • ฟีเจอร์ที่เลือกไว้สามารถนำไปใช้เพื่อการตีความและการแสดงผลได้

สรุป #

  • Boruta เลือกฟีเจอร์โดยเทียบกับ “shadow features” อย่างเสถียร
  • ถ้าทุกฟีเจอร์สำคัญ จะไม่ตัดออก และถ้าไม่สำคัญก็จะตัดให้
  • ใช้เป็นขั้นตอนเตรียมข้อมูลเพื่อเพิ่มความแม่นยำ ประสิทธิภาพ และการตีความ