Okullar için Robotik ve Mühendislik · anaokulundan liseye

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ı?

1000 parça (200 hatalı): modelin puanlarıkırmızı: hatalı (yukarı) · mavi: sağlam (aşağı)
1 / 97
kesinlik_duyarlilik.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(3)
  3. n_bad = 200 # 1000 parçanın 200'ü hatalı
  4. y = np.r_[np.ones(n_bad), np.zeros(1000 - n_bad)]
  5. z = rng.normal(0, 1.1, 1000) + np.where(y == 1, 1.0, -1.4)
  6. score = 1 / (1 + np.exp(-z)) # "hatalı olma" puanı
  7. history = {'threshold': [], 'precision': [], 'recall': [], 'f1': [], 'accuracy': [], 'fpr': []} # eşik başına ölçümler
  8. for t in np.arange(0.05, 0.96, 0.05): # eşiği kaydır
  9. flag = score >= t # işaretlenen parçalar
  10. tp = np.sum(flag & (y == 1)) # doğru alarm
  11. fp = np.sum(flag & (y == 0)) # yanlış alarm
  12. fn = np.sum(~flag & (y == 1)) # kaçan hatalı
  13. P = tp / max(tp + fp, 1) # kesinlik
  14. R = tp / (tp + fn) # duyarlılık
  15. F1 = 2 * P * R / max(P + R, 1e-12) # ikisinin dengesi
  16. print(f"t={t:.2f} P={P:.2f} R={R:.2f} F1={F1:.2f}")
  17. for k, v in zip(history, (t, P, R, F1, np.mean(flag == (y == 1)), fp / (1000 - n_bad))): history[k].append(float(v))
  18. r = score.argsort().argsort() + 1 # sıralamaya göre ROC AUC
  19. auc = (r[y == 1].sum() - n_bad * (n_bad + 1) / 2) / (n_bad * (1000 - n_bad))
  20. best = int(np.argmax(history['f1'])) # en iyi F1 eşiği
  21. for k, v in [('auc', auc), ('best_threshold', history['threshold'][best]), ('best_f1', history['f1'][best])]: # son ölçümler tablosu
  22. print(f'{k:<15}{v:>10.4f}')
  23. import csv
  24. with open('egitim_gecmisi.csv', 'w', newline='') as f: # eşik tablosunu CSV'ye yaz
  25. csv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir eşik
  26. try:
  27. import matplotlib.pyplot as plt # varsa grafik çiz
  28. fig, (a1, a2) = plt.subplots(1, 2, figsize=(9, 3.5))
  29. for k in ('precision', 'recall', 'f1'): a1.plot(history['threshold'], history[k], label=k)
  30. a2.plot(history['fpr'], history['recall'], marker='o'); a2.plot([0, 1], [0, 1], '--') # ROC: duyarlılık – yanlış alarm oranı
  31. a1.legend(); a1.set_xlabel('threshold'); a2.set_xlabel('fpr'); a2.set_ylabel('tpr'); plt.show()
  32. except ImportError:
  33. 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.

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.

kesinlik_duyarlilik.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. 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).
  2. Kesinlik P = TP / (TP + FP): attığımız parçaların ne kadarı gerçekten hatalı?
  3. Duyarlılık R = TP / (TP + FN): gerçekten hatalı parçaların ne kadarını yakaladık? F1 = 2PR / (P + R), ikisinin dengesi.
  4. 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.
  5. Ş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 →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç