Python ile SMOTE Örneği: Dengesiz Veri Setleri İçin Etkili Bir Çözüm

Giriş

Dengesiz veri setleri, birçok makine öğrenimi projesinde karşılaşılan yaygın bir sorundur. Özellikle sınıflar arasında çok büyük farklılıklar olduğunda, modelinizin doğru tahminler yapması zorlaşır. İşte bu noktada SMOTE (Synthetic Minority Over-sampling Technique) devreye giriyor. SMOTE, azınlık sınıfın örneklerinden yeni sentetik örnekler oluşturarak veri setinin dengelenmesine yardımcı olur.

Bu yazıda, Python dilinde SMOTE uygulamasına dair bir örnek üzerinden giderek nasıl çalıştığını, hangi kütüphaneleri kullanacağımızı ve adım adım nasıl uygulayacağımızı ele alacağız. Özellikle veri bilimi ve makine öğrenmesi alanında yeni başlayanlar için kapsayıcı ve anlaşılır bir içerik hazırlayarak bu konuyu derinlemesine keşfedeceğiz.

SMOTE Nedir?

SMOTE, dengesiz veri setlerinde azınlık sınıfın örneklerini artırmak amacıyla kullanılan bir yöntemdir. Dengesiz veri setleri, bir sınıfın çoğunlukta olduğu ve diğer sınıfların azınlıkta olduğu durumları ifade eder. Bu tür veri setleri, klasik makine öğrenimi algoritmalarının performansını olumsuz etkileyebilir, çünkü çoğunluk sınıfına ait örnekler üzerinde aşırı öğrenme (overfitting) yapma ihtimali artar.

SMOTE, azınlık sınıf örneklerini kullanarak yeni sentetik örnekler oluşturur. Bunun için, azınlık sınıfından seçilen her bir örnek etrafındaki diğer örneklerle bir araya getirilir ve bu örneklerden yeni bir sentetik örnek üretilir. Bu yeni örnek, mevcut veri setine eklenerek dengesizliğin azaltılmasına yardımcı olur. Bu yöntem, veri setini dengelemekten fazlasını yapar; aynı zamanda modelin genelleme yeteneğini artırır.

Python’da SMOTE Kullanımı

Python’da SMOTE uygulamak için genellikle ‘imbalanced-learn’ kütüphanesi kullanılır. Bu kütüphane, dengesiz veri setleri ile çalışmak için bir dizi faydalı araç sunar. İlk olarak gerekli kütüphaneyi yüklememiz gerekiyor. Bunu yapmak için terminal veya komut istemcisi üzerinden aşağıdaki komutu çalıştırabilirsiniz:

pip install imbalanced-learn

Kurulum tamamlandıktan sonra, SMOTE uygulamak için gereken kütüphaneleri içe aktaralım ve örnek veri setimizi oluşturalım. Bu örnek, yapay olarak dengesiz bir veri seti oluşturmayı içerecek:

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification

# Dengesiz veri seti oluşturma
data = make_classification(n_classes=2, class_sep=2,
                           weights=[0.9, 0.1], n_informative=3,
                           n_redundant=1, flip_y=0,
                           n_features=20, n_clusters_per_class=1,
                           n_samples=1000, random_state=42)
X, y = data

SMOTE ile Veri Setini Dengelemek

Artık dengesiz veri setimiz mevcut. Şimdi, SMOTE kullanarak azınlık sınıfın örneklerini artırmak için uygulamayı yapalım:

from imblearn.over_sampling import SMOTE

# SMOTE nesnesi oluşturma
generate = SMOTE(random_state=42)
X_res, y_res = generate.fit_resample(X, y)

Burada, ‘SMOTE’ sınıfını kullanarak yeni nesneler oluşturduk. ‘fit_resample’ metodu ile oluşturduğumuz dengesiz veri setine uygulayıp dengesiz veriyi dengeledik. Şimdi, eski ve yeni veri setinin büyüklüklerini karşılaştıralım:

print(f'Eski veri seti boyutu: {X.shape[0]}')
print(f'Yeni veri seti boyutu: {X_res.shape[0]}')

Sonuçların Analizi

Veri setimizi dengeledikten sonra, sınıfların dağılımını kontrol etmek önemlidir. Bunun için, her bir sınıfın örnek sayısını inceleyelim:

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5))
plt.hist(y, bins=2, alpha=0.5, label='Eski Veri')
plt.hist(y_res, bins=2, alpha=0.5, label='Yeni Veri')
plt.legend(loc='upper right')
plt.title('Sınıf Dağılımı')
plt.xlabel('Sınıf')
plt.ylabel('Örnek Sayısı')
plt.show()

Grafikte, eski ve yeni veri setlerinin nasıl bir dağılım sergilediğini göreceksiniz. İlk başta dengesiz olan veri, SMOTE ile daha dengeli bir hale gelmiştir. Bu durumda, modelinizin performansı genellikle iyileşecektir.

Model Eğitimi ve Değerlendirme

Şimdi, oluşturduğumuz dengeli veri setini kullanarak bir model geliştirelim. Burada basit bir karar ağaçları modeli kullanarak eğitime başlayabiliriz. İlk olarak gerekli kütüphaneleri yükleyelim:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# Veri setini eğitim ve test olarak ayırma
X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.2, random_state=42)

Burada, verimizi %80 eğitim ve %20 test olarak ayırdık. Şimdi karar ağaçlarımızı eğitelim:

model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

Model eğitimi tamamlandı, şimdi modelimizin performansını test edelim:

y_pred = model.predict(X_test)

print(classification_report(y_test, y_pred))

Bu kod parçası, eğitim sonrası modelimizin test verisi üzerindeki performansını ‘precision’, ‘recall’ ve ‘f1-score’ gibi metriklerle değerlendirecektir. Performans iyileştiyse, uyguladığımız SMOTE tekniğinin etkili olduğunu söyleyebiliriz.

Sonuç

Bu yazıda, Python’da SMOTE uygulamalarını detaylı bir şekilde ele aldık. Dengesiz veri setlerinde kullanarak nasıl daha dengeli bir veri seti elde edebileceğimizi ve bunun model performansına olan etkilerini inceledik. SMOTE, azınlık sınıf için yeni sentetik veri nesneleri oluşturarak model eğitiminde önemli bir yer tutmaktadır.

Sonuç olarak, veri biliminde karşımıza çıkan dengesiz veri setlerine karşı atılacak ilk adımlardan biri olan SMOTE’u kullanarak, projelerinizde daha sağlıklı ve dengeli bir eğitim süreci sağlayabilirsiniz. Unutmayın, iyi bir modelin başarısı, kaliteli ve dengeli bir veri setiyle başlar!

Scroll to Top