Ana içeriğe atla

Python - Lojistik Regresyon

Lojistik regresyon, bir sonucu belirleyen bir veya daha fazla bağımsız değişken bulunan bir veri kümesini analiz etmek için kullanılan istatistiksel bir yöntemdir. Lojistik regresyon, bağımlı değişkenin kategorik bir değişken olduğu regresyon problemi gibidir. Doğrusal sınıflandırma problemlerinde yaygın bir biçimde kullanılır. Regresyon denilmesine rağmen burada bir sınıflandırma söz konusudur.


Lojistik Regresyon için Özet Noktalar:

- Bağımlı değişken ile bağımsız değişkenler arasında doğrusal bir ilişki varsaymaz, ancak açıklayıcı değişkenlerin logitleri ile yanıt arasındaki doğrusal ilişkiyi varsayar.
- Hataların bağımsız olması gerekir, ancak normal dağılmaz.
- Parametreleri tahmin etmek için sıradan en küçük kareler (OLS) yerine maksimum olasılık tahmini (MLE) kullanır ve bu nedenle büyük örneklem yaklaşımlarına dayanır.
- Uygunluk iyiliği ölçütleri, sezgisel kuralın hücre sayımlarının% 20’sinden azının 5’in altında olmadığı yeterince büyük örneklere dayanır.

Lojistik regresyon, y değişkenin olma olasılığı ile veri setindeki x öznitelikleri (eğitim, medeni durum, yaş vs.) arasındaki ilişkiyi anlamamıza yardımcı olur. Lineer regresyon bize (-∞, +∞) arasında sonuçlar verir. Bizim problemimizde elde etmek istediğimiz bir olasılık değeri olduğu için değerleri S şeklindeki lojistik fonksiyonundan (sigmoid fonksiyonu) geçirip [0,1] arasına alıyoruz.

Örneğin sonuç 0.8 çıktıysa şunu söyleyebiliriz: elimizdeki X değerleriyle (eğitim, yaş vs.) o kişinin maaşı %80 olasılıkla 50K’dan yüksek. Günün sonunda da elde ettiğimiz olasılık değeri 0.5'ten büyükse (threshold’u biz belirliyoruz.) sonucu 1 küçükse 0 olarak etiketliyoruz.



Lineer regresyonda bağımsız değişkenlerin parametreleri Ordinary Least Squares (OLS) yöntemiyle tahmin edilirken Lojistik regresyonda parametreler Maximum Likelihood (MLE) yöntemiyle hesaplanıyor. MLE yönteminin amacı sonsuz parametre havuzundan veri setinin görülme olasılığını maksimize eden en iyi parametreleri seçmek.

Lojistik regresyon modelini “diabets” veri seti üzerinden yapacağım. Burada şeker hastası olan hastaların kan basıncı, hamilelik durumu, insülin değerleri vs gibi değerleri bulunmaktadır. “Outcome” isimli parametrede ise hastaların diabet hastası olma durumu (0 ise değil 1 ise diabet hastası) verilmektedir. Bunun üzerinden ben hastaların şeker hastası olma ihtimalini hesaplayacağım. İlk olarak, analizlerde kullanacağım modülleri indirdikten sonra veri setimi çağırıyorum.


Veri setimde yer alan değişkenlerin özelliklerini inceliyorum. Burada özellikle bağımlı değişkenim olacak olan outcome değişkeninin dağılımını inceliyorum ve görselleştiriyorum.


Daha sonra, modelde kullanacağım numerik değişkenlerin istatistiki özelliklerine bakıyorum. Burada değişkenler özelinde ortalama değerleri ile dörtte birlik değerlerini inceliyorum. Değişkenler özelinde herhangi bir aykırı veya saçma bir değer görünmüyor. Örneğin age değişkeninde ortalama 33 yaş maksimum ise 81 yaş imiş, yani veri normal görünüyor.


Şimdi model kısmına geçebilirim. İlk olarak basit anlamda modeli anlamak için statsmodel üzerinden modelimi kurup model sonuçlarını inceleyeceğim. Modele veri setini koyarken test-train ayrımı yapmıyorum çünkü bunu en son tuning aşamasında yapacağım. Burada R2 ve p value değerlerini inceliyorum ve bazı değişkenlerin anlamlı (p<0,05) olmadığını görüyorum.


