ROC ve AUC Eğrileri

ROC-AUC eğrileri, çeşitli eşik değerlerinde(threshold) sınıflandırma problemleri için bir performans metriğidir. “Performans Metrikleri” adlı yazımızda değindiğimiz sınıflandırma metrikleri olan kesinlik(precision) ve duyarlılık(recall) bu konunun iyi bir şekilde anlanabilmesi için bilgi sahibi olunması gereken önemli konulardandır. Bu yüzden eğer bu terimler ile ilgili bilgi sahibi değilseniz bu yazımıza devam etmeden önce “Performans Metrikleri” adlı yazımızı okumanızı öneririm.

Eşik Değeri(Threshold)

Öncelikle kısaca eşik değerinin ne olduğundan bahsedelim. Eşik değeri, sınıflandırma problemleri için olasılık değerlerine göre ne şekilde bir sınıflandırma yapılması gerektiğinin bir kriteridir. Örnek olarak eğer eşik değerimiz 0.5 ise 0.5 ve üzerinde yaptığımız tahminler 1 sınıfına, 0.5’ in altında yapılan tahminler 0 sınıfına ait olacaktır. Eğer eşik değerimiz 0.3 ise 0.3 ve üzeri değerler 1 sınıfı, altındaki değerler 0 sınıfı olarak sınıflandırılacaktır. Peki bu eşik değeri bize ne kazandırıyor? Eşik değerleri üzerinde oynamalar yaparak kesinlik ve duyarlılık gibi farklı metrikleri kendi isteklerimiz ve amaçlarımız doğrultusunda değiştirebiliriz.

Kesinlik ve Duyarlılık Arasındaki İlişki

Kesinlik ve duyarlılık ters bir ilişkiye sahiptir. Farklı eşik değerleri için biri artarken diğeri azalır. Hatırlatma olarak aşağıdaki görselde kesinlik ve duyarlılığın formülleri yer almaktadır.

roc
Kesinlik ve Duyarlılık

Bu ilişkiyi daha iyi anlamak adına bir örnek inceleyelim. Problemimiz hasta sınıfı pozitif(1) ve sağlıklı sınıfı negatif(0) olmak üzere iki adet sınıftan oluşsun. Örnek olarak verilerimiz aşağıdaki gibi dağılsın ve bir lojistik regresyon modelimiz olsun.

roc
Veriler

. İlk olarak eşik değerimizin 0.5 olduğu durumu inceleyelim. Modelimizin yaptığı tahminlere göre karmaşıklık matrisimiz ve kesinlik-duyarlılık değerlerimiz aşağıdaki görseldeki gibidir.

roc
Eşik Değeri = 0.5

Eşik değerimizi 0.75’ e çıkaralım ve nasıl bir değişim ile karşılaşacağımızı gözlemleyelim. Karmaşıklık matrisimizi oluşturduğumuzda alacağımız sonuç aşağıdaki gibidir.

roc
Eşik Değeri = 0.75

Görüldüğü gibi kesinlik değerimizde artış olduğunu, duyarlılığın ise sabit kaldığını görüyoruz. Bu durumda eşik değerini artırarak hasta olarak sınıflandırma yaparken daha seçici davranıyoruz fakat gözümüzden gerçekten hasta olan insanlar da kaçabiliyor.

Eşik değerimizi 0.20’ e düşürelim ve değişimi inceleyelim. Aşağıda görüldüğü gibi bu sefer de kesinlik değerinde bir azalış ve duyarlılıkta artış gözlemliyoruz. Bu durumda gözümüzden hasta bir insan kaçmıyor fakat gerçekte hasta olmayan insanlara hasta teşhisi koyarak hataya düşüyoruz.

roc
Eşik Değeri = 0.2

Peki en iyi eşik değerine nasıl karar veririz. Bütün eşik değerlerini tek tek denemeye kalkarsak hesaplanması gereken bütün karmaşıklık matrisleri baş edilemeyecek bir hal alır. Tam bu noktada ROC eğrisi devreye giriyor.

ROC

ROC eğrisine geçmeden önce öğrenmemiz gereken ekstra bir metrik vardır o da yanlış pozitif oranıdır(false positive rate). Formülü aşağıdaki gibi yanlış pozitif değerlerin gerçekteki negatif değerlere bölümüdür.

roc
Yanlış Pozitif Oranı

Artık aşağıdaki grafiğimizi çeşitli eşik değerleri için doldurup ROC eğrimizi elde edebiliriz.

roc
ROC Grafiği

