Memberi label anomali dengan Isolation Forest

3.3.5

Memberi label anomali dengan Isolation Forest

Diperbarui 2025-11-03 Baca 2 menit
<p><b>Isolation Forest</b> merupakan algoritma deteksi anomali tanpa label yang bekerja dengan memisahkan titik data menggunakan pohon binari acak. Sampel yang cepat “terisolasi” (butuh sedikit pemisahan) dianggap sebagai outlier.</p>

Menyusun data contoh #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons

rng = np.random.default_rng(42)
X, _ = make_moons(n_samples=1_000, noise=0.08, random_state=42)

anomaly_index = np.arange(0, 1_000, 60)
X[anomaly_index] *= 2.5  # memperbesar sebagian titik agar menjadi outlier

plt.figure(figsize=(6, 6))
plt.scatter(X[:, 0], X[:, 1], s=10, alpha=0.6, label="observasi")
plt.scatter(X[anomaly_index, 0], X[anomaly_index, 1], marker="x", s=80, c="red", label="anomali yang disisipkan")
plt.legend()
plt.title("Data dua dimensi dengan anomali")
plt.tight_layout()
plt.show()

Menyusun data contoh (diagram)

Melatih Isolation Forest #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from sklearn.ensemble import IsolationForest

detector = IsolationForest(
    n_estimators=200,
    max_samples=256,
    contamination=0.02,
    random_state=42,
)
detector.fit(X)

scores = detector.decision_function(X)
pred = detector.predict(X)  # -1 berarti outlier
detected_index = np.where(pred < 0)[0]

Parameter contamination mengontrol perkiraan proporsi outlier di dataset. Jika tidak yakin, mulai dari nilai kecil lalu tingkatkan secara bertahap.

Memvisualisasikan hasilnya #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
plt.figure(figsize=(6, 6))
plt.scatter(X[:, 0], X[:, 1], s=10, alpha=0.5, label="observasi")
plt.scatter(
    X[detected_index, 0],
    X[detected_index, 1],
    facecolor="none",
    edgecolor="crimson",
    s=90,
    label="anomali terdeteksi",
)
plt.title("Deteksi anomali dengan Isolation Forest")
plt.legend()
plt.tight_layout()
plt.show()

Memvisualisasikan hasilnya (diagram)

Tips praktis #

  • Jangan membuat contamination terlalu besar—nilai tinggi akan menyebabkan banyak false positive. Untuk log produksi, nilai 0.01 atau lebih kecil biasanya aman.
  • max_samples menentukan ukuran subsample setiap pohon. Jika dataset sangat besar, gunakan nilai tetap (misalnya 512) agar pelatihan tetap cepat.
  • Gunakan decision_function bila Anda perlu mengurutkan anomali berdasarkan skor. Threshold dapat disesuaikan belakangan tanpa melatih ulang model.
  • Kombinasikan dengan scaler (StandardScaler atau RobustScaler) jika tiap fitur memiliki skala yang sangat berbeda.