Performans Metrikleri

Bu yazımızda makine öğrenmesi modellerimizin veri setleri üzerindeki başarısını nasıl ölçebileceğimizden ve farklı performans metriklerinden bahsedeceğiz. Öncelikle bu ölçümlerin öneminden bahsedelim. Çoğu zaman bir problem üzerinde çalışırken elimizde birden fazla makine öğrenmesi modeli bulunur ve içlerinden en başaralı olanını seçmek isteriz. Bu durumda her bir modelin ayrı ayrı performansını ölçer ve bu sonuca göre en başarılı model ile yolumuza devam ederiz. Bir diğer önemli nokta ise modelimizin eğitim ve test kümelerindeki başarılarını karşılaştırmak isteriz. Bu sayede modelimizin sorunlarını fark eder ve bu sorunlara çözümler üretiriz. Regresyon ve sınıflandırma için farklı performans metrikleri kullanırız.

Regresyon Performans Metrikleri

Yitim Fonksiyonları Nedir yazımızda da değindiğimiz gibi yitim fonksiyonları da modellerimizin başarısının bir ölçüsüdür. Yitim fonksiyonlarına ek olarak R-kare ve düzeltilmiş(adjusted) R-kare metriklerine değineceğiz.

R-kare metriği modelimizin tahminlerinin ne kadar iyi olduğunun bir ölçüsüdür. En yüksek 1 değerini alabilir, en düşük olarak da eksi değerlere inebilir. R-kare değerimiz 1’ e ne kadar yakın ise modelimizin veriler üzerindeki başarısı da bir o kadar yüksektir. Formülü aşağıdaki gibidir.

Performans Metrikleri
Formülü

Formüldeki ortalama farkların toplamı bize olabilecek en kötü modelin hatasını veriyor. Nedir bu en kötü model? Herhangi bir yapay zeka modeli eğitmeden veri setindeki bağımlı değişkenlerin(çıktı) ortalamasının alınıp bütün örneklere bu ortalama değeri tahmin olarak sunmaktır. Eğer eğittiğimiz modelin hatasını gösteren hata kareleri toplamı, bu değerden büyük ise R-kare değerimiz eksi çıkmaktadır. Yani olabilecek en kötü modelden bile daha kötü bir model eğitmişiz demektir.  Aradaki oran küçüldükçe R-kare değerimiz artıp, 1’ e yaklaşmaktadır. Aşağıdaki örnek kodda iyi yapılmış ve kötü yapılmış tahminlerin R-kare değerlerini karşılaştırabilirsiniz.

from sklearn.metrics import r2_score

gercek_degerler = [10,11.2,13,20,9,8.5,7.3]

iyi_tahminler = [9.9,11.2,12.5,19.8,9.1,8.23,7.2]
kotu_tahminler = [15,9,17,15.3,5.5,6.3,11.5]

print("İyi yapılmış tahminlerin R^2 skoru : ", r2_score(gercek_degerler,iyi_tahminler))
print("Kötü yapılmış tahminlerin R^2 skoru : ", r2_score(gercek_degerler,kotu_tahminler))

Düzeltilmiş(Adjusted)

R-kare değerinin bir dezavantajı vardır. Bazen modelimizin başarısını artırmak için yeni bağımsız değişkenler ekleriz fakat eklediğimiz bağımsız değişkenin modele kötü bir etkisi olsa bile R-kare değeri her zaman artacaktır. Bu noktada düzeltilmiş R-kare kullanmak bize fayda sağlayacaktır. Formülü aşağıdaki gibidir.

Performans Metrikleri
Düzeltilmiş

Sınıflandırma Performans Metrikleri

Karmaşıklık Matrisi(Confusion Matrix)

Aşağıda görmüş olduğunuz tablo karmaşıklık matrisidir.

Performans Metrikleri
Karmaşıklık Matrisi

Bu matristeki değerleri kullanarak çeşitli metriklerin hesaplamalarını yapabiliriz. Ama öncellikle tablodaki terimlerin ne ifade ettiklerine değinelim. Doğru pozitif(true pozitive), bizim modelimizin tahmininin pozitif olduğunu ve bu tahminin de doğru yani gerçekteki değerimizin de pozitif olduğunu gösteriyor. İlk başta doğru ve pozitif gibi terimlerin kullanımı biraz karışık gelebilir bunu bir örnek ile pekiştirelim. Bir kitlenin iyi huylu veya kötü huylu olmasını sınıflandıralım. İyi huylu sınıfını pozitif(1) olarak, kötü huylu sınıfını ise negatif(0) olarak alalım. O zaman doğru pozitif bizim modelimizin tahmininin iyi huylu olduğunu ve kitlenin gerçekten de iyi huylu olduğunu ifade eder. Yanlış pozitif(false pozitive), yine aynı örnekten gidecek olursak modelimizin tahmininin iyi huylu(pozitif) olduğunu fakat gerçek değerin kötü huylu(negatif) olduğunu gösterir. Doğru negatif(true negative), bizim modelimizin tahmininin kötü huylu ve gerçekteki değerin de kötü huylu olduğunu gösterir. Yanlış negatif(false negative), modelimizin tahminin kötü huylu olduğunu fakat gerçekteki değerin iyi huylu olduğunu gösterir. Aşağıdaki kod örneğinde sklearn kütüphanesini kullanarak karmaşıklık matrisini nasıl elde edebileceğinizi inceleyebilirsiniz.

