Lojistik regresyon, istatistikte ve makine öğrenmesinde çokça kullanılan sınıflandırma(classification) yöntemlerinden biridir. Şu ana kadarki yazılarımda daha çok regresyon yönteminin üzerine düşmüştüm. Bu yazıda ise her ne kadar kullanacağımız metodun adı regresyon da olsa, önceki regresyon yazılarından farklı olarak nümerik bir çıktıyı(output) değil, bir sınıfı(kategoriyi) tahmin etmeye çalışacağım. Bu tarz tahminler yapan yöntemlere sınıflandırma(classification) yöntemleri denir. Bu yöntemlerle 2 ya da daha fazla sınıfın tahminlemesi yapılabilir. Tabi sınıf tahminlemesi deyince, akla ilk olarak olasılıksal sonuçlar gelmelidir. Genellikle, sınıflandırma yöntemlerinde çıktı olarak sadece tahmin edilen sınıf değil, bunun yanında o sınıfa ait olma olasılığı da belirtilir. Burada sunulan olasılık, aslında bizim o tahminden ne kadar emin olduğumuzu ifade eder.

Lojistik regresyon da bu sınıflandırma yöntemlerinden biri olduğu için biz de son aşamada tahminlenen kategoriyle beraber bu sonuçtan ne kadar emin olunduğunun olasılığı da belirtilmelidir.. Lojistik regresyonun hem teorik hem de teknik detaylarına, yazı esnasında yeri geldikçe değineceğim. Hazır olduğumuza göre, artık yazıya başlayabiliriz.

Yazıda kullanacağımız veri seti, bir Portekiz bankacılık kurumunun telefon üzerinden yaptığı doğrudan pazarlama kampanyaları ile ilgili. Bu telefon konuşmalarının genel amacı, müşteriye bir banka vadeli mevduatı satmak. Yazının amacı da bu veri setinden yola çıkarak müşterilerinin bu mevduata abone olup olmayacaklarını tahmin etmek. Yani aslında sonuca baktığımızda 2 sınıftan birini tahmin etmeye çalışacağız. “Yes” ya da “No”, müşteri abone olacak ya da olmayacak. Kullanacağım veri setini buradan indirebilir ve veri hakkında genel bilgi sahibi olmakla beraber kolonlardaki değişkenlerin neleri ifade ettiğini de öğrenebilirsiniz. Veriyi Pyhton’a almakla başlayalım:

import os
os.getcwd()
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
Data = pd.read_csv('bank-full.csv')
Data_pd = pd.DataFrame(data=Data)
len(Data_pd)
len(Data_pd.columns)
Data_pd.head(n=10)

Evet üstteki kod bloğunda bir önceki yazıda olduğu gibi öncelikle üzerinde çalıştığımız dosya yolunu öğrendik ve daha sonra ihtiyacımız olan kütüphaneleri indirdik. Veriyi csv formatında Python üzerine aldıktan sonra da pandas data frame nesnesine dönüştürdük. En son aşamada ise kaç satır ve sütun olduğuyla beraber verinin de ilk 10 satırını görmek istedik.

1

Evet veride 17 değişken ve 45210 gözlem var. İlk 10 satırı da inceleyelim:

2

Tahmin etmek istediğimiz değişken buradaki son sütunda bulunan “y” değişkeni. Bu bize yapılan aramalar sonucunda müşterilerin mevduata abone olup olmadıklarını gösteriyor. İşlemlere başlamadan önce, veriyi lojistik regresyona hazırlayalım. Veri ile yapılan bu tarz ön hazırlıklara “Data Preprocessing” de denmekte. Öncelikle geçen sefer yaptığımız gibi veriyi “NA” kayıtlardan temizleyeceğiz. Daha sonrasında ise elimizde bulunan değişkenlerin tiplerine bakacak ve kategorik olanlara kodlama işlemi uygulayacağız. Hesaplama işlemlerinin kolaylığı açısından kategorik değişkenleri kodlamak etkili olabilir. Programlama dillerindeki bazı fonksiyonlar kategorik değişkenlerin kodlanmasını gerektirirken, bazılarında ise fonksiyon bu tarz senaryoları kendi kendine halledebilmekte. Biz ise burada çok kullanılan bir kategorik değişken kodlama yöntemi olan “One-Hot Encoding” yöntemini de göstermek amacıyla bu işlemi gerçekleştireceğiz. Aşağıdaki kod bloğu ile başlayalım:

