Bölüm 6 · Modeli ölçmek ve açıklamak · Ders 26
Kesinlik, duyarlılık ve F1
Kalite kontrol kamerasında eşiği kaydırmak
Veri. Üretim bandındaki bir kalite kontrol kamerası 1000 parçaya bakıyor; varsayılan ayarda 200'ü gerçekten hatalı. Model her parçaya 0 ile 1 arasında bir "hatalı olma" puanı veriyor. Puanı eşiğin üstünde olan parça banttan atılıyor. Soru şu: eşik nerede olmalı?
import numpy as nprng = np.random.default_rng(3)n_bad = 200 # 1000 parçanın 200'ü hatalıy = np.r_[np.ones(n_bad), np.zeros(1000 - n_bad)]z = rng.normal(0, 1.1, 1000) + np.where(y == 1, 1.0, -1.4)score = 1 / (1 + np.exp(-z)) # "hatalı olma" puanıhistory = {'threshold': [], 'precision': [], 'recall': [], 'f1': [], 'accuracy': [], 'fpr': []} # eşik başına ölçümlerfor t in np.arange(0.05, 0.96, 0.05): # eşiği kaydırflag = score >= t # işaretlenen parçalartp = np.sum(flag & (y == 1)) # doğru alarmfp = np.sum(flag & (y == 0)) # yanlış alarmfn = np.sum(~flag & (y == 1)) # kaçan hatalıP = tp / max(tp + fp, 1) # kesinlikR = tp / (tp + fn) # duyarlılıkF1 = 2 * P * R / max(P + R, 1e-12) # ikisinin dengesiprint(f"t={t:.2f} P={P:.2f} R={R:.2f} F1={F1:.2f}")for k, v in zip(history, (t, P, R, F1, np.mean(flag == (y == 1)), fp / (1000 - n_bad))): history[k].append(float(v))r = score.argsort().argsort() + 1 # sıralamaya göre ROC AUCauc = (r[y == 1].sum() - n_bad * (n_bad + 1) / 2) / (n_bad * (1000 - n_bad))best = int(np.argmax(history['f1'])) # en iyi F1 eşiğifor k, v in [('auc', auc), ('best_threshold', history['threshold'][best]), ('best_f1', history['f1'][best])]: # son ölçümler tablosuprint(f'{k:<15}{v:>10.4f}')import csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # eşik tablosunu CSV'ye yazcsv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir eşiktry:import matplotlib.pyplot as plt # varsa grafik çizfig, (a1, a2) = plt.subplots(1, 2, figsize=(9, 3.5))for k in ('precision', 'recall', 'f1'): a1.plot(history['threshold'], history[k], label=k)a2.plot(history['fpr'], history['recall'], marker='o'); a2.plot([0, 1], [0, 1], '--') # ROC: duyarlılık – yanlış alarm oranıa1.legend(); a1.set_xlabel('threshold'); a2.set_xlabel('fpr'); a2.set_ylabel('tpr'); plt.show()except ImportError:print('matplotlib yok: grafik atlandı')
Eğitim paneli
Eğitim çalıştırılıyor…
Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.
Veri seti
Tüm veri setleri →Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.
Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide
Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- Dört kutu (karışıklık matrisi): doğru alarm (TP), yanlış alarm (FP), kaçan hatalı (FN), doğru geçen sağlam (TN).
- Kesinlik P = TP / (TP + FP): attığımız parçaların ne kadarı gerçekten hatalı?
- Duyarlılık R = TP / (TP + FN): gerçekten hatalı parçaların ne kadarını yakaladık? F1 = 2PR / (P + R), ikisinin dengesi.
- Eşik yükseldikçe daha az parça işaretlenir: duyarlılık hiç artmaz, kesinlik çoğunlukla artar. Eğri bu takası gösterir.
- Şunu dene: hatalı payını %5 yap. Doğruluk yine yüksek görünür ama kesinlik çöker; az görülen sınıfta doğruluk yanıltır.
Neden önemli
Hatalı parça kaçırmak pahalıysa (fren balatası, uçak cıvatası) duyarlılık öne çıkar; her yanlış alarm bandı durduruyorsa kesinlik. Engel algılayan bir robot da aynı takası yaşar: duyarlılık düşükse çarpar, kesinlik düşükse boşuna fren yapar. F1, tek sayıyla karşılaştırma yapmak için kullanılır.
ESOF 323, 11. hafta: robotlarda derin öğrenme →