İlk olarak eşik değerimizi 0 seçerek başlayalım. Eşik değerin 0 olması demek bütün tahminlerimizi 1 olarak yapıyoruz demektir. Yani bizim örneğimizi için bütün tahminlerimiz hasta sınıfına ait olacaktır.

roc
ROC Eşik Değeri 1

Eşik değerimizi bir tık artırıp sadece bağımsız değişkenin(x) değerin en az olduğu örneği sağlıklı olarak sınıflandıralım. Aşağıdaki gibi bir sonuç elde ederiz. Yeni noktamızın yanlış pozitif oranı bir öncekine göre daha az olduğu için şu anki eşik değerimiz bir öncekine göre daha iyi bir sonuç veriyor.

roc
ROC Eşik Değeri 2

Eşik değerimizi bir tık daha artırıp x değerlerinin en az olduğu iki örneği de sağlıklı olarak sınıflandıralım. Aşağıdaki sonuca göre yeni noktamız bir önceki noktamızın solunda kalıyor, bu da yeni eşik değerimizin bir öncekine göre daha iyi olduğunu gösteriyor.

roc
ROC Eşik Değeri 3

Eşik değerlerimizi yavaş yavaş artırmaya devam edelim. Sırasıyla aşağıdaki görselleri elde ederiz.

roc
ROC Eşik Değeri 4
roc
ROC Eşik Değeri 5
roc
ROC Eşik Değeri 6
roc
ROC Eşik Değeri 7
roc
ROC Eşik Değeri 8

En sonundaki eşik değerimizde bütün tahminlerimizi 0 olarak sınıflandırıyoruz. Bunun sonucunda da %0 kesinlik ve %0 yanlış pozitif oranının elde ediyoruz.

Son olarak bütün noktalarımızı birleştirerek ROC eğrimizi elde ediyoruz.

roc
ROC Eğrisi

ROC eğrilerini uygun eşik değerini seçebilmek için yorumlarız. Örnek olarak bu eğrimizde en iyi eşik değerlerimiz 3. ve 5. noktalardır. Bu noktalar arasındaki seçimi yapabilmek artık bize kalmış bir durumdur. Problemimize göre daha yüksek duyarlılığı veya daha düşük yanlış pozitif oranını tercih edebiliriz.

AUC

AUC, ROC eğrisinin altında kalan alanı ifade eder. 0 ile 1 arasında değer alır ve 1’ e ne kadar yakınsa model de bir o kadar başarılıdır. Oluşturduğumuz ROC eğrisinin AUC değeri 0.9′ dur.

roc
AUC

AUC değeri, aynı veri seti üzerinde eğitilmiş iki modelin başarısının karşılaştırılmasını kolaylaştırır. Aşağıdaki örnekte farklı modellerin aynı veri seti üzerindeki başarısını karşılaştırabiliriz. Kırmızı modelin mavi modele göre çok daha iyi bir performans verdiğini görebilirsiniz.

roc
AUC Değerleri Karşılaştırması

Tabii ki de bu ROC ve AUC değerlerinin çıkarılmasını her seferinde ellerimizle yapmıyoruz. Aşağıdaki kodu inceleyerek ROC grafiğini nasıl çıkarabileceğimizi ve AUC değerlerini nasıl elde edebileceğimizi inceleyebilirsiniz.

from sklearn.metrics import roc_curve,auc
import matplotlib.pyplot as plt


gercek_degerler = [1,1,0,1,0,0,0,1,0,1,1,1]
tahminler = [0.98,0.43,0.3,0.55,0.35,0.2,0.1,0.60,0.03,0.85,0.35,0.58]
tahminler_2 = [0.63,0.54,0.4,0.7,0.4,0.66,0.51,0.4,0.3,0.8,0.71,0.4]

ypo, duyarlilik, esik_degerleri = roc_curve(gercek_degerler,tahminler)
auc_1 = auc(ypo,duyarlilik)

ypo_2, duyarlilik_2, esik_degerleri_2 = roc_curve(gercek_degerler,tahminler_2)
auc_2 = auc(ypo_2,duyarlilik_2)


plt.plot(ypo,duyarlilik,label="Model 1 AUC = %0.3f" %auc_1)
plt.plot(ypo_2,duyarlilik_2,label="Model 2 AUC = %0.3f" %auc_2)

plt.xlabel("Yanlış Pozitif Oranı")
plt.ylabel("Duyarlılık")

plt.legend(loc='lower right')

plt.show()

Her ne kadar bu yazımızda ROC eğrilerini çıkarırken yanlış pozitif oranını kullanmış olsak da dengesiz veri setlerinde yanlış pozitif oranın yerine kesinlik(precision) değeri de kullanılabilir.