Isolation Forest Algoritması İle Temel Anomali Tespiti
İlk olarak Medium’da yayımlandı.
Anomali dediğimiz şey, bir veri setinde normale göre farklılık gösteren veya beklenmeyen bir özellik veya davranışı ifade eder. Anomali tespiti (anomaly detection), bu tür anormal verileri tanımlama ve belirleme işlemidir. Anomali tespiti, genellikle veri madenciliği, istatistik ve makine öğrenimi teknikleri kullanılarak geliştirilir. Anomali tespiti, birçok farklı uygulama alanında kullanılır.
- Güvenlik: Bilgisayar sistemlerini veya ağları korumak için kullanılır. Anormal ağ trafiği veya kullanıcı davranışlarını tespit ederek siber saldırıları engellemeye yardımcı olabilir.
- Sağlık İzleme: Tıbbi cihazlar ve sensörler aracılığıyla hastaların sağlık durumunu izlemek ve anormal durumları tespit etmek için kullanılır.
- Üretim ve Kalite Kontrol: Üretim süreçlerinde hataları veya kusurları tespit etmek amacıyla kullanılır. Örneğin, bir montaj hattında ürünlerin anormal davranışlarını belirlemek için kullanılabilir.
- Finansal Dolandırıcılık Tespiti: Kredi kartı işlemleri veya finansal işlemlerde sahtekarlık veya dolandırıcılık girişimlerini tespit etmek için kullanılır.
- Çevre İzleme: Hava kirliliği, su kirliliği veya diğer çevresel faktörlerin izlenmesi ve anormal durumların belirlenmesi amacıyla kullanılır.
Anomali tespitinde iki temel yaklaşım kullanılır:
- İstatistiksel Yaklaşım: Verilerin istatistiksel özellikleri analiz edilir ve anormal değerler, genellikle istatistiksel sapma veya benzeri kriterlere dayalı olarak tespit edilir.
- Makine Öğrenimi Yaklaşımı: Verileri bir model eğiterek normal davranışı öğrenir ve daha sonra yeni verileri bu modele göre değerlendirir. Eğer yeni veri modelin öğrendiği normal davranıştan sapma gösteriyorsa, bu veri anormal olarak işaretlenir.
Anomali Tespitinin Değerlendirilmesi
Anomali tespiti yöntemlerini değerlendirmek için bazı önemli kriterleri göz önünde bulundurmak gerekir.
- Ölçeklenebilirlik (Ability to Scale): Veri miktarının arttırılabilirliği açısından ne kadar esnek ve ölçeklenebilir olduğuna dikkat edilir. Büyük veri kümeleriyle başa çıkmak için yeterli kaynakları ve altyapıyı sağlamalıdır.
- Gerçek Zamanlı Tespit (Real-Time Detection): Bazı uygulamalar için hızlı yanıt gereklidir. Bu nedenle anomali tespiti yöntemi, gerçek zamanlı tespit yeteneği sunmalıdır.
- Doğruluk (Accuracy): Yöntemin ne kadar doğru sonuçlar ürettiği çok önemlidir. Yanlış pozitifler ve yanlış negatifler olasılığını en aza indirgemek için yeterince hassas olunmalıdır.
- Uygulama Maliyeti (Cost of Implementation): Yöntemi uygulamak için donanım, yazılım ve insan kaynaklarının maliyetini değerlendirmek elzemdir. Hem başlangıç maliyeti hem de sürekli maliyetler dikkate alınmalıdır.
- Bakım Maliyeti (Cost to Maintain): Sistemin işletilmesi ve güncel tutulması için tüm maliyetlerin değerlendirilmesi gerekir. Yöntemin uzun vadeli sürdürülebilirliği ve bakım kolaylığı, maliyetleri etkiler.
Makine Öğrenmesi İle Anomali Tespiti
Bir anomali tespiti uygulaması için temel olarak, makine öğrenmesi modeli normal veri örüntülerini öğrenir ve daha sonra bu örüntülerden sapmaları tespit eder. Bu kapsamda farklı ML teknikleri anomali tespiti için kullanılmaktadır. Bu makale kapsamında İzolasyon Ormanları (Isolation Forest) tekniği ile devam edeceğiz.
İzolasyon Ormanları (Isolation Forests)
Anomali tespiti için kullanılan etkili bir makine öğrenimi tekniğidir. Bu algoritma, özellikle hızlı ve etkili bir şekilde anormal veri noktalarını tespit etmek için tasarlanmıştır. İzolasyon ormanları makine öğrenimi içerisinde gözetimsiz öğrenme sınıfına girer.
İzolasyon Ormanları, normal veri noktalarının daha kolay izole edileceği ve anormal veri noktalarının izole edilme olasılığının daha düşük olduğu temel bir prensibe dayanır ve bu fikri kullanarak veri noktalarını izole etmeye çalışır. İzole edilen veri noktalarının anormal olma olasılığı daha yüksektir. İzolasyon ormanlarının temel çalışma prensipleri şu şekildedir:
- Rastgele Veri Bölme: Algoritma, veri kümesini rastgele böler. Bölmeler, veri noktalarını özelliklerine göre ikiye ayırır. Bu işlem ağaç yapısı oluşturmak için kullanılır.
- Ağaç Yapısı: Her ağaç, veri kümesinin bir alt kümesini içerir. Bu ağaçlar, özyinelemeli olarak alt kümelere ayrılır. Her bölme, veri noktalarını daha küçük alt kümelere böler.
- Yol Uzunluğu Hesaplama: Bir veri noktasının bir ağaçtaki yol uzunluğu, o ağaçtaki kökten yaprağa giden yolun uzunluğu olarak hesaplanır. Bu uzunluk, bu veri noktasının izolasyon seviyesini temsil eder.
- Ortalama Yol Uzunluğu: Tüm ağaçlardaki yol uzunluklarının ortalaması alınarak bir veri noktasının toplam izolasyon seviyesi hesaplanır. Anormal veri noktaları daha kısa yollarla izole edilirken, normal veri noktaları daha uzun yollarla izole edilir.
- Anomali Puanı: Bir veri noktasının anomali puanı, ortalamadan sapma değeri olarak hesaplanır. Daha yüksek anomali puanları, daha anormal veri noktalarını gösterir.
Scikit-Learn Kullanarak Bir Veri Setinde Anomali Tespiti Yapmak
Scikit-Learn, makine öğrenimi algoritmalarını kullanabileceğiniz bir Python kütüphanesidir. Bu bağlamda, İzolasyon Ormanları algoritmasını kullanarak bir verideki anormallikleri tespit etmek için bir örnek oluşturacağız.
İlgili kütüphanelerin içeri aktarılması (import):
import pandas as pd
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt
Bu noktada üç farklı kütüphane kullanacağız. İlk olarak verileri işlemek ve kullanılabilir hale getirmek için Pandas kütüphanesini kullanacağız. Ardından, İzolasyon Ormanı algoritması ile model eğitimi yapmak için scikit-learn (sklearn) kütüphanesini kullanacağız. Son olarak, sonuçları görselleştirmek için matplotlib kütüphanesini kullanacağız.
Veri Setinin Bulunması ve İşlenmesi
Bu örnekte Kaggle platformunda bulunan bu veri setini kullanacağız. Kaggle üzerinde istediğiniz alana yönelik birçok veri seti bulabilirsiniz.
İlk olarak veri seti içerisindeki başlıklara baktığımızda, birçoğunun bu noktada işimize yaramayacağını fark ederiz. Sadece iki veri, miktar (amount) ve tarih (date), bu örnekte bizim için yeterli olacak.
data = pd.read_csv("expense_data_1.csv")
İlk olarak pandas ile csv dosyaları kod içerisine alınır.
data = data[data["Income/Expense"] == "Expense"]
new_data = data[["Date", "Amount"]]
Burada “Income/Expense” sütununda sadece harcama (expense) değerlerini ayıklıyoruz.
Not: Gelirleri de veri setine dahil edebilirsiniz, ancak bu uygulama kapsamında harcamalar üzerinden bir anomali analizi yapmak tercih edilmiştir.
Daha sonra veri seti içerisinde “Date” ve “Amount” sütunlarından veriler alınır ve yeni bir veri seti oluşturulur.
new_data['Date'] = pd.to_datetime(new_data['Date']).dt.date
new_data.to_csv("expense.csv", index=False)
Burada “Date” verisinin içerisinden sadece tarih kısmını kullanacak şekilde düzenlenir ve daha sonra verinin son hali kaydedilir.
Artık düzenlenmiş bir veri setine sahip olduğumuza göre model tarafına geçebiliriz.
Modelin Oluşturulması
import pandas as pd
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt
data = pd.read_csv("expense.csv")
df = pd.DataFrame(data)
df.columns = ['Date', 'Amount']
model = IsolationForest(contamination=0.07)
model.fit(df[['Amount']])
anomalies = model.predict(df[['Amount']])
anomalous_data = df[anomalies == -1]
print(anomalous_data)
df['Date'] = pd.to_datetime(df['Date'])
İlgili kütüphaneleri import ettikten sonra oluşturulan yeni veri seti kodun içerisine aktarılmalı ve bir DataFrame formatına getirilmelidir. Sütunlar “Date” ve “Amount” olarak alındıktan sonra kullanılacak İzolasyon Ormanı modeli ve kontaminasyon miktarı seçilir. “Kontaminasyon” terimi, bir veri kümesindeki anormal veri noktalarının yüzdesini temsil eder. Yani, kontaminasyon, veri kümesindeki toplam veri noktalarının ne kadarının anormal olduğunu ifade eder.
Veri setini modelin içerisine model.fit() metodu ile almalıyız. Dikkat edilmesi gereken nokta, burada sadece “Amount” sütunu modelin içerisine alındı. Bunun temel sebebi, bu modelin bir unsupervised yani denetimsiz öğrenme modeli olmasıdır. Date sütunu veriyi görselleştirdiğimiz zaman bir anlam kazanacak.
Model, genellikle öğrenilen desenlere dayanarak verileri inceleyerek her veri noktasının “normal” veya “anormal” olduğunu tahmin etmeye çalışır. Bu tahminler bir dizi veya seri olarak saklanır ve “anomalies” adında bir değişkenle temsil edilir. Bu işlem kod içerisinde tahminlemenin yapıldığı model.predict() metodu ile yapılır.
Daha sonra, tahmin edilen anormal verileri ayıklamak için bu “anomalies” değişkenini kullanıyoruz. “anomalies” dizisindeki değeri -1 olan tüm satırları, “df” adlı veri çerçevesinden seçiyoruz. İşaretlenen verileri içeren yeni bir veri çerçevesi olan “anomalous_data”yı oluşturur.
Sonuçların Görselleştirilmesi
plt.figure(figsize=(12, 6))
plt.scatter(df['Date'], df['Amount'], label='All value', color='blue', alpha=0.5)
plt.scatter(anomalous_data['Date'], anomalous_data['Amount'], label='Anomalous value', color='red', alpha=0.7)
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.title('Anomaly Detection')
plt.show()
Bu kod, Matplotlib kütüphanesini kullanarak bir saçılma grafiği oluşturur. İlk satır, grafiğin boyutlarını belirler, ikinci ve üçüncü satırlar ise iki farklı veri kümesini temsil eden noktaları farklı renklerle ve saydamlık dereceleriyle çizer. Sonraki satırlar etiketler, eksenler, başlık ve grafik yazılarını ekler, böylece normal ve anormal verilerin görsel olarak ayrılmasını sağlar ve bu bilgiyi daha iyi anlamamıza yardımcı olur. Son olarak, plt.show() ile grafik görüntülenir.
Grafikte, anormal veri noktaları kırmızı renkle ve normal veri noktaları mavi renkle temsil edilmiştir. Bu görselleştirme, modelin performansını değerlendirmemize yardımcı olur ve modelin anormal verileri ne kadar başarılı bir şekilde tanımladığını anlamamıza yardımcı olur.
Modelin Kaydedilmesi
import joblib
model_filename = 'isolation_forest_model.pkl'
joblib.dump(model, model_filename)
Modeli kaydedip farklı veri setlerinde kullanmak için yukarıdaki kodun projeye eklenmesi gerekmektedir. joblib, makine öğrenme modellerini .pkl uzantılı dosyalarda saklama imkanı sunar. Bu yöntem, eğitilmiş bir modeli kaydederek, daha sonra farklı projeler veya veri setleri üzerinde kullanmanızı sağlar.
Modelin Tekrar Kullanımı
model_filename = 'isolation_forest_model.pkl'
loaded_model = joblib.load(model_filename)
Modeli tekrar kullanmak için yukarıdaki kodu kullanarak projeye modeli yükleyebilirsiniz. Daha önceki gibi bu model üzerinden fit ve predict metodları çağırılarak anomali tespiti farklı veri setleri üzerinde yapılabilir.