Modelimi şimdi scikit-learn ile kuruyorum ve model parametreleri ile katsayı değerlerine bakıyorum.


Şimdi modelin tahmin aşamasına geçiyorum ve test veri setimi tahmin et diyorum. Sonrasında, karmaşıklık matrisi, doğruluk oranı ve sınıflandırma raporunu çıkarıyorum. Bunlar benim modelime ilişkin oldukça faydalı özet bilgiler. Modelin doğruluk oranının %77 olduğunu görüyorum. Yani gerçekleşen değerleri %77 oranında doğru tahmin etmişim.


Model bana tahmin edilen değerleri yine 0-1 ayrımında kendisi veriyor. Ancak ben neye göre 0 neye göre 1 sınıflandırmasına konu olacağını kendim belirlemek istiyorum. Yani eşik değerini ben kendim manuel gireceğim. Bunun için tahmin edilen sonucu değil de olasılık değerlerini getir diyorum.

Burada ilk 10 indeks özelinde tahmin edilen değerleri, bunların olasılık değerlerini ve gerçek değerlerini yorumlayacağım. Bunun için ilk olarak tahmin edilen 10 indeksimi çağırıyorum. İlk indeksimin tahmin değeri 1 geliyor. Yani ben ilk indeksi (0) şeker hastası olarak tahmin etmişim. Şimdi bunun olasılık değerine bakacağım. Olasılık değerleri 0-1 ayrımında gelir. Yani ilk sütunda 0’a ait olasılık değeri ikinci sütunda 1’e ait sütun değeri gelir. İlk indeksin %64 ile 1 olarak tahmin edildiğini görüyorum. Son olarak gerçekte ilk indeksin ne olduğuna bakıyorum ve ilk indeksimin (sıfırıncı) 1 olduğunu yani doğru tahmin ettiğimi görüyorum. İkinci indeksimi ise %91 ile doğru olarak “0” olarak tahmin etmişim.


Şimdi, X’in olasılık değerlerini y_probs olarak kaydediyorum ve sadece 1 olma olasılık değerlerini getir diyorum. Bu işlemi olasılık değerleri üzerinden kimin 0 kimin 1 olacağına ben karar vermek istediğim için yapıyorum. Bunun için ise eşik değerleri giriyorum. Buna göre %50 sınırına göre eşik giriyorum. Zaten model de %50 üzerinden çalışıyor ama ben bunu değiştirebilirdim. Sonucu görmek için ilk 10 indeksin 1 olma olasılık değerlerini çağırıyorum, eşik değerini giriyorum sonra da tahmin edilen ilk 10 indeks ile karşılaştırıyorum. Örneğin ilk indeksimin 1 olma olasılık değeri %64 buna göre tahmin edilenin de 1 olması gerekiyor ki öyle, demek ki doğru tahmin etmişim.


Kendi belirlediğim eşik değerleri üzerinden kurduğum modelin özet bilgilerini getiriyorum.


Şimdi model tuning aşamasına geçebilirim. Burada bakacağım en önemli parametre ROC eğrisi. ROC eğrim eğer ben herhangi bir model kurmasaydım yani rastgele 0-1 değerlerini atasaydım modelimin başarısı ne olurdu, benim modelimin başarısı ne olmuş onu gösteriyor. Dolayısıyla burada kırmızı çizgi model olmasaydı nolurdu kısmını, mavi çizgi ise benim modelimi gösteriyor. Bu sebeple mavi çizginin her zaman kırmızı çizginin üstünde olması gerekiyor.


Modelimin başarısını gördükten sonra doğrulanmış accuracy oranını getirmek yani tuning yapabilmek için test train ayrımı yapıyorum ve modelimi fit ediyorum. Bunun sonucunda 10 katlı cross validation yaparak doğrulanmış accuracy oranımın %77 olduğunu hesaplayarak analizime son veriyorum.


Yorumlar