Ana içeriğe geç

Anomali Tespitine Kapsamlı Bir Giriş

Anomali tespitinin temellerini ustalıkla öğrenmeye yönelik bir eğitim — kavramlar, terminoloji ve kod.
· 14 dk. oku

Yapay Zeka ile Keşfedin

Herkes öne çıkmayı, farklı olmayı sever. Ancak bir veri bilimci olarak, verilerinizde görmek istediğiniz özellik bu değildir. Bir veri kümesindeki sapkın veri noktaları ya da anomaliler, neredeyse tüm veri projelerini etkileyen en tehlikeli veri kalitesi sorunlarından biridir.

Sadece aykırı değer içermeyen, özenle hazırlanmış açık kaynak veri kümeleriyle çalıştıysanız bu son cümle sizi şaşırtabilir. Oysa gerçek dünyadaki veri kümeleri her zaman normal örneklerden bazı farklılıklar içerir. Bunları tespit etmek ve uygun şekilde ele almak sizin işinizdir.

Bu yazıda, sıklıkla anomali tespiti olarak adlandırılan bu sürecin temel fikirlerini öğreneceksiniz:

  1. Anomalilerin projenize verdiği zararlı etki.
  2. Anomalileri tespit etmenin önemi.
  3. Anomali tespitinin gerçek dünya uygulamaları.
  4. Anomali, aykırı değer ve yenilik (novelty) arasındaki fark.
  5. Anomali türleri ve anomali tespit yöntemleri.
  6. Python ile anomali tespit algoritmalarının nasıl kurulacağı.
  7. Anomali tespitinin zorluklarıyla nasıl başa çıkılacağı.

Sonunda, anomali tespitinin temellerine hâkim olacak ve projelerinizde aykırı değerlerin bozucu etkisini azaltma konusunda güven kazanacaksınız.

Anomali Tespiti Nedir?

Anomali tespiti, bazen aykırı değer tespiti olarak da adlandırılır; bir veri kümesinde beklenen ya da “normal davranıştan” önemli ölçüde sapan örüntüleri veya örnekleri bulma sürecidir.

Hem “normal”in hem de anormal verinin tanımı bağlama göre önemli ölçüde değişir. Aşağıda, anomali tespitinin iş başındaki birkaç örneğini bulabilirsiniz.

1. Finansal işlemler

Normal: Londra’da bir kişinin rutin alışverişleri ve tutarlı harcamaları.

Aykırı değer: Aynı hesaptan İrlanda’da yapılan yüklü bir para çekme işlemi; olası dolandırıcılığa işaret eder.

2. Siber güvenlikte ağ trafiği

Normal: Düzenli iletişim, istikrarlı veri transferi ve protokole uyum.

Aykırı değer: Veri transferinde ani artış veya bilinmeyen protokollerin kullanımı; olası bir ihlal ya da kötü amaçlı yazılım sinyali.

3. Hasta hayati bulgularının izlenmesi

Normal: Stabil kalp atış hızı ve tutarlı kan basıncı

Aykırı değer: Kalp atış hızında ani artış ve kan basıncında düşüş; olası bir acil durum veya ekipman arızasına işaret eder.

Anomali tespiti, sapkın örnekleri belirlemek için birçok türde gözetimsiz yöntemi kapsar. Veri uzmanları, anomali türüne, bağlama, veri kümesinin yapısına ve özelliklerine göre seçim yapar. Bunları sonraki bölümlerde ele alacağız.

Anomali Tespitinin Gerçek Dünya Uygulamaları

Yukarıda bazı örnekler görmüş olsak da, anomali tespitinin finansta nasıl çalıştığına dair gerçek bir hikâyeye bakalım.

Dört kez NBA şampiyonu Shaq O’Neal, Miami Heat’ten Phoenix Suns’a takas edilir. Phoenix Suns’ın sağladığı boş daireye gelen Shaq, gece yarısında dairesini hemen döşemek ister. Walmart’a gider ve Walmart tarihindeki en büyük alışverişi, 70.000 $ tutarında yapar. En azından denemeye çalışır; kartı reddedilir.

Sorunun ne olabileceğini merak eder (parasız olamaz ya!) Sabah 2’de American Express güvenlik birimi arar ve kartının çalındığından şüphelendiklerini, çünkü Phoenix’te bir Walmart’ta 70.000 $ tutarında bir alışveriş yapılmaya çalışıldığını söyler (hikâyenin tamamını duymak için anekdotu izleyin).