Data_pd_Filtered = Data.dropna(axis = 0, how = 'any')
Data_pd_Filtered.dtypes
for col in Data_pd_Filtered.iloc[:,[1, 2, 3, 4, 6, 7, 8, 10, 15, 16]]:
Data_pd_Filtered[col] = Data_pd_Filtered[col].astype('category')
Data_pd_Filtered.dtypes

Kod bloğundan kısaca bahsedecek olursak, ilk satırda geçen yazıda olduğu gibi NA’ları temizledik. Dikkat edelim ki veri setinde bazı kolonların değerleri “Unknown” gözüküyor. Kolon içeriklerine baktığımızda bunların bilinmemesi gayet normal. Mesela bir müşteri daha önce herhangi bir aboneliğe tabi olmamışsa bazı bilgilerin bilinmemesi kuvvetle muhtemel. Bu yüzden bu bilinmeyenler veri setinin doğası gereği olduğu için, bunlara dokunmayacağız. İkinci satırda ise kolonların veri tiplerini görmek için “.dtypes” komutundan yararlandık. Komutun sonucuna bakalım:

3

Evet üstteki “object” tipli kolonları “category” tipine çevirelim ve daha sonra One-Hot Encoding yöntemini uygulayalım. Kod bloğunun üçüncü satırında bir for döngüsü vasıtasıyla bu kolonları “category” veri tipine çeviriyoruz. Buradaki “.iloc” komutu index vererek kolonları seçmemi sağlıyor. “;” ise bahsi geçen kolonların tüm satırlarını alacağımı ifade ediyor. Daha sonra aynı data frame içerisindeki aynı isimli kolonu “.astype” komutu ile category tipine çeviriyorum. Veri setinin kolonlarının tiplerine yeniden bakalım:

4

İstediğimiz kolonlar category tipine dönmüş durumda. Artık kodlama işlemine başlayabiliriz. Önce One-Hot Encoding metodundan biraz bahsedeyim. Bu metod kategorik değişkenleri her bir seviyesi için bölerek tamamen ayrı değişkenlere dönüştürür. Örneğin cinsiyet değişkenini düşünürsek 2 seviyesi var: Kadın ve Erkek. Bu değişkene One-Hot Encoding metodunu uyguladığımızda “cinsiyet” adında tek bir değişken yerine artık “Kadın” ve “Erkek” olmak üzere iki değişkenimiz olacak ve kadınlar için Kadın kolonunda 1 Erkek kolonunda 0, erkekler için ise Erkek kolonunda 1 Kadın kolonunda 0 olacak. Bu metodun dezavantajı ise çok fazla seviyesi olan kategorik değişkenler için veri setindeki değişken (veya özellik) sayısına yüksek derecede şişirebilir. Örneğin veri setinde içerisinde 100 tane ülke barındıran bir “Ülke” değişkeni olduğunu varsayalım. Bu durumda One-Hot Encoding yapıldığında bu bir değişkenden 100 ayrı değişken çıkacak ve değişken sayısı yüksek oranda artacaktır. Evet şimdi biz metodunu uygulayalım:

Data_pd_Filtered_Last = pd.get_dummies(Data_pd_Filtered, columns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome'], prefix = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome'])
Data_pd_Filtered_Last.head()

Kodun ilk satırında gerekli kolonları oluşturmak için “.get_dummies” komutunu kullandık. Üstte kodlama metodumuzu açıklarken bahsettiğimiz ortaya çıkan yeni değişkenlere “dummy(kukla)” değişkenler denir. Adından da anlaşılacağı gibi bunlar asıl değişkenin yerini hep beraber tutan kukla değişkenlerdir. Bu komutun içine önce veri setini verdik daha sonra ise dummy değişken atayacağımız kolon adlarını belirttik. Bu komuta verdiğimiz “prefix” argümanı ise oluşacak dummy kolonların ön ekinin ne olacağını belirtiyor. Biz bu dummylerin de asıl kolonumuzun adıyla başlamasını istedik bu yüzden bu argümana kolonların kendi adlarını verdik. Oluşan yeni veri setinin ilk satırlarına bakalım:

5

Evet dummy değişkenler istediğimiz gibi oluşmuş. En alta bakarsanız da artık veri setimizin 52 kolona sahip olduğunu görebilirsiniz. One-Hot Encoding metodunun değişken sayısını ciddi oranda artıracağını söylemiştik. Bizim veri setimizde de 17 olan kolon sayısını 52’ye çıkarttı.

