• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

Scikit-learn ile ROC eğrisi nasıl hazırlanır?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni
İkili sınıflandırma modelinin gerçek etiketlerini ve pozitif sınıfa ait olasılıklarını kullanarak 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.
  1. 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.
  2. 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.
  3. Test kümesi için pozitif sınıf skorunu üretin. predict_proba(X_test)[:, 1] ifadesi, 1 sınıfına ait olasılıkları alır.
  4. ROC noktalarını ve ROC-AUC değerini hesaplayın. roc_curve() farklı eşiklerdeki oranları, auc() ise eğrinin altındaki alanı hesaplar.
  5. 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 uygunlukNeden
predict_proba(X_test)[:, 1]UygunPozitif sınıfa ait sürekli olasılık skorlarını verir.
decision_function(X_test)Genellikle uygunSü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.
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.

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.
 

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Geri
Üst