Neler yeni

Seni de aramızda görmek istiyoruz! 🚀

Bilgi paylaştıkça çoğalır. Şu an misafir olarak buradasın ama sadece birkaç saniyeni ayırarak ücretsiz üye olabilir; binlerce içeriğe erişebilir, sorularını sorabilir ve topluluğumuzun bir parçası olabilirsin. Geliştirmek, öğrenmek ve paylaşmak için hemen aramıza katıl!

Aktif Öğrenme (Active Learning) — Etiketleme Maliyetini Akıllıca Azaltma

baki

Sahip
Yönetici

🎯 AKTİF ÖĞRENME — HANGİ VERİYİ ETİKETLEMELİSİNİZ? 🎯
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.

🤔 Temel Fikir

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()

🎯 Farklı Aktif Öğrenme Stratejileri

🔹 Uncertainty Sampling: Modelin en az emin olduğu örnekleri seçme (yukarıdaki örnek)
🔹 Query by Committee: Birden fazla model eğitip, üzerinde EN ÇOK ANLAŞAMADIKLARI örnekleri seçme
🔹 Diversity Sampling: Sadece belirsiz değil, aynı zamanda VERİ UZAYINDA ÇEŞİTLİ örnekleri seçme (birbirine çok benzer belirsiz örnekleri tekrar tekrar seçmemek için)

🌍 Gerçek Dünya Kullanım Alanları

🔹 Tıbbi görüntü etiketleme (uzman doktor zamanı çok değerli/kısıtlı)
🔹 Nadir dil/lehçe için NLP veri seti oluşturma
🔹 Özel endüstriyel kalite kontrol (uzman mühendis onayı gerektiren durumlar)




💬 AKTİF ÖĞRENME DENEYİMİNİZ VAR MI? 💬[/CENTER>

Etiketleme maliyetini azaltmak için hangi teknikleri kullandınız? 👇​
 

Konuyu görüntüleyenler

Üst