Bu işlemle beraber bu senaryo için “Data Preprocessing” kısmını tamamlamış olduk. Artık lojistik regresyona geçebiliriz. Bu noktada lojistik regresyon metodunun detaylarına biraz değinelim. Lojistik regresyon, kategorik bir değişkeni tahmin etmeye çalışır. Şu ana kadar bahsettiğimiz regresyon metodları nümerik çıktıları tahminlemeye çalışıyordu. Fakat lojistik regresyon bir sınıflandırma(classification) metodu olduğundan dolayı tahmin işi artık kategorik değişkenler üzerinde olacak. Yazının başında da bahsettiğim gibi işin içine sınıf tahminleri girdiği zaman olasılıklar da giriyor. Her tahminle beraber o tahminden ne kadar emin olduğumuzu gösteren bir de olasılık belirtilir. Klasik regresyon denkleminde olduğu gibi lojistik regresyonda da her özelliğin bir regresyon katsayısı vardır ve bunlar birbirleri ile çarpılarak toplanır. Aşağıdaki gibi:

6

b0, b1, …., bp’ye kadar olan kısım bize katsayıları gösterirken x1, x2, …, xp’ler de değişkenleri ya da bir diğer ismiyle özellikleri gösteriyor diyebiliriz. Bu denklem sonucunda elde edilen değer aslında bir çeşit skordur diyebiliriz. Bu skorun işaretine göre de lojistik regresyon modeli tahmin edilen değerin hangi sınıfa ait olduğuna dair bir çıkarım yapar. Örneğin bir sentiment(duygu) analizi yapıyorsak ve skorun işareti “-” çıkmışsa bu olumsuz bir duygu sonucu çıktığına, tam tersi işaret “+” ise de olumlu bir duygu sonucu çıktığına işaret olabilir. Dikkat edelim ki lojistik regresyon da bir lineer(doğrusal) sınıflandırıcıdır. Bunun sebebi ise üstteki denklemde görüldüğü gibi, denklemin katsayılar bazında doğrusal olmasıdır. Yani denklemin genel yapısı “katsayı” x “özellik” şeklinde ilerlemektedir. Özellikler doğrusal olmasaydı (örneğin kuadratik olsaydı ya da başka şekillerde olsaydı) dahi lojistik regresyon hala doğrusal olarak kalacaktı çünkü katsayılar doğrusallığını koruyor. Bu denklem sonucunda elde edilen skor -∞ ve +∞ arasında olabilir, buna bir kısıt yoktur. Fakat şöyle düşünelim. İşin içine hiç olasılıkları katmadan skoru -1 olan gözleme de negatif, -1000 olan gözleme de negatif mi diyeceğiz? Tabii ki hayır. İkisi arasında bariz bir fark var ve biz bu farkı olasılıklarla göstereceğiz. -1000’in negatif olduğundan -1’e göre çok daha eminiz bu yüzden olasılığı çok daha yüksek olacak. Peki -∞ ile +∞ arasında değişen bir skor değerini nasıl 0 ile 1 arasında değişen bir olasılık değerine indirgeyeceğiz?

Lojistik regresyon bunu yaparken bir bağlantı fonksiyonu kullanır. Bu fonksiyona “sigmoid fonksiyonu” denir. Sigmoid aşağıdaki gibidir:

7

Fonksiyonun denklemi ve grafiği yukarıdaki gibi. Denklemdeki “z” değeri yerine skoru koyduğumuzu düşünürsek, denklemin sonucu o skora denk gelen olasılık değerini verecektir. Bu olasılık değeri de bizim tahminimizden ne kadar emin olduğumuzun bir göstergesidir. Skorun 0 olduğu nokta, kararsızlık bölgesidir. Çünkü o noktada sigmoid fonksiyonu bize olasılık olarak 0.5 değerini verir. Bu da aslında sonucu iki tarafa da dahil göstermez. Bu olasılık değeri, lojistik regresyonun karar sınırına denk gelir. Lojistik regresyon sınıfları birbirinden ayırmak adına bir karar sınırı çizer ve bu sınır üzerinde skor 0’dır. Skorun 0 olması da dolayısıyla sigmoide girdiğinde olasılığın 0.5 olarak çıkmasına neden olur bu da o bölgeyi “kararsızlık bölgesi” ilan eder. Kararsızlık bölgesi dışında kalanlar bir sınıfa dahil edilebilir. Kimi senaryolarda ise kararsızlık bölgesi de belli bir sınıfa dahil edilir.

Lojistik regresyonun detaylarını bitirmeden önce, son bir husustan bahsetmek istiyorum. Eğer birden fazla sınıf için tahminleme yapılıyorsa, en çok kullanılan metodlardan biri “One Versus All” metodudur. Bu metod her bir sınıf için şu işlemi yapar: tüm sınıfları bahsi geçen sınıfa ait olma ve geriye kalan sınıflardan birine ait olma şeklinde ikiye ayırır. Daha sonra o belirli sınıfa ait olma olasılığını hesaplar. Bu işlemi tüm sınıflar için tekrar ettiğinde hangi sınıf en yüksek olasılığı veriyorsa, bahsi geçen gözlemi o sınıfa o olasılık ile dahil eder. Bizim senaryomuzda iki sınıf için tahminleme yapacağımızdan dolayı, bu metodu kullanmayacağız. Fakat bu yüzeysel bilgiye sahip olmak önemli olduğundan paylaşmak istedim.

Evet lojistik regresyon işleminin detayları yukarıdaki gibi. Çok fazla teorik bilgiye girmeden yine daha çok teknik tarafla ilgileneceğim. Fakat bahsedilmesi gereken bir nokta daha var. Geçen yazılarımda “Feature Selection” yani özellik seçme yöntemlerinden bahsetmiş ve ileri doğru seçme yöntemini kullanmıştım. Diğer bir metodun ise Lasso yöntemi olduğunu söylemiş fakat kısaca bahsedip kullanmamıştım. Burada ise Lasso yönteminin sınıflandırma metodlarındaki versiyonu ile özellik seçimini gerçekleştireceğim. Ridge regresyonun L2, Lasso regresyonun ise L1 düzeltmesi olarak geçtiğini konuşmuştuk. Biz de bu yazıda L1 düzeltmesi yapılmış lojistik regresyon gerçekleştireceğiz. Neden ve nasıl yapacağımızı izah edeyim. Aynı Ridge regresyonda olduğu gibi, burada da amaç overfitting durumuna düşmemizi engellemek ve yanlılık-değişkenlik arasında bir denge kurmak. Bu işlemin detaylarına geçen yazımda değindiğim için burada kısaca geçeceğim. Lasso(L1 düzeltmesi)’da da amaç aynıdır. Modelin kalite metriğine bir de overfittinge düşmenin maliyeti eklenir ve artık toplam maliyet bu olur. Ridge regresyonda kalite metriğine(RSS) L2 düzeltmesini de eklemiştik ve bunun katsayıların kareleri kullanılarak hesaplandığını söylemiştik. Burada kullanacağımız L1 düzeltmesi ise katsayıların mutlak değerlerinin toplamı olarak hesaplanır ve overfitting maliyeti olarak bu seçilir. Doğrusal regresyonda kalite metriği RSS’ti ve overfitting maliyeti olarak da L2 yi belirlemiştik. Sonuç maliyet fonksiyonunu da “RSS + λ(L2 norm)” olarak göstermiştik. Böylece hem veriye iyi oturma ölçüsünü(RSS) hem de overfittingi belirleme ölçüsünü(L2) model maliyetine katmıştık. L2 norm overfittingin nasıl göstergesi oluyor derseniz de unutmayalım ki overfitting durumunda katsayıların büyüklüğü çok yükselir. L2 norm da katsayı karelerini alıp toplayarak bu büyüklüğün bir ölçüsü olur. Evet peki bu yazdığımız maliyet lojistik regresyon için ne olacak?

