Boruta คืออัลกอริทึมเลือกคุณลักษณะที่คัดเฉพาะฟีเจอร์ที่มีประโยชน์จริง ช่วยเพิ่มความแม่นยำ ทำให้ตีความง่ายขึ้น และลดต้นทุนคำนวณด้วยการตัดฟีเจอร์ที่ไม่จำเป็น
1. ทำไมต้องเลือกคุณลักษณะ #
ข้อมูลมิติสูง
ฟีเจอร์มากเกินไปทำให้ noise เพิ่มและเกิด overfitting ได้ง่ายต้นทุนคำนวณ
ลดฟีเจอร์ที่ไม่จำเป็น ทำให้ฝึกและทำนายเร็วขึ้นการตีความ
ระบุได้ชัดว่าฟีเจอร์ใดมีผลจริงต่อการตัดสินใจของโมเดล
2. หลักการของ Boruta (แบบเข้าใจง่าย) #
- ฝึก Random Forest ด้วยฟีเจอร์ทั้งหมด
- คำนวณความสำคัญของแต่ละฟีเจอร์
- สร้าง “shadow features” ด้วยการสุ่มสลับค่าฟีเจอร์เป็นฐานเปรียบเทียบ
- หากฟีเจอร์จริงสำคัญกว่า shadow → สำคัญ ถ้าต่ำกว่า → ไม่สำคัญ
- ทำซ้ำเพื่อให้ผลลัพธ์เสถียร
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” อย่างเสถียร
- ถ้าทุกฟีเจอร์สำคัญ จะไม่ตัดออก และถ้าไม่สำคัญก็จะตัดให้
- ใช้เป็นขั้นตอนเตรียมข้อมูลเพื่อเพิ่มความแม่นยำ ประสิทธิภาพ และการตีความ