from sklearn.metrics import confusion_matrix

# 4 adet DP, 2 adet DN, 3 adet YP, 2 adet YN
gercek_degerler =  [0,0,1,0,1,1,1,0,1,1,0] 
tahmin_degerleri = [1,0,1,1,0,1,1,0,1,0,1]

print(confusion_matrix(gercek_degerler,tahmin_degerleri))

Doğruluk(Accuracy)

Doğru yaptığımız tahminlerin sayısının bütün yaptığımız tahminlerin sayısına bölümünden bulunur. Formülü aşağıdaki gibidir.

Performans Metrikleri
Doğruluk

Örnek olarak yukarıda göstermiş olduğumuz karmaşıklık matrisinin doğruluk değerinin (40 + 50) / 100’ den %90 olarak hesaplarız. Doğruluk değeri bize her zaman güvenilir bir sonuç vermeyebilir. Bu durumu şöyle açıklayabiliriz. Elimizde dengesiz(imbalanced) bir veri seti olduğunu düşünelim. Dengesizlik durumu bir sınıfa ait olan örneğin diğer sınıflara ait olan örneklerden sayıca çok üstün olması sonucu oluşur. Elimizdeki veri setinde pozitif sınıftan 95 adet ve negatif sınıftan 5 adet olduğunu varsayalım. Eğer algoritmamız hiçbir şey öğrenmeden her şeye pozitif derse bu veri setindeki doğruluk oranı %95 olmaktadır. Bu değer gayet başarılı fakat bir o kadar da yanıltıcı bir değerdir çünkü elimizdeki algoritma hiçbir şey öğrenmeden here şeye pozitif sonucunu veriyor ve yanlış sınıfındaki örneklerde ise çok başarısız bir model.

Kesinlik(Precision)

Pozitif olarak tahmin ettiğimiz(DP + YP) örneklerin kaçının doğru tahmin edildiğinin oranıdır. Formülü aşağıdaki gibidir.

Performans Metrikleri
Kesinlik

Duyarlılık(Recall)

Pozitif olarak tahmin edilmesi(DP + YN) gereken örneklerin oransal olarak kaçının doğru tahmin edildiğinin göstergesidir. Formülü aşağıdaki gibidir. 

Performans Metrikleri
Duyarlılık

Aşağıdaki kod örneğinde doğruluk, kesinlik ve duyarlılığı nasıl hesaplayabileceğinizi görebilirisiniz.

from sklearn.metrics import recall_score, precision_score, accuracy_score

# 4 adet DP, 2 adet DN, 3 adet YP, 2 adet YN
gercek_degerler =  [0,0,1,0,1,1,1,0,1,1,0] 
tahmin_degerleri = [1,0,1,1,0,1,1,0,1,0,1]

print("Doğruluk : ", accuracy_score(gercek_degerler,tahmin_degerleri))
print("Duyarlılık : ", recall_score(gercek_degerler,tahmin_degerleri))
print("Kesinlik : ", precision_score(gercek_degerler,tahmin_degerleri))

Dengesiz dağılmış veri seti için örnek olarak aşağıdaki karmaşıklık matrisini inceleyebiliriz.

Performans Metrikleri
Dengesiz Veri

Veri setimize göre pozitif sınıf sayısı 160, negatif sınıfın sayısı ise 840’ tır. Öncelikle doğruluk değerini hesaplayalım. Formülümüze göre doğruluk değerimizi (820 + 80) / 1000’ den %90 çıkmaktadır. Gayet başarılı bir değer fakat duyarlılığı hesaplayacak olursak 80 / (80 + 80)’ den %50 olarak çıkmaktadır. Bizim için tatmin edici olmayan bir başarı değeri. Kesinliği de 80 / (80 + 20)’ den %80 olarak hesaplıyoruz. Burada kritik bir nokta vardır. Dengesiz veri setleri üzerinde karmaşıklık matrisini oluştururken sayıca az olan örneği pozitif sınıf olarak seçmeliyiz. Yukarıda yaptığımız örnekte sınıfları tam tersine çevirirsek aşağıdaki matrisi elde ederiz.

Performans Metrikleri
Tersine Çevrilmiş Matris

Doğruluk değerimiz değişmeyip yine %90 olacaktır. Kesinlik değerimiz 820 / (820 + 80)’ den %91,1’ e ve duyarlılık değerimiz 820 / (820 + 20)’ den %97,6’ ya çıkacaktır ve yanıltıcı bir sonuç verecektir.

F1-Skoru(F1-Score)

F1 skoru kesinlik ve duyarlılık değerlerini birleştirerek tek bir sayıya indirger. Formülü aşağıdaki gibidir. F1 skorunu, elimizde birden fazla modelin kesinlik ve doğruluk değerleri varken arasından en iyi modeli seçmek için kullanırız. F1 skoru en yüksek 1 değerini alırken, en düşük olarak da 0 değerini alır. Aşağıdaki örnekte farklı modellerin F1 skorlarını nasıl hesaplayabileceğinizi inceleyebilirsiniz.

Performans Metrikleri
F1 Skor

Sınıflandırma metriklerine ek olarak ROC-AUC eğrileri vardır. Bu değerleri ilerleyen yazılarımızda daha detaylı bir şekilde inceleyeceğiz.