Isolation Forest

Basic

Isolation Forest | แยกค่าผิดปกติด้วยการสุ่มแบ่ง

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))

กราฟตัวอย่าง Python


3. ไฮเปอร์พารามิเตอร์ #

  • n_estimators: จำนวนต้นไม้ มากขึ้นจะเสถียรกว่า
  • max_samples: จำนวนตัวอย่างต่อหนึ่งต้นไม้ ค่าเริ่มต้น min(256, n_samples)
  • contamination: สัดส่วนความผิดปกติที่คาดไว้ ใช้ตั้งค่า threshold
  • max_features: จำนวนฟีเจอร์ที่ใช้ในแต่ละ split

4. ข้อดีและข้อจำกัด #

ข้อดีข้อจำกัด
ค่อนข้างเร็วแม้ข้อมูลมิติสูงผลลัพธ์เปลี่ยนได้ตาม seed
ไม่จำเป็นต้องสเกลข้อมูล (แต่แนะนำให้ทำ)ความผิดปกติแบบเฉพาะจุดอาจหลุดได้
ฝึกและทำนายง่ายตั้งค่า contamination ให้เหมาะอาจยาก

5. สรุป #

  • Isolation Forest ใช้ “ความสั้นของเส้นทางแยก” เป็นสัญญาณความผิดปกติ
  • ใช้งานง่ายใน scikit-learn โดยปรับหลัก ๆ ที่จำนวนต้นไม้และจำนวนตัวอย่าง
  • เหมาะกับการกรองความผิดปกติอย่างรวดเร็วใน log หรือข้อมูลเซนเซอร์