Finans ve dolandırıcılık tespitinin ötesinde, anomali tespitinin çok sayıda gerçek dünya uygulaması vardır:

  • Siber güvenlik
  • Sağlık hizmetleri
  • Endüstriyel ekipman izleme
  • Ağ saldırı tespiti
  • Enerji şebekesi izleme
  • E-ticaret ve kullanıcı davranışı analizi
  • Üretimde kalite kontrol

Anomali tespiti, günlük kullandığımız hizmetlerin derinliklerine işlemiştir ve çoğu zaman farkına bile varmayız.

Veri Biliminde Anomali Tespitinin Önemi

Veri, veri biliminde en değerli varlıktır; anomaliler ise kalitesine yönelik en bozucu tehditlerdir. Kötü veri kalitesi şu alanlarda kötü sonuçlar doğurur:

  • İstatistiksel testler
  • Panolar (dashboard’lar)
  • Makine öğrenmesi modelleri
  • Kararlar

ve nihayetinde, bilgiye dayalı karar verme için temelin zedelenmesine yol açar.

Anomaliler, istatistiksel analizleri var olmayan örüntüler ekleyerek saptırır; bu da yanlış çıkarımlara ve güvenilmez tahminlere neden olur. Genellikle veri kümesindeki aşırı değerlere karşılık geldiklerinden, dağılımların en önemli iki özelliğini, yani ortalama ve standart sapmayı çarpıtma eğilimindedirler.

Hemen hemen tüm makine öğrenmesi modellerinin iç işleyişi bu iki ölçüme büyük ölçüde dayandığından, anomalilerin zamanında tespiti kritik önemdedir.

Anomali Türleri

Anomali tespiti iki geniş uygulamayı kapsar: aykırı değer tespiti ve yenilik (novelty) tespiti.

Aykırı değerler, yalnızca eğitim verisinde bulunan anormal ya da aşırı veri noktalarıdır. Buna karşın yenilikler, orijinal (eğitim) verisine kıyasla yeni ya da daha önce görülmemiş örneklerdir.

Örneğin bir şehirdeki günlük sıcaklıklardan oluşan bir veri kümesini düşünün. Günlerin çoğunda sıcaklıklar 20°C ile 30°C arasında değişir. Ancak bir gün 40°C’lik bir sıçrama olur. Bu aşırı sıcaklık, olağan günlük sıcaklık aralığından önemli ölçüde saptığı için bir aykırı değerdir.

Şimdi, şehrin daha doğru bir hava izleme istasyonu kurduğunu hayal edin. Sonuç olarak, veri kümesi sürekli olarak biraz daha yüksek sıcaklıklar kaydetmeye başlar; 25°C ile 35°C aralığında. Bu kalıcı artış, gelişmiş izleme sistemi tarafından tanıtılan yeni bir örüntüyü temsil ettiği için bir yeniliktir.

Öte yandan anomaliler, hem aykırı değerleri hem de yenilikleri kapsayan geniş bir terimdir. Herhangi bir bağlamda, herhangi bir anormal örneği tanımlamak için kullanılabilir.

Anomali türünü belirlemek kritik önemdedir; çünkü onları tespit etmek için doğru algoritmayı seçmenizi sağlar.

Aykırı Değer Türleri

İki tür anomali olduğu gibi, iki tür aykırı değer de vardır: tek değişkenli (univariate) ve çok değişkenli (multivariate). Türe bağlı olarak farklı tespit algoritmaları kullanırız.

  1. Tek değişkenli aykırı değerler, tek bir değişkende ya da özelliğin kendi başına var olur. Bu aykırı değerler, ilgili özellikletipik değer aralığından sapan aşırı ya da anormal değerlerdir.
  2. Çok değişkenli aykırı değerler ise birden fazla değişkenin değerlerinin aynı anda birleştirilmesiyle bulunur.

Örneğin bir mahallenin konut fiyatlarından oluşan bir veri kümesini düşünün. Evlerin çoğu 200.000 $ ile 400.000 $ arasında fiyatlanmış olsun; ancak 1.000.000 $ gibi olağanüstü yüksek fiyata sahip A Evi bulunsun. Sadece fiyatı analiz ettiğimizde A Evi bariz bir aykırı değerdir.

Şimdi veri kümemize iki değişken daha ekleyelim: metrekare ve yatak odası sayısı. Metrekareyi, yatak odası sayısını ve fiyatı birlikte ele aldığımızda garip görünen ev B Evi olur:

  • Ortalama evin metrekare değerinin yarısına sahiptir.
  • Sadece bir yatak odası vardır.
  • Fiyatı ise aralığın tepesinde, 380.000 $.

