Precision ve Recall
Duyarlılık ve Anma
Sınıflandırma modellerinin başarısını ölçen iki temel metrik: Precision = 'pozitif dediklerinin ne kadarı doğru?', Recall = 'gerçek pozitiflerin ne kadarını yakaladım?'.
Doğruluk (accuracy) tek başına çoğu zaman yanıltıcıdır; özellikle dengesiz sınıflarda. Precision ve recall iki farklı soruya cevap verir.
Precision (kesinlik): model "pozitif" dedi; bunların kaçı gerçekten pozitif? = TP / (TP + FP). Yanlış alarmın maliyeti yüksekse precision önceliklidir. Spam filtresinde önemli e-postanın spam'e düşmesi pahalıdır → yüksek precision lazım.
Recall (anma, duyarlılık): gerçek pozitiflerin kaçını yakaladım? = TP / (TP + FN). Kaçırmanın maliyeti yüksekse recall önceliklidir. Kanser teşhisinde gerçek hastayı kaçırmak çok pahalıdır → yüksek recall lazım.
İkisi arasında doğal bir gerilim vardır. Eşiği yükseltirsen daha emin olduklarını işaretlersin → precision yükselir, recall düşer. Eşiği indirirsen tersi olur. F1 skoru ikisinin harmonik ortalamasıdır; tek bir sayıyla ikisini birden özetlemek için kullanılır. Sınıf dengesizliğinde macro-F1 her sınıfa eşit ağırlık verir.
Bir balıkçının ağ atması gibidir. Precision: ağdan çıkanların yüzde kaçı somondu (asıl istediğim balık)? Ağa eski lastik, çöp, yengeç çekildiyse precision düşüktür. Recall: denizdeki tüm somonların yüzde kaçını yakaladım? Bir sürü somon ağdan kaçtıysa recall düşüktür.
Sıkı bir ağ atarsın → çok az şey çekersin ama hemen hepsi somondur (yüksek precision, düşük recall). Geniş ağ atarsın → her şeyi çekersin ama ortalık karışıktır (düşük precision, yüksek recall). Hangisinin doğru olduğu işine bağlıdır.
Bir e-ticaret sitesi yorum bölümünde nefret söylemi tespit modeli kuruyor. Üç farklı eşik denenir:
| Eşik | Precision | Recall | Anlamı | |------|-----------|--------|--------| | 0.3 | %62 | %94 | Çok temiz ama %38 hatalı bayrak | | 0.5 | %81 | %78 | Dengeli | | 0.7 | %93 | %52 | Az hata ama yarısı kaçar |
Ürün ekibi karar verir: "yanlış bayrakla iyi yorum sansürlemek kullanıcı kaybettirir, kaçanları moderatör elle yakalar" → eşik 0.7. Otomatik filtre %52 yakalama yapar, gerisi insan moderasyonuna bırakılır. Hangi metriği önceliklendirdiğin, iş kararını doğrudan değiştirir.
from sklearn.metrics import (
classification_report, precision_recall_curve,
average_precision_score,
)
import matplotlib.pyplot as plt
# Olasılık tahminleri
probs = model.predict_proba(X_test)[:, 1]
# Tek bir eşik için tüm metrikleri rapora dök
preds = (probs > 0.5).astype(int)
print(classification_report(y_test, preds, target_names=["neg", "pos"]))
# Tüm eşik değerleri için precision-recall eğrisi
prec, rec, thr = precision_recall_curve(y_test, probs)
ap = average_precision_score(y_test, probs)
plt.plot(rec, prec, label=f"AP={ap:.3f}")
plt.xlabel("Recall")
plt.ylabel("Precision")
plt.title("Precision-Recall Eğrisi")
plt.legend()
plt.savefig("pr_curve.png")
# İş hedefine göre eşik seç (örn. recall en az %80 olsun)
target = 0.8
ok = rec >= target
idx = ok.argmax()
print(f"Recall ≥ {target} için en yüksek precision: {prec[idx]:.3f}")
print(f"Bu noktadaki eşik: {thr[idx]:.3f}")- Sınıflar dengesiz olduğunda — accuracy yanıltır
- Yanlış pozitif ve yanlış negatif maliyetleri farklıysa
- Bir eşik kararını işle gerekçelendirmek istediğinde
- Bilgi alma (information retrieval) ve öneri sistemlerinde
- Bu metrikler her sınıflandırma probleminde kullanılır; ne zaman kullanmayacağı yok
Sadece F1'e bakmak
F1 ortalamadır; precision %20 / recall %95 olan model F1 ile dengeli görünür ama gerçekte uçlar dengesizdir. Üç metriği de birlikte rapora dök.
Macro vs micro F1 karıştırmak
Macro her sınıfa eşit ağırlık verir; küçük sınıflar önemliyse onu kullan. Micro örnek başına ağırlık verir; büyük sınıf domine eder.
Eşiği iş bağlamı olmadan seçmek
0.5 varsayılan değildir, kararındır. Yanlış pozitif ve yanlış negatif maliyetlerini hesapla, ROI'ye göre eşiği seç.