Garfield
YZF Admin
İkili sınıflandırma modelinin gerçek etiketlerini ve pozitif sınıfa ait olasılıklarını kullanarak
ROC eğrisi, ikili sınıflandırmada karar eşiği değiştikçe modelin nasıl davrandığını gösterir. Eğrinin yatay ekseninde yanlış pozitif oranı, dikey ekseninde doğru pozitif oranı bulunur. Hesaplama için gerçek sınıf etiketleriyle birlikte modelin sınıf tahmini değil, mümkünse pozitif sınıfa verdiği skor veya olasılık gerekir.
Örnekte ROC hesabının pozitif sınıfı
Ön koşul olarak Python ortamınızda
Kod çalıştığında grafikte yatay eksende yanlış pozitif oranı, dikey eksende doğru pozitif oranı görünür. Konsoldaki
Kendi veri kümenizde
Model
ROC-AUC değeri 0,5 civarındaysa modelin ayırma gücü rastgele tahmine yakındır. Değer 1'e yaklaştıkça pozitif örnekleri negatiflerden ayırma sıralaması güçlenir. Ancak AUC, belirli bir karar eşiğinde modelin kesin olarak ne kadar iyi çalıştığını göstermez; üretimde kullanılacak eşik ayrıca seçilmelidir.
Eğri üzerindeki her nokta farklı bir karar eşiğine karşılık gelir. Eşiği düşürmek daha fazla pozitif yakalayabilir ve doğru pozitif oranını artırabilir; bunun karşılığında yanlış pozitif oranı da yükselebilir. Eşiği yükseltmek yanlış alarmları azaltabilir, fakat bazı gerçek pozitiflerin kaçırılmasına yol açabilir.
Tablodaki ayrımın pratik sonucu şudur: ROC eğrisini çizmek için modelin son sınıf kararını değil, karar öncesindeki sürekli skoru kullanın. Eşik seçimi yanlış pozitiflerin ve yanlış negatiflerin maliyetine göre yapılmalıdır; ROC-AUC tek başına bu işletim kararını vermez.
Pozitif sınıf test kümesinde çok azsa ROC eğrisi yine hesaplanabilir; ancak eğriyi tek başına karar ölçütü yapmayın. Özellikle yanlış pozitiflerin maliyeti yüksekse precision-recall eğrisi, sınıf bazlı precision, recall ve karışıklık matrisi de incelenmelidir.
Ayrıca
ROC eğrisinde neden
roc_curve() ile yanlış pozitif oranı ve doğru pozitif oranını hesaplayabilir, ardından RocCurveDisplay veya Matplotlib ile ROC eğrisini çizebilirsiniz. Aşağıdaki örnekte model eğitiliyor, test verisi üzerinde olasılık üretiliyor, ROC-AUC hesaplanıyor ve eğri görüntüleniyor.Gerekli veri ve model çıktısı
ROC eğrisi, ikili sınıflandırmada karar eşiği değiştikçe modelin nasıl davrandığını gösterir. Eğrinin yatay ekseninde yanlış pozitif oranı, dikey ekseninde doğru pozitif oranı bulunur. Hesaplama için gerçek sınıf etiketleriyle birlikte modelin sınıf tahmini değil, mümkünse pozitif sınıfa verdiği skor veya olasılık gerekir.
Örnekte ROC hesabının pozitif sınıfı
1 olarak seçilmiştir. Kullanılan gerçek Wisconsin veri kümesinde 0 kötü huylu, 1 iyi huylu sınıfıdır; burada yüksek skor iyi huylu sınıfı öne çıkarır. Kendi verinizde pozitif sınıfı değiştirirken yalnız pos_label değerini değil, model.classes_ içindeki o sınıfa karşılık gelen olasılık sütununu da seçin. İkili karar skorunda büyük değerlerin seçtiğiniz pozitif sınıfı desteklediğini doğrulayın.ROC eğrisini hazırlama
Ön koşul olarak Python ortamınızda
scikit-learn, matplotlib ve örnekte kullanılan veri kümesi için gerekli paketler kurulu olmalıdır. Aşağıdaki kod varsayımsal bir ikili sınıflandırma örneğidir ve doğrudan çalıştırılabilir.- Veriyi eğitim ve test kümelerine ayırın. Test kümesini model eğitiminde kullanmayın; aksi durumda çizilen ROC eğrisi modelin daha önce gördüğü verilerden etkilenir.
- Modeli yalnızca eğitim verisiyle eğitin. Bu örnekte lojistik regresyon kullanılmıştır; ROC hesabı model türünden bağımsızdır.
- Test kümesi için pozitif sınıf skorunu üretin.
predict_proba(X_test)[:, 1]ifadesi,1sınıfına ait olasılıkları alır. - ROC noktalarını ve ROC-AUC değerini hesaplayın.
roc_curve()farklı eşiklerdeki oranları,auc()ise eğrinin altındaki alanı hesaplar. - Eğriyi ve referans çizgisini görüntüleyin. Köşegen çizgi, rastgele tahmin davranışını temsil eder; model eğrisi bu çizgiye göre yorumlanır.
Python:
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import RocCurveDisplay, auc, roc_curve
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# Örnek veri kümesi: 0 ve 1 sınıflı ikili sınıflandırma
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.25,
random_state=42,
stratify=y,
)
# Ölçekleme ve model aynı işlem zincirinde tutulur.
model = make_pipeline(
StandardScaler(),
LogisticRegression(max_iter=5000),
)
model.fit(X_train, y_train)
# Pozitif sınıf olan 1 için olasılıkları al.
y_score = model.predict_proba(X_test)[:, 1]
# Farklı eşiklerde ROC noktalarını hesapla.
fpr, tpr, thresholds = roc_curve(y_test, y_score, pos_label=1)
roc_auc = auc(fpr, tpr)
# ROC eğrisini çiz.
display = RocCurveDisplay(
fpr=fpr,
tpr=tpr,
roc_auc=roc_auc,
name="Lojistik regresyon",
)
display.plot()
plt.plot([0, 1], [0, 1], linestyle="--", label="Rastgele tahmin")
plt.title("ROC eğrisi")
plt.legend()
plt.show()
print(f"ROC-AUC: {roc_auc:.3f}")
Kod çalıştığında grafikte yatay eksende yanlış pozitif oranı, dikey eksende doğru pozitif oranı görünür. Konsoldaki
ROC-AUC değeri, modelin pozitif örnekleri negatif örneklerden ayırma gücünü tek sayıyla özetler.Kendi verinizde kodu değiştirme
Kendi veri kümenizde
X özellik matrisi, y ise hedef değişken olmalıdır. Modeliniz olasılık üretiyorsa şu kullanım yeterlidir:
Python:
model.fit(X_train, y_train)
y_score = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_score, pos_label=1)
roc_auc = auc(fpr, tpr)
Model
predict_proba() sağlamıyorsa, destekliyorsa decision_function(X_test) çıktısını kullanabilirsiniz. Bu değer doğrudan olasılık olmak zorunda değildir; ROC eğrisi için örnekleri sıralayan sürekli bir skor olması yeterlidir. Sadece predict(X_test) çıktısını kullanmak ise genellikle yeterli değildir; çünkü bu çıktı tek bir eşikte verilmiş 0 veya 1 kararlarından oluşur ve farklı eşikleri inceleme olanağını kaybettirir.ROC-AUC ve eğri nasıl yorumlanır?
ROC-AUC değeri 0,5 civarındaysa modelin ayırma gücü rastgele tahmine yakındır. Değer 1'e yaklaştıkça pozitif örnekleri negatiflerden ayırma sıralaması güçlenir. Ancak AUC, belirli bir karar eşiğinde modelin kesin olarak ne kadar iyi çalıştığını göstermez; üretimde kullanılacak eşik ayrıca seçilmelidir.
Eğri üzerindeki her nokta farklı bir karar eşiğine karşılık gelir. Eşiği düşürmek daha fazla pozitif yakalayabilir ve doğru pozitif oranını artırabilir; bunun karşılığında yanlış pozitif oranı da yükselebilir. Eşiği yükseltmek yanlış alarmları azaltabilir, fakat bazı gerçek pozitiflerin kaçırılmasına yol açabilir.
| Model çıktısı | ROC için uygunluk | Neden |
|---|---|---|
predict_proba(X_test)[:, 1] | Uygun | Pozitif sınıfa ait sürekli olasılık skorlarını verir. |
decision_function(X_test) | Genellikle uygun | Sürekli karar skoru üretir; skorların olasılık olması şart değildir. |
predict(X_test) | Sınırlı | Tek eşikteki sınıf kararlarını verir; ROC için gerekli ara eşikler kaybolur. |
Dengesiz sınıflarda kontrol edilmesi gerekenler
Pozitif sınıf test kümesinde çok azsa ROC eğrisi yine hesaplanabilir; ancak eğriyi tek başına karar ölçütü yapmayın. Özellikle yanlış pozitiflerin maliyeti yüksekse precision-recall eğrisi, sınıf bazlı precision, recall ve karışıklık matrisi de incelenmelidir.
Ayrıca
y_test içinde iki sınıfın da bulunduğunu, y_score değerlerinin doğru pozitif sınıfa ait olduğunu ve veri ayırırken stratify=y kullanıldığını kontrol edin. Yanlış sütundan olasılık almak veya pozitif sınıfı ters tanımlamak, grafiği teknik olarak üretse bile yorumunu bozar.Sık sorulan sorular
ROC eğrisinde neden predict_proba()[:, 1] kullanılıyor?
İkili sınıflandırmada bu ifade, her test örneğinin pozitif sınıf olma olasılığını seçer. Sınıf sırası veri kümenizde farklıysa
model.classes_ değerini kontrol edin ve pozitif sınıfa karşılık gelen sütunu kullanın.ROC-AUC yüksek olduğu hâlde sonuçlar neden beklenenden kötü olabilir?
ROC-AUC genel sıralama gücünü özetler; seçtiğiniz gerçek karar eşiğinde precision, recall veya yanlış pozitif sayısı iyi olmayabilir. Uygulamanın yanlış pozitif ve yanlış negatif maliyetlerine göre eşiği ayrı doğrulama verisinde veya uygun çapraz doğrulama ile seçin; son test kümesini seçilmiş eşiğin tarafsız değerlendirmesi için saklayın.