Confusion Matrix(Karmaşıklık Matrisi)-Python
Sınıflandırma algoritmaları ile bazı modeller kurup tahminler yapıyoruz. Peki ama bu modellerin başarısını nasıl ölçmemiz gerekir? Kurulan model probleme ne kadar hızlı cevap veriyor? Veya birden fazla algoritma ile model kurulup tahmin yapıldığı zaman hangi algoritmanın daha başarılı olduğu ve probleme uygun olarak hangi algoritmanın seçileceğine nasıl karar vermemiz gerekir? İşte tüm sorulara karmaşıklık matrisi sayesinde cevap bulabiliriz. Confusion matrix, model ile yapılan tahmin ve gerçek değerlerin bir takım işlemden geçerek yapılan hesaplamalar neticesinde elde edilir. Bunun sonucunda bazı kriterler baz alınarak bir model ve algoritma seçimi yapılabilir.
Karmaşıklık matrisi bir eksende tahmin diğer ekseninde gerçek değerlerin olduğu bir matristir. Tahmin edilen değerler ile gerçek değerler bir takım işlemlerden geçerek bu matris elde edilir ve bu matris üzerinden model hakkında bazı çıkarımlarda bulunulur. Örnekte ikili veriler(evet hayır,kadın erkek vb.) üzerinden tahminler yapılacaktır. Bir örnek üzerinde anlamaya çalışalım.
Önce gerekli modülleri içeri aktaralım.
Veriyi Okuma
Veri setimizi pandas ile alalım ve verilerimizi tanıyalım.
Veri seti toplam 50 bireyden alınan özellikleri barındırıyor. Bireylerin cinsiyet, yaş, alkol kullanımı, sigara kullanımı ve radyasyona maruz kalma gibi özelliklerinden yola çıkarak bireyin kanser olup olmadığını gösterilmektedir. (Veriler random oluşturulmuştur) Bu veri setinin gerekli veri önişleme adımlardan geçtiğini varsayalım ve yolumuza devam edelim.
Gelen verilerden kanseri tahmin edeceğimiz için bağımlı değişkenimiz(y) Kanser olacaktır.
Özelliklerin birbirleri ile olan korelasyonuna bakalım.(veriler numeric yapıldıktan sonra bakılmalıdır.)
Veriler random olduğu için korelasyon değerleri pek iyi sayılmaz. Bu yazıda daha çok karmaşıklık matrisini ele alacağımız için bu süreçleri atlayarak model kuralım.
Kategorik Değişkenler => Numeric Değişkenler
Veri setindeki özellikler(Yaş hariç) kategorik değişkenlerdir. Model kurmadan önce bu değişkenleri numeric değerlere 0 ve 1 gibi modelin anlayacağı dile çevirelim. Sklearn içindeki çeşitli encoding yöntemleri yapabiliriz ama basit bir işlem olduğu için elle bir fonksiyon yazıp işlemi gerçekleştirelim.
Fonksiyon basitçe veri setini ve numeric yapılmak istenen değişkeni alıp numeric bir veri olarak return ediyor. Bütün kolonları(özellik-feature) tek tek fonksiyona göndermek yerine for döngüsü ile daha seri bir şekilde işimizi halledelim.
Bu işlemden sonra veri setimize bakalım
Evet görüldüğü üzere veri setindeki kategorik değişkenler 0 ve 1'lerden oluşan numeric değerlere çevrilmiş durumda. Kanser kolonunda 0 ‘hayır’ yani kanser değil ve 1 ‘evet’ yani kanserdir değerlerini temsil eder.
Veri setini bölme (train test split) & Model kurma
Verileri artık model hazır durumda. Eğitim ve test olarak bölelim ve RandomForestClassifier ile basit bir model kuralım.
Kurulan bu model ile tahmin yapalım.
Model kuruldu ve tahminler yapıldı. Bundan sonra karmaşıklık matrisi ile model performansı değerlendirilecek.
Confusion Matrix(Karmaşıklık Matrisi)
Yapılan bu tahmin değerleri ile gerçek değerler (y_test değerleri) arasında bazı karşılaştırmalar yapalım. Gerçek ve tahmin değerlerini bir dataframe ile birleştirip görelim.
yukarıdaki tabloyu inceleyecek olursak ilk birey için gerçekte 1 olan(‘evet’ yani kanser) değeri modelimiz de 1 olarak tahmin etmiş doğru bir tahmin yapmış. Gerçekte 0 olan(‘hayır’) değeri modelimiz 1 olarak yani evet olarak yanlış bir tahmin yapmış oldu. İşte bu tahmin ve gerçek değerleri karşılaştırdığımızda aşağıdaki kavramlarla karşılaşırız.
Pozitif(p) = evet (1)
negatif(n) = hayır (0) olarak belirtilsin.
True pozitive(Tp): Gerçekte kanser olan birisini modelin de “kanser” olarak tahmin etmesi (Yani doğru bir tahmin var ve pozitif yönde)
True negative(Tn): Gerçekte kanser olmayan birisini modelin de “kanser değil” olarak tahmin etmesi (Doğru bir tahmin var ve negatif yönde)
False negative(Fn): Gerçekte kanser olan birisini modelin “kanser değil” olarak tahmin etmesi (Yanlış bir tahmin var ve negatif yönde)
False pozitive(Fp): Gerçekte kanser olmayan birisini modelin “kanser” olarak tahmin etmesi (Yanlış bir tahmin var ve pozitif yönde)
Accuracy Score(Doğruluk Puanı): Sınıflandırma algoritmasının başarısını ölçer. Doğru yapılan tahminlerin tüm tahminlere oranını belirtir. 100 tane tahmin için 75 tanesini doğru bir şekilde tahmin ettiğimizi varsayarsak accuracy score 75/100 yani 0.75 olarak bulunur. Modeli değerlendirmek için bu değer tek başına yeterli olmayabilir.
Formül = (tp+tn) / toplam tahmin sayısı
recall(sensitivity)(TPR): True Positive Rate (Doğru pozitif oranı) gerçekte kanser olanların kaç tanesinin doğru sınıflandırıldığını belirtir. Gerçekte kanser olanların/(Gerçekte kanser)modelin “kanser” ve “kanser değil” olarak tahmin ettiği veriler toplamı
Formül = Tp / (Tp+Fn)
False Positive Rate-Yanlış Pozitif Oranı (FPR): Yanlış pozitif oranı gerçekte kanser olmayanların kaç tanesinin doğru sınıflandırıldığını belirtir. Gerçekte kanser olmayan/Gerçekte kanser olmayan birisini modelin “kanser” + Gerçekte kanser olmayan birisini modelin “kanser değil” olarak tahmin ettiği veriler
Formül = Fp / (Tn+Fp)
Hayır negatif olarak ve evet pozitif olarak kabul edersek şöyle bir tablo elde edebiliriz.
Yukarıdaki kavramları anladığımıza göre bu değerleri gerçek ve tahminlerden nasıl elde edeceğimize bakalım.
True positive aslında gerçekte 1 olup modelin de 1 olarak tahmin ettiği değerlerdir. O halde gerçekler ile tahminleri topladığımızda 2 olanların sayısı bize True positive sayısını verecektir.
True negative ise gerçekte 0 olup modelin de 0 olarak tahmin ettiği değerlerdir. Yine gerçekler ve tahminleri toplarsak 0 olanların sayısı ( 0 ile 0 toplamı yine sıfırdır :) ) bize true negative sayısını verecektir.
False positive gerçekte 0 olup modelin 1 olarak tahmin ettiği değerlerdir. O halde gerçekler ile tahmin çıkarılırsa -1 olanların sayısı (0–1 = -1) bize false negative sayısını verecektir.
False negative ise gerçekte 1 olup modelin 0 olarak tahmin ettiği değerlerdir. O zaman gerçeklerin ve tahminlerin birbirlerinden çıkarılması ile elde edilen 1 (1–0= 1) değerlerinin sayısı bize false negative sayısını verecektir.
Gerçek değerleri ve tahmin değerleri birbirleri ile toplayıp çıkaralım. Bunlar dataframe olarak tabloda gösterelim
Toplam sütunundaki 2 değerleri TP, 0 değerleri TN Fark sütunundaki -1 değerleri FP, 1 değerleri FN şeklinde olacaktır. Bu değerleri sayalım.
Yukarıdaki tablodan hareketle karmaşıklık matrisini oluşturalım.
diğer terimleri hesaplayalım
Bu çıkan değerler ile ve matris oluşturulan model değerlendirebilir. Accuracy score(acc) değeri 0.6 olarak hesaplanmış ve bu da modelin aslında pek iyi olmadığı anlamında gelebilir. Ama sadece accuracy değerlerine bakılarak sınıflandırma algoritmalarını değerlendirmek doğru olmayabilir. Örnek olarak ZeroR algoritması verilebilir.
ZeroR algoritması esasında gelen verilerin sınıflarına bakar ve hangi sınıftan daha fazla örnek varsa onu çıktı değeri belirler. Yani gelen verilerden en çok 1 değeri varsa bundan sonra yapılacak tüm tahminlerde sonuç olarak 1 döndürecektir çünkü en fazla örnek 1 sınıfına ait. Böyle olunca accuracy değerleri daha yüksek çıkmaya başlar. Oysaki hiç bir öğrenme ve değerledirme yapmadan TN,TP,FN,FP değerli tek bir sınıfa dahil ederek çıktı üretiyor. Bu algoritma accuracy değeri yüksek çıkmasına rağmen başarılı bir algoritma olarak değerlendirilmez. Çünkü diğer tüm çıktıları gözardı ederek sadece fazlalığa odaklandığı için sağlıklı bir sonuç vermeyecektir. O yüzdendir ki sınıflama algoritmalarını değerlendirirken diğer kriterleri de göz önünde bulundurmak gerekir.
Sınıflandırma algoritmalarını değerlendirebileceğimiz ROC ve ROC ile birlikte kullanılan AUC yazılarında görüşmek üzere..İyi çalışmalar dilerim.