Anomali Tespiti
Anomaly Detection
Veride 'normal'in dışında kalan, beklenmedik örnekleri otomatik bulan teknik — dolandırıcılık, sunucu arızası, sağlık anomalileri, ağ saldırılarında temel araç.
Anomali tespiti, çoğunluğu normal olan bir veri kümesinde az sayıdaki "tuhaf" örneği yakalamaya odaklanır. Klasik sınıflandırmadan farkı şudur: anormal sınıf çok nadirdir (bazen %0.1'in altı), etiketler güvenilmezdir, tüm anomali türlerini önceden bilmek imkânsızdır. Bu yüzden klasik denetimli yöntemler genelde yetersizdir; özel yaklaşımlar gerekir.
Üç ana strateji vardır:
- İstatistiksel yöntemler: z-skor, modifiye z-skor, IQR bazlı kurallar. Tek değişkenli, basit, açıklanabilir. Çok boyutlu ve karmaşık ilişkili verilerde yetersiz. - Denetimsiz öğrenme: Isolation Forest, One-Class SVM, Local Outlier Factor (LOF), DBSCAN'in gürültü etiketleri. Çok boyutlu veride iyi; anomali etiketine ihtiyaç yok. - Yarı denetimli / denetimli: az sayıda anomali etiketi varsa, dengesiz sınıflandırma teknikleri (sınıf ağırlığı, SMOTE, focal loss) ile gradient boosting. - Derin öğrenme: Autoencoder yeniden inşa hatası, Variational AE, GAN tabanlı yaklaşımlar. Görüntü, ses, sıralı veride güçlü.
Önemli olan şudur: "anomali" iş bağlamına bağlıdır. Sunucu için CPU %95 anormaldir; bir oyun sunucusu için Cuma akşamı %95 normaldir. İş ekibi olmadan eşik konulamaz.
Bir limanda gümrük memurunun çalışması gibidir. Günde 50.000 konteyner geçiyor; çoğu standart, beklenen şirketlerden geliyor, beklenen ürünleri taşıyor. Memur anormali fark eder: 'Pamuk' yazılı konteynırın ağırlığı normalden iki kat yüksek; 'mobilya' diye gelen bir yük tarihte hiç çıkmamış bir limandan; rotanın üç sapma noktası var. Memur tüm 'kuralları' önceden bilmiyor, ama beklentinin dışındaki örüntüleri tanır. Anomali tespiti bu sezginin matematiksel karşılığıdır.
Bir bulut sağlayıcısı 100.000 sunucunun her saniyeki metriğini izliyor: CPU, bellek, disk I/O, ağ, hata oranı. Hangi sunucu arıza yapmak üzere?
İlk denenen: eşik tabanlı kurallar (CPU > %90, hata > 100/saat). Sonuç: günde 5000 alarm, %95'i yanlış; ekip alarmları görmezden geliyor. Klasik alarm yorgunluğu.
Yeni yaklaşım: Isolation Forest her sunucu için 8 özellikli bir vektör üretir, bu vektör tarihsel kümelemeden uzaksa skor yüksek. Üstüne sunucunun kendi geçmişine göre baseline çıkarılır; anomali = mutlak değer DEĞİL, kendi normalinden sapma. Günde 50 alarm kalır, %80'i gerçek arıza. Operasyon ekibi tekrar alarmlara güvenmeye başlar.
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import StandardScaler
# Etiketsiz veri — sadece özellikler
X_scaled = StandardScaler().fit_transform(X)
# contamination: anomali oranı tahmini
iso = IsolationForest(
n_estimators=200,
contamination=0.01, # ~%1 anomali bekleniyorsa
random_state=42,
)
iso.fit(X_scaled)
# -1 = anomali, 1 = normal
labels = iso.predict(X_scaled)
# Skor da alabilirsin (negatif → daha anormal)
scores = iso.score_samples(X_scaled)
# En aykırı 100 örneği işaretle
worst = scores.argsort()[:100]import torch
import torch.nn as nn
class AE(nn.Module):
def __init__(self, dim=20, latent=4):
super().__init__()
self.enc = nn.Sequential(nn.Linear(dim, 16), nn.ReLU(), nn.Linear(16, latent))
self.dec = nn.Sequential(nn.Linear(latent, 16), nn.ReLU(), nn.Linear(16, dim))
def forward(self, x):
z = self.enc(x)
return self.dec(z)
# Sadece NORMAL veriyle eğit
# Anomali → yeniden inşa hatası yüksek olur
model = AE().train()
for x in normal_loader:
recon = model(x)
loss = nn.functional.mse_loss(recon, x)
loss.backward()
optimizer.step()
optimizer.zero_grad()
# Yeni veride hata hesapla
model.eval()
with torch.no_grad():
errors = ((model(X_test) - X_test) ** 2).mean(dim=1)
threshold = errors.quantile(0.99)
anomalies = errors > threshold- Pozitif sınıf çok nadir (%1 altı) ve denetimli model zorlanıyorsa
- Etiket yok ya da çok az; veriden 'normal'i öğrenmek lazımsa
- Sunucu telemetrisi, fraud, ağ trafiği, sensör verisinde
- İlk kez görülecek anomali türlerine de duyarlı olmak gerekiyorsa
- Sınıflar dengeliyse — düz sınıflandırma daha verimli
- Ne 'anormal' demek belirsizse — önce iş tanımı yap
- Açıklanabilirlik kritikse ve karmaşık modelleri savunamıyorsan
Eşiği iş bağlamı olmadan seçmek
Skor dağılımının %99 quantile'ı 'anormal' demek değil. Ürün ekibi, alarmın maliyetiyle kaçırmanın maliyetini tartmadan eşik konamaz.
Veri kayma (drift) sızıntısı
Eğitim verisinde 'normal' olan canlıda değişebilir. Bayram günleri, yeni özellik çıkışı, sezonsal etkiler 'normal'i kaydırır. Modeli düzenli yeniden eğit.
Tek bir global eşik
100.000 sunucu için tek eşik anlamsız — her sunucunun kendi normali var. Per-entity baseline + sapma yaklaşımı çok daha doğru sonuç verir.