Isolation Forest สร้างต้นไม้สุ่มจำนวนมาก แล้วให้คะแนนความผิดปกติจากความยาวเส้นทาง ที่ใช้แยกตัวอย่างออกจากกัน ยิ่งแยกได้เร็ว ยิ่งมีโอกาสเป็นความผิดปกติ เหมาะกับข้อมูลมิติสูง
1. หลักการทำงาน #
- สุ่มย่อยข้อมูลหลายชุด (subsample)
- สร้าง Isolation Tree ด้วยการเลือกฟีเจอร์และค่าตัดแบบสุ่ม
- ตัวอย่างที่มีเส้นทางเฉลี่ยสั้นจะถูกแยกได้ง่ายกว่า จึงน่าจะเป็นความผิดปกติ
คะแนนจะถูกทำให้เป็นสเกลเดียวกันด้วยความยาวเส้นทางคาดหวังของต้นไม้สุ่ม \(c(n)\)
2. ตัวอย่าง Python #
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.ensemble import IsolationForest
rng = np.random.default_rng(0)
X_inliers = 0.3 * rng.normal(size=(200, 2))
X_anom = rng.uniform(low=-4, high=4, size=(20, 2))
X = np.vstack([X_inliers, X_anom])
model = IsolationForest(n_estimators=200, contamination=0.1, random_state=0)
model.fit(X)
scores = -model.score_samples(X)
labels = model.predict(X) # -1 = anomaly
plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], c=scores, cmap="magma", s=30)
plt.colorbar(label="anomaly score")
plt.title("คะแนนของ Isolation Forest")
plt.tight_layout()
plt.show()
print("จำนวนที่ถูกมองว่าเป็นความผิดปกติ:", np.sum(labels == -1))
3. ไฮเปอร์พารามิเตอร์ #
n_estimators: จำนวนต้นไม้ มากขึ้นจะเสถียรกว่าmax_samples: จำนวนตัวอย่างต่อหนึ่งต้นไม้ ค่าเริ่มต้นmin(256, n_samples)contamination: สัดส่วนความผิดปกติที่คาดไว้ ใช้ตั้งค่า thresholdmax_features: จำนวนฟีเจอร์ที่ใช้ในแต่ละ split
4. ข้อดีและข้อจำกัด #
| ข้อดี | ข้อจำกัด |
|---|---|
| ค่อนข้างเร็วแม้ข้อมูลมิติสูง | ผลลัพธ์เปลี่ยนได้ตาม seed |
| ไม่จำเป็นต้องสเกลข้อมูล (แต่แนะนำให้ทำ) | ความผิดปกติแบบเฉพาะจุดอาจหลุดได้ |
| ฝึกและทำนายง่าย | ตั้งค่า contamination ให้เหมาะอาจยาก |
5. สรุป #
- Isolation Forest ใช้ “ความสั้นของเส้นทางแยก” เป็นสัญญาณความผิดปกติ
- ใช้งานง่ายใน scikit-learn โดยปรับหลัก ๆ ที่จำนวนต้นไม้และจำนวนตัวอย่าง
- เหมาะกับการกรองความผิดปกติอย่างรวดเร็วใน log หรือข้อมูลเซนเซอร์