Makine öğrenmesi modellerinin performansını ölçmek için kullanılan temel metriklerin detaylı anlatımı, matematiksel formülleri ve Python örnekleri.
Tüm sınıflandırma metriklerinin temelini oluşturan karmaşıklık matrisi, modelin doğru ve yanlış tahminlerini özetler.
Confusion Matrix, bir sınıflandırma modelinin performansını görselleştirmek için kullanılan bir tablodur. İkili (binary) sınıflandırmada 2×2 boyutunda olup 4 temel bileşenden oluşur:
| Tahmin Edilen | ||
|---|---|---|
| Gerçek Değer | Pozitif (+) | Negatif (−) |
| Pozitif (+) | TP True Positive |
FN False Negative |
| Negatif (−) | FP False Positive |
TN True Negative |
Gerçekte pozitif olan ve modelin doğru şekilde pozitif tahmin ettiği örnekler. Örnek: Hasta olan birinin "hasta" olarak tanınması.
Gerçekte negatif olan ama modelin hatalı şekilde pozitif tahmin ettiği örnekler. Tip I Hata olarak da bilinir. Örnek: Sağlıklı birinin "hasta" olarak tanınması.
Gerçekte pozitif olan ama modelin hatalı şekilde negatif tahmin ettiği örnekler. Tip II Hata olarak da bilinir. Örnek: Hasta birinin "sağlıklı" olarak tanınması.
Gerçekte negatif olan ve modelin doğru şekilde negatif tahmin ettiği örnekler. Örnek: Sağlıklı birinin "sağlıklı" olarak tanınması.
Bir e-posta spam filtresi düşünelim. 1000 e-postayı sınıflandırdık:
TP = 80 (spam e-postalar doğru tespit edildi) · FP = 10
(normal e-postalar yanlışlıkla spam olarak işaretlendi)
FN = 20 (spam e-postalar tespit edilemedi) · TN = 890 (normal
e-postalar doğru şekilde geçirildi)
Modelin toplam doğru tahmin oranını ölçen en sezgisel ama bazen yanıltıcı olabilen metrik.
Accuracy, tüm tahminler arasında doğru tahminlerin oranıdır. Hem doğru pozitif hem de doğru negatif tahminleri hesaba katar.
Spam filtresi senaryomuzda:
$\text{Accuracy} = \frac{80 + 890}{80 + 890 + 10 + 20} = \frac{970}{1000} = \mathbf{0.97}$ →
%97 doğruluk
Accuracy, veri setinde sınıf dengesizliği olduğunda yanıltıcı olabilir. Örneğin, 1000 hastadan sadece 10'u kanser ise, hiç kanser tahmini yapmayan bir model bile %99 accuracy elde eder — ama hiçbir kanser vakasını tespit edemez! Bu yüzden dengesiz veri setlerinde Precision, Recall ve F1 Score gibi metriklere bakmak daha anlamlıdır.
Modelin "pozitif" dediği tahminlerin ne kadar güvenilir olduğunu ölçer.
Precision, modelin pozitif olarak tahmin ettiği örnekler içinde gerçekten pozitif olanların oranıdır. "Pozitif dediğimde ne kadar haklıyım?" sorusunu yanıtlar.
Spam filtresi: $\text{Precision} = \frac{80}{80 + 10} = \frac{80}{90} = \mathbf{0.889}$ →
%88.9
Yani spam diye işaretlenen her 90 e-postanın 80'i gerçekten spam.
Yanlış pozitifin maliyeti yüksek olduğunda Precision'a odaklanılır:
• Spam Filtresi: Önemli bir e-postayı spam olarak işaretlemek risklidir
• Arama Motoru: İlgisiz sonuçlar kullanıcı deneyimini bozar
• Öneri Sistemi: Yanlış öneriler güven kaybına yol açar
Gerçekte pozitif olan örneklerin ne kadarının yakalanabildiğini ölçer.
Recall (Sensitivity veya True Positive Rate olarak da bilinir), gerçekte pozitif olan örneklerden modelin doğru tespit ettiği örneklerin oranıdır. "Gerçek pozitiflerin ne kadarını yakalayabildim?" sorusunu yanıtlar.
Spam filtresi: $\text{Recall} = \frac{80}{80 + 20} = \frac{80}{100} = \mathbf{0.80}$ →
%80
Yani gerçek 100 spam e-postanın 80'ini tespit edebildik, 20 tanesi gözden kaçtı.
Yanlış negatiflerin maliyeti yüksek olduğunda Recall'a odaklanılır:
• Kanser Taraması: Bir hastayı kaçırmak hayati tehlike oluşturur
• Dolandırıcılık Tespiti: Kaçırılan dolandırıcılık büyük kayıplara yol açar
• Güvenlik Sistemleri: Tespit edilemeyen tehditler ciddi riskler oluşturur
Precision ve Recall genellikle ters yönde hareket eder: birini artırmaya çalıştığınızda diğeri azalma eğilimi gösterir. Eğer modelin eşik değerini düşürürseniz daha fazla pozitif tahmin edersiniz (Recall ↑), ama bu arada yanlış pozitifler de artar (Precision ↓). Bu dengeyi sağlamak için F1 Score kullanılır.
Precision ve Recall arasındaki dengeyi tek bir sayıda özetleyen harmonik ortalama.
F1 Score, Precision ve Recall'un harmonik ortalamasıdır. Aritmetik ortalama yerine harmonik ortalama kullanılır çünkü harmonik ortalama, iki değerden biri düşük olduğunda sonucu daha çok cezalandırır.
Spam filtresi: $F_1 = 2 \times \frac{0.889 \times 0.80}{0.889 + 0.80} = 2 \times \frac{0.711}{1.689} = \mathbf{0.842}$ → %84.2
Bazı durumlarda Precision veya Recall'dan birine daha fazla ağırlık vermek isteriz. Bu durumda F-Beta Score kullanılır:
| Skor | β Değeri | Ağırlık | Kullanım Alanı |
|---|---|---|---|
| F0.5 | 0.5 | Precision'a daha fazla ağırlık | Spam filtreleri, arama motorları |
| F1 | 1.0 | Eşit ağırlık | Genel sınıflandırma problemleri |
| F2 | 2.0 | Recall'a daha fazla ağırlık | Tıbbi teşhis, güvenlik sistemleri |
Gerçekte negatif olan örneklerin ne kadarının doğru tespit edildiğini ölçer.
Specificity (True Negative Rate), gerçekte negatif olan örneklerden modelin doğru tespit ettiği negatif örneklerin oranıdır. Recall'un negatif sınıf için karşılığıdır.
Spam filtresi: $\text{Specificity} = \frac{890}{890 + 10} = \frac{890}{900} = \mathbf{0.989}$ →
%98.9
Normal e-postaların %98.9'u doğru tanındı.
Sensitivity (Recall): Hasta olanları ne kadar iyi buluyoruz?
Specificity: Sağlıklı olanları ne kadar iyi ayırt ediyoruz?
İkisi birlikte ROC eğrisinin temelini oluşturur.
Farklı eşik değerlerinde modelin performansını gösteren güçlü bir görselleştirme ve karşılaştırma aracı.
ROC (Receiver Operating Characteristic) eğrisi, farklı eşik (threshold) değerlerinde True Positive Rate (Recall) ile False Positive Rate (1 − Specificity) arasındaki ilişkiyi gösteren bir grafiktir.
AUC, ROC eğrisinin altında kalan alandır. 0 ile 1 arasında değer alır ve modelin genel ayırt etme gücünü ölçer.
| AUC Değeri | Yorum | Açıklama |
|---|---|---|
| 1.0 | Mükemmel | Model tüm sınıfları %100 doğru ayırt eder |
| 0.9 – 1.0 | Çok İyi | Yüksek ayırt etme gücü |
| 0.7 – 0.9 | İyi | Kabul edilebilir performans |
| 0.5 – 0.7 | Zayıf | Rastgele tahminden biraz iyi |
| 0.5 | Rastgele | Yazı tura atmakla eşdeğer |
AUC, eşik değerinden bağımsızdır ve farklı modelleri karşılaştırmak için idealdir. Özellikle dengesiz veri setlerinde Accuracy'den daha güvenilir bir performans göstergesidir.
Modelin olasılık tahminlerinin kalitesini ölçer — sadece doğru/yanlış değil, ne kadar emin olduğu da önemlidir.
Log Loss (Binary Cross-Entropy), modelin tahmin ettiği olasılık değerlerinin gerçek etiketlerle ne kadar uyumlu olduğunu ölçer. Düşük Log Loss = daha iyi model.
Burada $y_i$ gerçek etiket (0 veya 1), $\hat{y}_i$ modelin tahmin ettiği olasılık, $N$ ise toplam örnek sayısıdır.
• Modelin sadece sınıf tahmini değil, güven derecesi de önemliyse
• Olasılık kalibrasyonu yapıyorsanız
• Kaggle yarışmalarında sıklıkla değerlendirme metriği olarak kullanılır
Sürekli değer tahmini yapan modeller için kullanılan hata ve uyum ölçütleri.
Tahmin ile gerçek değer arasındaki mutlak farkların ortalaması. Aykırı değerlere karşı dayanıklıdır.
Tahmin ile gerçek değer arasındaki kare farkların ortalaması. Büyük hataları daha çok cezalandırır.
MSE'nin karekökü alınarak orijinal birimle aynı ölçeğe getirilmiş halidir. En yaygın regresyon metriğidir.
Modelin bağımlı değişkendeki varyansın ne kadarını açıkladığını gösterir. 1'e ne kadar yakınsa model o kadar iyidir.
| R² Değeri | Yorum |
|---|---|
| 1.0 | Mükemmel uyum — model tüm varyansı açıklıyor |
| 0.7 – 1.0 | İyi uyum |
| 0.4 – 0.7 | Orta düzey uyum |
| < 0.4 | Zayıf uyum — model veriyi iyi açıklayamıyor |
| < 0 | Model, basit ortalama tahminden bile kötü |
Doğru metrik seçimi, doğru model seçimi kadar önemlidir.
| Senaryo | Önerilen Metrik | Neden? |
|---|---|---|
| Dengeli veri seti | Accuracy, F1 | Sınıflar dengeli olduğunda accuracy güvenilirdir |
| Dengesiz veri seti | F1, AUC, Precision/Recall | Accuracy yanıltıcı olabilir |
| Yanlış pozitif maliyetli | Precision | FP'yi minimize etmek istiyoruz |
| Yanlış negatif maliyetli | Recall | FN'yi minimize etmek istiyoruz |
| Olasılık tahmini önemli | Log Loss, AUC | Modelin güven derecesi değerlendirilir |
| Model karşılaştırma | AUC | Eşik değerinden bağımsız karşılaştırma |
| Sürekli değer tahmini | RMSE, MAE, R² | Regresyon problemleri için uygundur |
scikit-learn kütüphanesi ile tüm metriklerin hesaplanması.
from sklearn.metrics import (
accuracy_score, precision_score, recall_score,
f1_score, confusion_matrix, classification_report,
roc_auc_score, log_loss
)
import numpy as np
# Gerçek ve tahmin edilen etiketler
y_true = np.array([1, 0, 1, 1, 0, 1, 0, 0, 1, 0])
y_pred = np.array([1, 0, 1, 0, 0, 1, 1, 0, 1, 0])
# Tüm metrikleri hesapla
print("Accuracy :", accuracy_score(y_true, y_pred))
print("Precision:", precision_score(y_true, y_pred))
print("Recall :", recall_score(y_true, y_pred))
print("F1 Score :", f1_score(y_true, y_pred))
# Confusion Matrix
print("\nConfusion Matrix:")
print(confusion_matrix(y_true, y_pred))
# Detaylı rapor
print("\nClassification Report:")
print(classification_report(y_true, y_pred))
from sklearn.metrics import (
mean_absolute_error, mean_squared_error, r2_score
)
import numpy as np
y_true = np.array([3.0, 5.0, 2.5, 7.0, 4.5])
y_pred = np.array([2.8, 5.2, 2.1, 6.8, 4.9])
print("MAE :", mean_absolute_error(y_true, y_pred))
print("MSE :", mean_squared_error(y_true, y_pred))
print("RMSE:", np.sqrt(mean_squared_error(y_true, y_pred)))
print("R² :", r2_score(y_true, y_pred))