Bu değişkenlere tek tek baktığımızda sıradan görünebilirler. Ancak birlikte ele aldığımızda B Evi’nin açık bir çok değişkenli aykırı değer olduğunu anlarız.

Anomali Tespit Yöntemleri ve Hangisini Ne Zaman Kullanmalı

Anomali tespit algoritmaları, aykırı değer türüne ve veri kümesindeki yapıya bağlı olarak farklılık gösterir.

Tek değişkenli aykırı değer tespiti için en popüler yöntemler şunlardır:

  1. Z-skoru (standart skor): z-skoru, bir veri noktasının ortalamadan kaç standart sapma uzakta olduğunu ölçer. Genellikle z-skoru 3’ün üzerinde olan örnekler aykırı değer olarak seçilir.
  2. Çeyrekler arası aralık (IQR): IQR, bir dağılımın birinci çeyreği (Q1) ile üçüncü çeyreği (Q3) arasındaki aralıktır. Bir örnek, IQR’in belirli bir katı kadar Q1’in altına ya da Q3’ün üstüne düşerse aykırı kabul edilir. En yaygın katsayı 1,5’tir; bu da aykırı değer aralığını [Q1–1.5 × IQR, Q3 + 1.5 × IQR] yapar.
  3. Değiştirilmiş z-skorları: z-skorlarına benzer; ancak değiştirilmiş z-skorları, aykırı değerleri bulmak için ortalama yerine medyanı ve Medyan Mutlak Sapma (MAD) adlı bir ölçüyü kullanır. Ortalama ve standart sapma aykırı değerlerden kolayca etkilenebildiği için değiştirilmiş z-skorları genellikle daha sağlam kabul edilir.

Çok değişkenli aykırı değerler için genellikle makine öğrenmesi algoritmaları kullanırız. Derinlikleri ve gücü sayesinde karmaşık veri kümelerinde girift örüntüler bulabilirler:

  1. Isolation Forest: her bir örneği izole edene dek karmaşık veri kümelerini özyinelemeli olarak bölen izolasyon ağaçları (karar ağaçlarına benzer) koleksiyonunu kullanır. En hızlı izole edilen örnekler aykırı kabul edilir.
  2. Yerel Aykırı Değer Faktörü (LOF): LOF, bir örneğin yerel yoğunluk sapmasını komşularına göre ölçer. Önemli ölçüde daha düşük yoğunluğa sahip noktalar aykırı olarak seçilir.
  3. Kümeleme teknikleri: k-means veya hiyerarşik kümeleme gibi teknikler veri kümesini gruplara ayırır. Herhangi bir gruba ait olmayan veya kendi küçük kümelerinde bulunan noktalar aykırı kabul edilir.
  4. Açı Tabanlı Aykırı Değer Tespiti (ABOD): ABOD, bireysel noktalar arasındaki açıları ölçer. Garip açılara sahip örnekler aykırı sayılabilir.

Anomali türünün yanı sıra, veri kümesinin özelliklerini ve proje kısıtlarını da dikkate almalısınız. Örneğin Isolation Forest neredeyse her veri kümesinde iyi çalışır; ancak topluluk (ensemble) yöntemi olduğundan daha yavaş ve hesaplama açısından ağırdır. Karşılaştırıldığında LOF eğitimi çok hızlıdır; ancak Isolation Forest kadar iyi performans göstermeyebilir.

Python Outlier Detection (PyOD) paketi üzerinden 55 veri kümesinde en yaygın Anomali Tespit algoritmalarının karşılaştırmasını görebilirsiniz.

Python ile Anomali Tespit Modeli Kurma

Neredeyse her görevde olduğu gibi, Python’da anomali tespiti yapmak için birçok kütüphane vardır. En iyi adaylar şunlardır:

  • Python Outlier Detection (PyOD)
  • Scikit-learn

Scikit-learn beş klasik makine öğrenmesi algoritması sunarken (bunları hem tek değişkenli hem çok değişkenli aykırı değerler için kullanabilirsiniz), PyOD basit yöntemlerden (MAD gibi) karmaşık derin öğrenme modellerine kadar 30’dan fazla algoritma içerir. Özel modeller için TensorFlow veya PyTorch da kullanabilirsiniz; ancak bunlar bu yazının kapsamı dışındadır.

Tek değişkenli anomali tespiti

sklearn ile tutarlı bir API’ye ve zengin algoritma kütüphanesine sahip olduğu için pyod’u tercih ediyorum. PyOD ile bir veri kümesindeki aykırı değerleri bulmak ve çıkarmak sadece birkaç satır kod alır. İşte tek değişkenli bir veri kümesinde MAD kullanımına bir örnek:

import pandas as pd
import seaborn as sns
from pyod.models.mad import MAD

# Load a sample dataset
diamonds = sns.load_dataset("diamonds")
# Extract the feature we want
X = diamonds[["price"]]

# Initialize and fit a model
mad = MAD().fit(X)

# Extract the outlier labels
labels = mad.labels_

>>> pd.Series(labels).value_counts()
0    49708
1     4232
Name: count, dtype: int64

Kodu satır satır inceleyelim. Önce veri işleme, veri kümesi yükleme ve aykırı değer tespit modeli için pyod dahil gerekli kütüphaneleri yüklüyoruz. Ardından, Seaborn’a gömülü Diamonds veri kümesini yükledikten sonra elmas fiyatlarını çıkarıyoruz.

Sonrasında, tek satırda Medyan Mutlak Sapma (MAD) modelini X üzerine başlatıp fit ediyoruz. Daha sonra, mad’in labels_ özniteliğini kullanarak iç değer ve aykırı değer etiketlerini labels değişkenine alıyoruz.

En sonda labels’ın değer sayılarını yazdırdığımızda, 49708 kaydın 0 (iç değer), 4232 kaydın ise 1 (aykırı değer) kategorisine ait olduğunu görüyoruz. Orijinal veri setinden aykırı değerleri kaldırmak istersek, diamonds üzerinde pandas ile alt kümeleme yapabiliriz:

outlier_free = diamonds[labels == 0]

>>> len(outlier_free)
49708

labels == 0, True’nun iç değeri gösterdiği bir Doğru/Yanlış (boolean) dizi oluşturur.

Çok değişkenli anomali tespiti

Çok değişkenli bir anomali tespit modeli oluşturma süreci de aynıdır. Ancak kategorik özellikler varsa, çok değişkenli aykırı değer tespiti ek işlem adımları gerektirir:

>>> diamonds.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53940 entries, 0 to 53939
Data columns (total 10 columns):
#   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
0   carat    53940 non-null  float64
1   cut      53940 non-null  category
2   color    53940 non-null  category
3   clarity  53940 non-null  category
4   depth    53940 non-null  float64
5   table    53940 non-null  float64
6   price    53940 non-null  int64  
7   x        53940 non-null  float64
8   y        53940 non-null  float64
9   z        53940 non-null  float64
dtypes: category(3), float64(6), int64(1)
memory usage: 3.0 MB

pyod tüm özelliklerin sayısal olmasını beklediğinden, kategorik değişkenleri kodlamamız gerekir. Bunu yapmak için Sklearn kullanacağız:

from sklearn.preprocessing import OrdinalEncoder

# Initialize the encoder
oe = OrdinalEncoder()

# Extract the categorical feature names
cats = diamonds.select_dtypes(include="category").columns.tolist()

# Encode the categorical features
cats_encoded = oe.fit_transform(diamonds[cats])

# Replace the old values with encoded values
diamonds.loc[:, cats] = cats_encoded

>>> diamonds.head()

Elmas veri kümesi

Kodu yine satır satır inceleyelim. Önce sıralı kategorik özellikleri kodlayan OrdinalEncoder sınıfını içe aktarıp başlatıyoruz. Sıralı (ordinal) özellikler, elmas kalite ölçümlerinde olduğu gibi doğal, sıralı kategorilere sahip değişkenlerdir. Kesim (cut) ve berraklık (clarity) sıralıdır; renk (color) değildir. Ancak işleri karmaşıklaştırmamak için şimdilik onu da sıralı kabul edeceğiz.

Ardından, Pandas DataFrame’lerinin select_dtypes yöntemini kullanarak kategorik özellik adlarını çıkarıyoruz. Sütun adlarını bir liste olarak almak için .columns ve .tolist() özniteliklerini zincirliyoruz.

Daha sonra bu listeyi kullanarak oe ile istediğimiz özellikleri dönüştürüyoruz. Son olarak, .loc ile yaptığımız pratik bir Pandas hilesiyle eski metin değerlerini sayısal olanlarla değiştiriyoruz.

Çok değişkenli bir modeli fit etmeden önce özellik dizisi X’i çıkaracağız. diamonds veri kümesinin amacı, özelliklerine göre elmas fiyatlarını tahmin etmektir. Dolayısıyla X, price dışındaki tüm sütunları içerecek:

X = diamonds.drop("price", axis=1)
y = diamonds[["price"]]
Now, let’s build and fit the model:
from pyod.models.iforest import IForest

# Create a model with 10000 trees
iforest = IForest(n_estimators=10000)
iforest.fit(X)  # This will take a minute

# Extract the labels
labels = iforest.labels_

IForest kestiricisinin ağaç sayısı arttıkça, modeli veri setine fit etmesi daha fazla zaman alır.

Etiketleri aldıktan sonra, aykırı değerleri orijinal veriden kaldırabiliriz:

X_outlier_free = X[labels == 0]
y_outlier_free = X[labels == 0]

>>> len(X_outlier_free)
48546

>>> # The length of the original dataset
>>> len(diamonds)
53940

Model 5000’den fazla aykırı değer buldu!

Anomali Tespitindeki Zorluklar

Anomali tespiti, gözetimsiz doğası nedeniyle diğer makine öğrenmesi görevlerinden daha büyük zorluklar barındırabilir. Ancak bu zorlukların çoğu çeşitli yöntemlerle hafifletilebilir (kaynaklar için bir sonraki bölüme bakın).

Aykırı değer tespitinde şu iki soruyu sormamız gerekir:

  • Bulunan aykırı değerler gerçekten aykırı değer mi?
  • Model, verideki tüm aykırı değerleri buldu mu?

Gözetimli öğrenmede, modelin iyi performans gösterip göstermediğini, test verisindeki tahminlerini gerçek etiketlerle karşılaştırarak kolayca kontrol edebiliriz. Ancak aykırı değer tespitinde, hangi örneklerin iç değer hangilerinin aykırı olduğunu söyleyen hazır etiketler olmadığından aynısını yapamayız.

Dolayısıyla, elmas veri setinden bulunan 5000+ aykırı değerin bir kısmı ya da çoğu gerçekte aykırı olmayabilir! Bunu kesin olarak bilmenin bir yolu yoktur. Bazı iç değerleri aykırı olarak etiketlemiş, bazı gerçek aykırıları ise kaçırmış olabilir.

Bir veri kümesindeki aykırı değer yüzdesi olan bulaşma düzeyini (contamination level) bilmeme sorunu, anomali tespitindeki en büyük sorundur. Bu nedenle aykırı değer sınıflandırıcılarının performansını güvenilir şekilde ölçemeyiz ve sonuçlarını doğrulayamayız.

Bu yüzden, pyod içindeki tüm kestiricilerde varsayılanı 0.1 olan contamination adlı bir parametre bulunur. Bir makine öğrenmesi mühendisi olarak, bu parametreyi kendiniz ayarlamalısınız.

Elbette bazen alternatifler vardır. Örneğin, Sklearn’in sunduğu IsolationForest modeli bulaşma düzeyini otomatik olarak bulmak için dahili bir algoritmaya sahiptir. Ancak IsolationForest, tüm aykırı değer tespiti problemleri için sihirli bir çözüm değildir.

Anomali tespitindeki bir diğer sorun ise sınıf dengesizliğidir. Anomaliler genellikle normal örneklere göre nadirdir; bu da veri kümelerinin dengesiz olmasına neden olur. Bu dengesizlik, gerçek anomaliler ile çoğunluk sınıfındaki düzensizlikleri ayırt etmeyi zorlaştırabilir.

Bu sorunların (ve burada ele almadığımız daha nicelerinin) üstesinden gelmek, uygun algoritmaların seçilmesini, hiperparametre ayarlamasını, özellik seçimini, sınıf dengesizliğinin ele alınmasını vb. içerir.

Özet ve Sonraki Adımlar

Anomali tespitiyle büyüleyici dünyaya (muhtemelen) ilk temasınızı tamamladık. Bu dersteki temel kavramlar ve beceriler, anomali tespitini daha derinlemesine keşfetmenizde size epey yol aldırabilir.

Bilginizi derinleştirmek için sıradaki bazı kaynaklar:

Bexruz (Bex) Tuychiev

Yazar

Bexruz (Bex) Tuychiev

2 yılı aşkın deneyime sahip bir veri bilimi içerik üreticisiyim ve Medium’da en büyük takipçi kitlelerinden birine sahibim. Yapay zekâ ve makine öğrenimi üzerine, biraz da alaycı bir üslupla yazılmış, ayrıntılı makaleler kaleme almayı seviyorum; çünkü onları biraz daha az sıkıcı hale getirmek için bir şeyler yapmak gerekiyor. 130’un üzerinde makale ve bir de DataCamp kursu ürettim; bir diğeri de hazırlık aşamasında. İçeriklerim 5 milyondan fazla kişi tarafından görüldü; bunların 20 bini Medium ve LinkedIn’de takipçim oldu. 

Konular

İlgili