Tüm veriyi etiketlemek yerine, modelin "en çok kafası karışan" örnekleri seçme
Merhaba!
Veri etiketleme (labeling) pahalı ve zaman alıcı bir süreç. Aktif öğrenme, hangi örneklerin etiketlenmeye değer olduğunu akıllıca seçerek bu maliyeti ciddi ölçüde azaltan bir teknik. Bu konuyu derinlemesine ele aldım.
Tüm veriyi rastgele etiketlemek yerine, modelin EN ÇOK EMİN OLMADIĞI (belirsizlik gösterdiği) örnekleri öncelikli olarak etiketleyin. Bu örnekler, modelin öğrenmesi için en "bilgilendirici" olanlardır.
Python:
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
class AktifOgrenmeDongusu:
"""
Basit bir 'uncertainty sampling' (belirsizlik örneklemesi)
aktif öğrenme implementasyonu
"""
def __init__(self, model, X_etiketsiz_havuz):
self.model = model
self.X_havuz = X_etiketsiz_havuz.copy()
self.havuz_indeksleri = np.arange(len(X_etiketsiz_havuz))
def en_belirsiz_ornekleri_sec(self, n_ornek: int = 10) -> np.ndarray:
"""
Modelin en az emin olduğu örnekleri bulur.
Belirsizlik ölçüsü: en yüksek olasılık ile ikinci en yüksek
olasılık arasındaki fark ne kadar küçükse, o kadar belirsiz.
"""
olasiliklar = self.model.predict_proba(self.X_havuz)
# Her örnek için en yüksek iki olasılık arasındaki farkı hesapla
siralanmis_olasiliklar = np.sort(olasiliklar, axis=1)
belirsizlik_skoru = siralanmis_olasiliklar[:, -1] - siralanmis_olasiliklar[:, -2]
# En düşük fark = en belirsiz = etiketlenmeye en değerli
en_belirsiz_indeksler = np.argsort(belirsizlik_skoru)[:n_ornek]
return en_belirsiz_indeksler
def entropi_ile_sec(self, n_ornek: int = 10) -> np.ndarray:
"""
Alternatif belirsizlik ölçüsü — Shannon entropisi.
Olasılık dağılımı ne kadar 'düz' (tüm sınıflara eşit yakınsa),
entropi o kadar yüksek = model o kadar kararsız.
"""
olasiliklar = self.model.predict_proba(self.X_havuz)
# Sıfıra bölme hatası önleme
olasiliklar_guvenli = np.clip(olasiliklar, 1e-10, 1)
entropi = -np.sum(olasiliklar_guvenli * np.log(olasiliklar_guvenli), axis=1)
en_yuksek_entropili = np.argsort(entropi)[-n_ornek:]
return en_yuksek_entropili
# ─── SİMÜLASYON — AKTİF ÖĞRENMENİN FAYDASINI GÖSTERME ─
def aktif_ogrenme_simulasyonu():
X, y = make_classification(n_samples=1000, n_features=20,
n_informative=15, random_state=42)
X_egitim_havuz, X_test, y_egitim_havuz, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Başlangıç için çok küçük bir etiketli set (gerçek senaryoda maliyetli!)
baslangic_boyutu = 20
indeksler = np.random.RandomState(42).permutation(len(X_egitim_havuz))
X_etiketli = X_egitim_havuz[indeksler[:baslangic_boyutu]]
y_etiketli = y_egitim_havuz[indeksler[:baslangic_boyutu]]
X_havuz = X_egitim_havuz[indeksler[baslangic_boyutu:]]
y_havuz_gercek = y_egitim_havuz[indeksler[baslangic_boyutu:]] # Gerçekte bilinmez!
dogruluk_gecmisi_aktif = []
dogruluk_gecmisi_rastgele = []
# ─── AKTİF ÖĞRENME STRATEJİSİ ────────────────────
model_aktif = RandomForestClassifier(n_estimators=50, random_state=42)
X_aktif_havuz = X_havuz.copy()
y_aktif_havuz = y_havuz_gercek.copy()
X_et_aktif, y_et_aktif = X_etiketli.copy(), y_etiketli.copy()
for tur in range(10):
model_aktif.fit(X_et_aktif, y_et_aktif)
dogruluk = model_aktif.score(X_test, y_test)
dogruluk_gecmisi_aktif.append(dogruluk)
if len(X_aktif_havuz) == 0:
break
ogrenici = AktifOgrenmeDongusu(model_aktif, X_aktif_havuz)
secilen_indeksler = ogrenici.en_belirsiz_ornekleri_sec(n_ornek=10)
X_et_aktif = np.vstack([X_et_aktif, X_aktif_havuz[secilen_indeksler]])
y_et_aktif = np.hstack([y_et_aktif, y_aktif_havuz[secilen_indeksler]])
X_aktif_havuz = np.delete(X_aktif_havuz, secilen_indeksler, axis=0)
y_aktif_havuz = np.delete(y_aktif_havuz, secilen_indeksler, axis=0)
print(f"📊 Aktif Öğrenme ile 10 tur sonrası doğruluk: "
f"%{dogruluk_gecmisi_aktif[-1]*100:.1f}")
print(f" (Toplam etiketlenen örnek sayısı: {len(X_et_aktif)})")
print(f"\n💡 Rastgele örnekleme ile aynı sayıda etiketle karşılaştırıldığında,")
print(f" aktif öğrenme genellikle DAHA YÜKSEK doğruluk sağlar —")
print(f" çünkü etiketleme 'bütçesi' en bilgilendirici örneklere harcanıyor")
aktif_ogrenme_simulasyonu()
Etiketleme maliyetini azaltmak için hangi teknikleri kullandınız?