Dengesiz Veri Kümesi Nedir?
Bir veri kümesinde, bir sınıfın örneklerinin diğer sınıflara göre çok daha az sayıda olması durumuna dengesiz veri kümesi denir. Bu durum, birçok gerçek dünya probleminde sıklıkla karşılaşılan bir sorundur. Dengesiz veri kümeleri, sınıflandırma modellerinin performansını olumsuz etkileyebilir.
Örnekleme:
Azınlık Sınıfın Üst Örneklemesi (Over-sampling):
Azınlık sınıftaki örnekleri çoğaltarak veri kümesini dengelemek mümkündür. Bu, azınlık sınıfındaki örnek sayısını artırarak sınıf dengesizliğini azaltır.
Çoğunluk Sınıfın Alt Örneklemesi (Under-sampling):
Çoğunluk sınıftaki örnekleri azaltarak veri kümesini dengelemek mümkündür. Bu, özellikle çoğunluk sınıfındaki örneklerin sayısı çok fazlaysa ve bu durum modelin yanıltılmasına neden oluyorsa kullanılabilir.
Maliyet Duyarlı Öğrenme:
Sınıflandırma hatalarının her bir sınıf için farklı maliyetlere sahip olduğunu varsayan bir öğrenme algoritması kullanmak mümkündür. Bu, modelin azınlık sınıfındaki örnekleri daha iyi öğrenmesini sağlayabilir.
Algoritma Seçimi:
Dengesiz veri kümeleri için özel olarak tasarlanmış sınıflandırma algoritmaları mevcuttur. K-Nearest Neighbors (KNN) ve Random Forest gibi algoritmalar, dengesiz veri kümeleri ile daha iyi performans gösterebilir.
SMOTE Tekniği:
SMOTE (Synthetic Minority Over-sampling Technique): SMOTE, azınlık sınıftaki örneklerden yeni sentetik örnekler oluşturarak veri kümesini dengelemek için kullanılan bir tekniktir. Bu yöntem, her azınlık sınıf örneği için komşu örneklerden birini seçer ve bu iki örnek arasında yeni bir sentetik örnek oluşturur.
- Avantajlar:
- Azınlık sınıftaki örneklerin sayısını artırır.
- Sınıflandırma modellerinin azınlık sınıfını daha iyi öğrenmesini sağlar.
- Veri kümesindeki gürültü miktarını azaltabilir.
- Dezavantajlar:
- Sentetik örnekler, gerçek veri örneklerini tam olarak temsil etmeyebilir.
- Veri kümesinin boyutunu artırabilir.
Python’da SMOTE Tekniği:
Python’da SMOTE tekniğini uygulamak için “imbalanced-learn” kütüphanesi kullanılabilir. Bu kütüphane, dengesiz veri kümeleri ile başa çıkmak için çeşitli örnekleme tekniklerini içerir. Aşağıda, Python kodu ile SMOTE tekniğinin kullanımına örnek verilmiştir:
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
# Dengesiz bir veri kümesi oluştur
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9],
n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1,
n_samples=1000, random_state=42)
# Veriyi eğitim ve test setlerine ayır
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# SMOTE tekniğini uygula
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
Bu örnek, “imbalanced-learn” kütüphanesinde bulunan SMOTE sınıfını kullanarak azınlık sınıftaki örnekleri artırmak için bir örnek sağlar.
ADASYN, RUSBoost, CO-SE, NearMiss, Tomek Links vb. Yöntemler:
- ADASYN (Adaptive Synthetic Sampling):
- Açıklama: SMOTE’a benzer bir yaklaşımı benimser, ancak örnek üretirken sınıflar arasındaki yoğunluğu dengelemeye çalışır.
- Avantajlar: Daha az gürültü oluşturabilir ve daha dengeli örnekler üretebilir.
- Dezavantajlar: Hesaplama maliyeti biraz daha yüksektir.
- Random Under-sampling and Over-sampling for Imbalanced Learning (RUSBoost):
- Açıklama: Çoğunluk ve azınlık sınıflarında rastgele örneklerin seçilerek denge sağlanır. Bu örnekleri kullanarak bir zayıf öğrenici eğitilir ve ardından bu öğreniciyi güçlendirmek için yeni örnekler eklenir.
- Avantajlar: Dengeli bir örneklem sağlamaya çalışır ve enseble yöntemlerini kullanarak performansı artırabilir.
- Dezavantajlar: Rastgele seçimden dolayı bilgi kaybına neden olabilir.
- NearMiss:
- Açıklama: Çoğunluk sınıfındaki örnekleri azınlık sınıfına yakın olanlardan seçer.
- Avantajlar: Azınlık sınıfındaki örneklerin seçiminde daha bilinçli bir yaklaşım sunar.
- Dezavantajlar: Eğitim süresini artırabilir ve örnek seçiminde belirli durumları göz ardı edebilir.
- Cluster-based Over-sampling (CO-SE):
- Açıklama: K-Means veya Hierarchical clustering gibi kümeleme algoritmalarını kullanarak çoğunluk sınıfındaki örnekleri gruplara ayırır. Ardından, azınlık sınıfındaki örnekleri her bir kümeyle ilişkilendirerek çoğunluk sınıfını üst örneklerle doldurur.
- Avantajlar: Kümeleme algoritmalarının örnek seçimindeki avantajlarından yararlanabilir.
- Dezavantajlar: Hesaplama maliyeti yüksek olabilir ve bazı durumlarda etkisiz olabilir.
- Tomek Links:
- Açıklama: Çoğunluk ve azınlık sınıfındaki örnekler arasında Tomek links adı verilen çiftleri tespit eder. Bu çiftler içindeki çoğunluk sınıfı örnekleri çıkartılır.
- Avantajlar: Bilgi kaybını minimumda tutar ve örnek seçiminde belirli durumları ele alabilir.
- Dezavantajlar: Azınlık sınıfındaki örnek sayısını yeterince artırmayabilir.
- Edited Nearest Neighbors (ENN):
- Açıklama: K-NN algoritması kullanılarak azınlık sınıfındaki örneklerin çoğunluk sınıfındaki komşuları kontrol edilir. Azınlık sınıfındaki örnekler, çoğunluk sınıfı komşularından belirli bir kriterle uzaksa çıkartılır.
- Avantajlar: Gürültüyü azaltabilir ve bilinçli örnek seçimi yapabilir.
- Dezavantajlar: Hesaplama maliyeti biraz daha yüksektir.
Senior seviyedeki veri bilimcileri genellikle problem bağlamına ve veri setinin özelliklerine bağlı olarak çeşitli yöntemleri bir araya getirebilir. Tercih edilen yöntem, genellikle deneyim, uzmanlık alanları ve problemle ilgili bilgiye dayanır.
Bununla birlikte, genelde bir veri bilimcisi veya veri mühendisi dengesiz veri kümeleriyle başa çıkarken şu stratejileri kullanabilir:
- SMOTE ve Benzeri Teknikler: Azınlık sınıfındaki örnekleri artırmak için SMOTE gibi over-sampling teknikleri.
- Azınlık Sınıfın Alt Örneklemesi: Çoğunluk sınıfındaki örnekleri azaltarak denge sağlamak.
- Maliyet Duyarlı Öğrenme: Sınıflandırma hatasının maliyetini dengeleyen algoritmalar kullanmak.
- Özel Algoritmalar: Dengesiz veri kümeleri için tasarlanmış özel sınıflandırma algoritmalarını (örneğin, XGBoost, LightGBM) kullanmak.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline
# Örnek bir veri seti oluşturalım (dengesiz)
data = pd.DataFrame({
'feature1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20],
'feature2': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 150, 200],
'label': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] # Dengesiz etiketler
})
# Bağımsız değişkenler (X) ve bağımlı değişken (y) ayırma
X = data.drop('label', axis=1)
y = data['label']
# Eğitim ve test setlerini oluşturma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# SMOTE ile XGBoost kullanarak bir pipeline oluşturma
model_xgb = XGBClassifier(random_state=42)
pipeline_xgb = Pipeline([('smote', SMOTE(random_state=42)), ('xgb', model_xgb)])
# Modeli eğitme
pipeline_xgb.fit(X_train, y_train)
# Tahminler
y_pred_xgb = pipeline_xgb.predict(X_test)
# Sınıflandırma raporu
print("XGBoost Sınıflandırma Raporu:")
print(classification_report(y_test, y_pred_xgb))
# SMOTE ile LightGBM kullanarak bir pipeline oluşturma
model_lgbm = LGBMClassifier(random_state=42)
pipeline_lgbm = Pipeline([('smote', SMOTE(random_state=42)), ('lgbm', model_lgbm)])
# Modeli eğitme
pipeline_lgbm.fit(X_train, y_train)
# Tahminler
y_pred_lgbm = pipeline_lgbm.predict(X_test)
# Sınıflandırma raporu
print("\nLightGBM Sınıflandırma Raporu:")
print(classification_report(y_test, y_pred_lgbm))
- Cluster-based Over-sampling (CO-SE) ve Diğer Karmaşık Teknikler: Kümeleme algoritmalarını içeren daha karmaşık over-sampling teknikleri.
import pandas as pd
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import KMeansSMOTE
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# Örnek bir veri seti oluşturalım (dengesiz)
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9],
n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1,
n_samples=1000, random_state=42)
# Bağımsız değişkenler (X) ve bağımlı değişken (y) ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Önce SMOTE'u uygulayarak dengesiz veri kümesini dengeleme
smote = SMOTE(random_state=42)
X_resampled_smote, y_resampled_smote = smote.fit_resample(X_train, y_train)
# Ardından KMeansSMOTE'u uygulayarak dengesiz veri kümesini dengeleme
kmeans_smote = KMeansSMOTE(cluster_balance_threshold=0.1, random_state=42)
X_resampled_cose, y_resampled_cose = kmeans_smote.fit_resample(X_train, y_train)
# Random Forest sınıflandırıcıları oluşturma
rf_smote = RandomForestClassifier(random_state=42)
rf_cose = RandomForestClassifier(random_state=42)
# SMOTE ile eğitim
rf_smote.fit(X_resampled_smote, y_resampled_smote)
# CO-SE ile eğitim
rf_cose.fit(X_resampled_cose, y_resampled_cose)
# SMOTE ile test
y_pred_smote = rf_smote.predict(X_test)
# CO-SE ile test
y_pred_cose = rf_cose.predict(X_test)
# Sınıflandırma raporları
print("SMOTE ile Sınıflandırma Raporu:")
print(classification_report(y_test, y_pred_smote))
print("\nCO-SE ile Sınıflandırma Raporu:")
print(classification_report(y_test, y_pred_cose))
Hangi stratejinin tercih edileceği, veri setinin büyüklüğü, sınıflar arasındaki oran, özelliklerin doğası ve problem bağlamına bağlıdır. Ayrıca, deneme yanılma yoluyla hangi stratejinin en iyi performansı sağladığını belirlemek de önemlidir.