Skip to content

Weak Supervision and Snorkel: Programmatic Labeling When Labels Are Expensive

When manual labeling is expensive, programmatic labeling: Snorkel framework, labeling functions, label model (generative), Cleanlab for label correction, strengths and weaknesses of weak supervision.

Şükrü Yusuf KAYA
24 min read
Intermediate
Weak Supervision ve Snorkel: Etiket Pahalı Olduğunda Programmatic Labeling
🏷️ Etiket olmadan etiket üretmek
Modül 1.3'te gördük: anomaly detection'da etiket pahalı. Bir AML SAR raporu 200-500 TL, bir bearing arızası 1.000-50.000 TL. Peki manuel etiket olmadan eğitilebilir model üretmenin yolu var mı? Evet — weak supervision. Domain expert'in 'kuralları' programmatic olarak etikete dönüştürülür. Bu derste Snorkel framework'ünü ve Cleanlab ile etiket kalitesi iyileştirmesini öğreneceğiz.

Weak Supervision Nedir?#

Geleneksel supervised: İnsan her örneği etiketler → tam, kaliteli, pahalı etiket.
Weak supervision: Aşağıdaki kaynaklardan etiket üretilir:
  • Heuristics / kurallar (örn. "tutar > 10.000 TL ise olası anomali")
  • Knowledge base (Wikidata, sektörel ontoloji)
  • Mevcut zayıf modeller (örn. eski rule-based sistem)
  • Crowd-sourcing
  • Distant supervision (proxy etiket — "bu kart bloklandı")
  • Pattern matching (regex'ler)
Bu kaynaklar gürültülü ve çakışan etiketler üretir. Snorkel bu çelişkileri çözer ve "muhtemel doğru" etiketler verir.

Snorkel Pipeline Anatomi#

Snorkel (Stanford, 2017) weak supervision için flagship framework:
[Unlabeled data] ↓ [Labeling Functions (LFs)] ├─ LF1: amount > 10000 → 1, else ABSTAIN ├─ LF2: card_age < 7d AND amount > 1000 → 1, else ABSTAIN ├─ LF3: country != home_country → 1, else 0 ├─ ... └─ LFn ↓ (her LF her örnek için 1, 0 veya ABSTAIN üretir) [Label Matrix L (N × K)] K = LF sayısı ↓ [Label Model] — LF'lerin uyum/çelişkilerini öğrenip ağırlıkları belirler ↓ [Probabilistic Labels Ỹ] ↓ [Train standard ML model on (X, Ỹ)]

Labeling Function (LF) Anatomi#

Bir LF iki şey döner: bir karar (POSITIVE, NEGATIVE) veya ABSTAIN (çekimser).
from snorkel.labeling import labeling_function POSITIVE = 1 NEGATIVE = 0 ABSTAIN = -1 @labeling_function() def lf_high_amount(x): """Yüksek tutar.""" return POSITIVE if x.amount > 10000 else ABSTAIN @labeling_function() def lf_velocity(x): """Yüksek velocity (1 saatte 5+ işlem).""" return POSITIVE if x.tx_count_1h > 5 else ABSTAIN @labeling_function() def lf_new_card_big_purchase(x): """Yeni kart + büyük alışveriş.""" if x.card_age_days < 7 and x.amount > 1000: return POSITIVE return ABSTAIN @labeling_function() def lf_known_safe(x): """Müşteri uzun süredir aynı merchant'a ödeme yapıyor.""" if x.merchant_history_months > 12 and x.amount < 5000: return NEGATIVE return ABSTAIN
Önemli not: Bir LF tüm örneklere karar vermek zorunda değil. Abstain (cevap vermeme) sıklıkla en doğru hareket.

Label Model: Çelişkileri Çöz#

Diyelim 10 LF'in var ve bir örnek için 6'sı POSITIVE, 3'ü NEGATIVE, 1'i ABSTAIN. Bu örneğin gerçek etiketi ne?
Naif yaklaşım — Majority Vote: çoğunluk POSITIVE = sonuç POSITIVE.
Sorun: LF'ler eşit güvenilir değil. Bazıları %95 doğruluk, bazıları %60. Ayrıca LF'ler korelasyonlu olabilir (aynı bilgiyi farklı şekilde kullanırlar).
Snorkel'in label model'i:
  1. Tüm LF'lerin doğruluğunu etiketsiz veriden tahmin eder (generative)
  2. Korelasyonları çıkarır
  3. Her örnek için olasılıksal etiket verir: P(y=1|LF'ler)
python
from snorkel.labeling import PandasLFApplier, LFAnalysis
from snorkel.labeling.model import LabelModel
import pandas as pd
 
# 1. Veriyi yükle
df_unlabeled = pd.read_csv("transactions.csv")
 
# 2. LF'leri uygula
lfs = [lf_high_amount, lf_velocity, lf_new_card_big_purchase, lf_known_safe]
applier = PandasLFApplier(lfs=lfs)
L_matrix = applier.apply(df=df_unlabeled)
 
# 3. LF analizi (kapsam, çakışma, çelişki)
print(LFAnalysis(L=L_matrix, lfs=lfs).lf_summary())
 
# 4. Label model
label_model = LabelModel(cardinality=2, verbose=True)
label_model.fit(L_train=L_matrix, n_epochs=500, log_freq=100, seed=42)
 
# 5. Olasılıksal etiketler
prob_labels = label_model.predict_proba(L=L_matrix)
df_unlabeled['weak_label'] = prob_labels[:, 1] > 0.5
df_unlabeled['confidence'] = prob_labels[:, 1]
 
# 6. Düşük güvenli (belirsiz) örnekleri at
df_high_conf = df_unlabeled[df_unlabeled['confidence'] > 0.8]
print(f"Güvenilir etiket: {len(df_high_conf)}/{len(df_unlabeled)}")
Snorkel pipeline — LF + label model

LF Kalitesi: Hangi Metrikler Önemli?#

Snorkel
LFAnalysis
5 ana metrik verir:
MetrikAnlamıİdeal
PolarityLF hangi sınıfı etiketlerİstenen sınıfı işaretlemeli
CoverageVeri'nin yüzdesinde "abstain dışı"%5-30 (sıklıkla)
OverlapBaşka LF ile aynı örneğe karar vermeDüşük-orta
ConflictBaşka LF ile farklı karar vermeDüşük (ama 0 olmamalı)
Empirical Acc.Bir validation set varsa, gerçek doğruluk%70+ ideal

LF Tasarım Kuralları#

  1. Tek bir hipotezi test et — bir LF birden çok sezgiyi karıştırmasın
  2. Abstain'i çekinmeden kullan — emin değilsen bilgi verme
  3. Yüksek precision, düşük recall istenir (bir LF için)
  4. Birden çok zayıf LF > tek mükemmel LF (Snorkel'in kazancı)
  5. Domain expert ile birlikte yaz — kuralları kim sahiplenecek?

Cleanlab: Etiket Hatalarını Bulma#

Snorkel'in kuzeni: Cleanlab. Mevcut etiketli verideki yanlış etiketleri bulmak için kullanılır. AD için çok değerli — çünkü etiket gürültüsü modelin PR-AUC'unu doğrudan baltalar.

Cleanlab nasıl çalışır?#

  1. Veri üzerinde bir baseline model (örn. cross-validated XGBoost) eğit
  2. Her örneğin out-of-fold prediction olasılığını hesapla
  3. "Modelin emin olduğu ama etiket farklı" örnekleri olası yanlış olarak işaretle
from cleanlab.filter import find_label_issues from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_predict # Cross-validated probabilities clf = RandomForestClassifier(n_estimators=200, random_state=42) pred_probs = cross_val_predict(clf, X, y, cv=5, method='predict_proba') # Şüpheli etiketler issues = find_label_issues( labels=y, pred_probs=pred_probs, return_indices_ranked_by='self_confidence', ) print(f"Şüpheli etiket sayısı: {len(issues)}") print(f"İlk 10 şüpheli indis: {issues[:10]}")
Bu indisleri manuel review'a gönder veya drop et.

Cleanlab + Snorkel Kombinasyonu#

1. Snorkel ile weak labels üret (Ỹ) 2. Bir model eğit (X, Ỹ) 3. Cleanlab ile gürültülü Ỹ noktalarını bul 4. Bu noktaları drop et veya analist'e gönder 5. Modeli yeniden eğit
İki framework'ün tamamlayıcı olarak kullanılması üretimde sık.

Weak Supervision Ne Zaman İşe Yarar?#

Güçlü olduğu yerler#

  • Etiket çok pahalı: healthcare, AML, insurance fraud
  • Domain expert bol: kuralları yazacak iç ekip var
  • Veri çok: binlerce satıra LF uygulamak feasible
  • Hızlı prototip: "MVP'yi 2 günde çıkar"
  • Mevcut rule-based sistem var: kurallarını LF'lere çevirebilirsin

Zayıf olduğu yerler#

  • Tek bir domain expert yok: kuralları kim yazacak?
  • Veri çok az: 1000 satırda label model güvensiz
  • Kurallar açıklanamıyor: model "intuition" ise LF yapılamaz
  • Adversarial: rakip LF'leri öğrenip atlatır

Türkiye Pratiği#

Banking AML'de yaygın. Türk bankalarının çoğu mevcut rule-based AML motorlarını (örn. Actimize, Pelican) zayıf etiket kaynağı olarak kullanıp modern ML model eğitiyor. Healthcare'de yeni — claim fraud için kullanım başlıyor.

Bonus: Active Learning Döngüsü#

Weak supervision + active learning birleşince çok güçlü:
1. Unlabeled veride Snorkel LF'leri çalıştır → weak labels 2. ML model eğit 3. Model çıktısında "en belirsiz" örnekleri seç (en az güvenli) 4. Bu örnekleri analist'e gönder (manuel etiket) 5. Manuel etiketleri (gerçek) + weak etiketleri (sentetik) birleştir 6. Model yeniden eğit 7. Tekrar 3'e dön
Bu döngüyle:
  • Analist sadece gerçekten zor örneklere bakar
  • Model kademeli olarak daha iyi olur
  • Etiket maliyeti %80+ düşer (aynı PR-AUC için)
Türkiye'deki bir Türk bankası 2024 raporu: weak supervision + active learning ile fraud detection sistemini eğitti. 6 ayda 50.000 satırlık manuel etiketin yerine 8.000 satır ile aynı performans aldı.

Weak Supervision Sınırları#

1. LF kalitesi tabanı belirler#

Kötü LF'ler → kötü label model → kötü ML model. "Garbage in, garbage out".

2. Sistematik bias#

Tüm LF'ler aynı hatayı yapıyorsa, label model bunu doğru sanır. Çelişki yoksa kalite ölçülemez.

3. Confidence overestimation#

Label model "0.95 güvenli" derken aslında %75 doğru olabilir. Validation set ile kalibre et.

4. Domain drift'e duyarsız#

LF'ler manuel; dağılım değişirse otomatik güncellenmez. Modül 31'de drift detection ile birleşim göreceğiz.

5. LF üretim eğri eğitime ihtiyaç#

Domain expert'in 'iyi LF' yazmasını öğretmek zaman alır. Bazı şirketler bunu "Snorkel coach" pozisyonu açarak çözüyor.
💼 Real-World Pearl
Bir Türk insurance şirketi 2023'te claim fraud için Snorkel + Cleanlab + active learning hibridi kurdu. Manuel etiket gerekli yıllık 12.000 → 1.800'e düştü. Yıllık ~3.5M TL tasarruf + daha hızlı yeni-fraud-pattern adaptasyonu. Bu pipeline'ın kalbi 47 labeling function ve haftalık 50-100 active sample inceleme.

Snorkel Alternatifleri#

ToolGüçlü olduğu yerŞirket
SnorkelTabular + text weak supervisionStanford (open source)
Snorkel FlowEnterprise + UISnorkel AI (ticari)
CleanlabEtiket düzeltmeMIT (open source)
Label StudioManuel etiketleme UIHeartex (open source)
SkweakNLP weak supervisionNorwegian Computing Center
MetaWeakMulti-task weak supervisionAcademic
Çoğu prod pipeline iki ya da üç tool'u birlikte kullanır: Snorkel (LF'ler) + Cleanlab (cleanup) + Label Studio (manuel review UI).
👉 Bir sonraki ders
Ders 3.5 — Hands-on Lab: IEEE-CIS Fraud. Bu modülün son dersi pratik. IEEE-CIS Fraud Kaggle verisinde (~600K satır, 400+ feature) 4 sampling stratejisini (baseline / SMOTE / class_weight / focal loss) yan yana koşturup PR-AUC karşılaştırması yapacağız. Capstone 1'in temel taşı.

Frequently Asked Questions

Hayır. Snorkel başlangıçta NLP odaklıydı ama tabular AD'de çok yaygın. Banking fraud, insurance, e-commerce — hepsi LF'lerle modellenebilir. Vision için daha az yaygın (CV'de self-supervised daha popüler).

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content