Bu soruyu cevaplayabilmek için öncelikle lojistik regresyonun veriye oturma ölçüsü nedir bundan bahsedelim. Bu metod içerisinde kalite metriği RSS değil, data likelihood’dur. Bu metoda da MLE(Maksimum Likelihood Estimation) denir. Likelihood şöyle bir metriktir; amacı bir gözlemin sınıfı her ne ise, o sınıfa dahil olma olasılığını maksimize etmektir. Yine duygu analizi üzerinden gidecek olursak, eğer pozitif bir gözlem ise, o gözlemin olasılığını 1’e doğru itmeyi, eğer negatif bir gözlem ise de o gözlemin olasılığını 0’a doğru itmeyi amaçlar. Olasılığın 0.5 olduğu durumun kararsızlık durumu olduğunu söylemiştik. Nasıl hesaplandığına dair detaylara burada girmiyorum fakat bir sınıflandırma modelinin veriye ne kadar iyi oturduğunun göstergesi bu metriktir ve ne kadar büyükse o kadar iyi oturduğunu belirtir. Metrik hesaplanırken metriğin direkt kendisi değil de logaritması kullanılır(Log Likelihood ). Bunun sebebi ise hesaplamalardaki matematiği kolaylaştırması ve sonucu da değiştirmemesidir.  Bu metriğe L1 düzeltmesini eklediğimizde ise artık lojistik regresyonun maliyet fonksiyonu şu şekilde olacaktır: “LogLikelihood – λ(L1 Norm)”.  Aradaki işaretin “-” olmasının sebebi ise RSS’in aksine LogLikelihood minimize değil maksimize etmeye çalıştığımız bir metriktir. Bu yüzden overfitting maliyetini bu metriğe eklemek yerine çıkarmalıyız.

Son olarak buradaki lambda parametresinden de bahsedelim. Aynı Ridge üzerinde olduğu gibi burada da iki terim arasındaki dengeyi bu parametre sağlıyor.  Parametrenin çok yüksek olması L1 normun ağırlığını çok artırarak veriye oturmaktansa overfittinge düşmeme riskini azaltmaya çalışır ve böylece modeli olmadık derecede sadeceleştirir. Bu da değişkenliğin son derece azalmasına fakat yanlılığın çok yükselmesine sebep olur. Tam tersi gereğinden az olursa da bu kez amacımız klasik MLE’de olduğu gibi veriye oturmak olur ve bunun için model aşırı kompleksleşir. Bu da yanlılığın azalmasına fakat değişkenliğin yükselmesine sebep olacaktır. Bu yüzden bu ikisi arasında uygun bir lambda parametre değeri seçilmelidir.

Bu kadar teorik bilgiden sonra pratiğe geçelim. En uygun lambda değerini modelin oluşturacağımız validation set üzerindeki doğru tahmin oranına göre karar vereceğiz. Modeli training set üzerine kuracak, daha sonra validation set üzerinde uygun lambda değerini belirleyeceğiz. Dikkat edelim ki bu yöntem geçen yazıda kullandığımız CV(Cross-Validation) yönteminden farklı. Burada direkt olarak validation set üzerinde hiperparametre değerini belirliyoruz. Son olarak test set üzerinde modelin başarısını göreceğiz. Veriyi bahsettiğimiz şekilde üçe bölerek başlayalım: train-validation-test.

train = Data_pd_Filtered_Last.sample(frac = 0.8, random_state = 200)
test_validation = Data_pd_Filtered_Last.drop(train.index)
validation = test_validation.sample(frac = 0.5, random_state = 200)
test = test_validation.drop(validation.index)
len(train)
len(validation)
len(test)

Evet veri setini %80 train set, %10 validation set ve %10 da test set olmak üzere üçe ayırdık. Satır sayılarına da bakalım:

8

Satır sayıları beklediğimiz gibi. Şimdi bağımlı ve bağımsız değişkenleri de belirterek artık lojistik regresyon işlemine başlayalım. Söylediğimiz gibi farklı lambda değerlerini validation set üzerinde deneyeceğiz ve doğruluk oranlarını (accuracy) ölçeceğiz. Aşağıdaki kod bloğu ile bu işlemleri gerçekleştirelim:

y_train = train["y"]
x_train = train.drop("y", axis = 1)
y_validation = validation["y"]
x_validation = validation.drop("y", axis = 1)
y_test = test["y"]
x_test = test.drop("y", axis = 1)

Train, test ve validation setler içerisinde bağımlı ve bağımsız değişkenleri belirttikten sonra lojistik regresyon işlemine geçiyoruz. Öncelikle veri setindeki değişkenler aynı ölçeğe koyalım ve standartlaştıralım. Daha sonra lojistik regresyon işlemini gerçekleştirelim:

ss = StandardScaler()
x_train_scld = ss.fit_transform(x_train)
x_test_scld = ss.transform(x_test)
x_validation_scld = ss.transform(x_validation)

Standartlaştırma işlemini önce training data üzerinde fitting işlemi yaparak, daha sonra da bu standartlaştırmayı test ve validation setlere de uygulayarak gerçekleştirdik. Standartlaştırmanın tüm değişkenleri aynı ölçeğe koyduğundan ve sıfıra merkezlediğinden bahsetmiştik. Bunun amaç fonksiyonunun öğrenilmesinde kolaylık sağladığını söyleyebiliriz. Devam edelim:

lambda_range = [1e-15, 1e-10, 1e-8, 1e-4, 1e-3,1e-2, 1, 5, 10, 20]
for lmb in lambda_range:
LR = LogisticRegression(penalty = 'l1', C = lmb)
LR.fit(x_train_scld, y_train)
print('lambda:', lmb)
print('Özelliklerin katsayıları:', LR.coef_)
print('Training accuracy:', LR.score(x_train_scld, y_train))
print('Validation accuracy:', LR.score(x_validation_scld, y_validation))
print('')

Kod bloğunu açıklayalım. İlk satırda bir önceki yazıda kullandığımız lambda adayları kümesini yeniden tanımladık. Daha sonra ise bir for döngüsü vasıtasıyla bu lambdaların her biri için training sete bir lojistik regresyon modeli kurduk ve bu modelin validation set üzerindeki “accuracy” değerini hesapladık. Her lambda değeri için özelliklerin katsayılarını, training başarı oranını ve validation başarı oranını da yansıttık. Önceden de söylediğimiz gibi L1 düzeltmesi daha sade modellere yol açar çünkü değişken seçimini otomatik olarak kendisi gerçekleştirir. Herhangi bir değişken seçimini manuel olarak uygulamaya gerek kalmaz. Şimdi kod sonucunda oluşan verilerin birkaçını görelim ve en iyisini belirleyelim:

9

10

11

Evet ilk lambda değeri, son lambda değeri ve en iyi(ortadaki) lambda değerlerini buraya getirdim. Diğerleri için kodun sonucuna bakabilirsiniz. En iyi lambda değeri 0.903 validation accuracy değeri ile 0.01 değeri. Biz de lojistik regresyon modelimizin optimum lambdası olarak bu değeri seçeceğiz. Görüyorsunuz ki bu lambda değeri bazı özelliklerin katsayılarını olduğunca minimize ederken, bazılarını ise direkt olarak sıfıra indirgeyerek modelden çıkarmış durumda. Dolayısıyla otomatik olarak değişken seçimini de yapmış oluyor. En büyük lambda değeri olan 20’ye bakacak olursanız değişken katsayıları aşırı küçülmüş durumda ve neredeyse sıfıra çok yakın. Lambda değeri yükseldikçe katsayılar sıfıra doğru gider ve özellikler modelden çıkar. Bu da modeli son derece basitleştirir demiştik.

Yolumuza optimum lambda değerimiz ile devam edelim ve o değeri kullanan modelin test doğruluk oranını hesaplayalım.

LR = LogisticRegression(penalty = 'l1', C = 0.01)
LR.fit(x_train_scld, y_train)
print('Test accuracy:', LR.score(x_test_scld, y_test))

Belirlediğimiz lambda değeri ile modeli train set üzerine kurduk ve test accuracy değerini hesapladık. Sonuç:

12

Evet test accuracy değeri 0.907 olarak gözüküyor. Bu da demek oluyor ki %90.7 oranda test verisinin sınıfını doğru saptadık. Bir sınıflandırma modeli en iyi ihtimalle, en çok bulunan sınıfın oranını geçmelidir. En çok bulunan sınıf “no” olarak gözüküyor bunun oranına bakalım.

len(Data_pd[Data_pd['y'] == "no"])/len(Data_pd)

Sonuç:

13

0.88 oranında “No” değeri gözüküyor. Aynı değeri test sette hesaplarsanız da çok benzer bir sonuçla karşılaşırsınız çünkü veriler rastgele bölünmüştü. Bizim accuracy değerimiz ise 0.907 idi. En çok bulunan sınıf başarı oranını geçmiş gözüküyoruz. Aslında çok kısıtlı bir lambda aralığı incelediğimiz için daha optimum modelleri bulamadık. Ayrıca yazının amacı lojistik regresyon üzerinde yoğunlaşmak olduğundan verideki sınıf dengesizliğini gidermek için de herhangi bir metod uygulamadık.

Evet lojistik regresyon metodunu detaylı bir biçimde inceledik denilebilir. Finalde %90.7 oranında başarı gösterebilen bir lojistik regresyon modeli ürettik.