Makine Öğrenmesinde Lojistik Regresyonun Python ile Uygulaması ve Yorumlanması (Logistic Regression)

Yiğit Şener
Data Runner
Published in
4 min readOct 11, 2020

Lojistik regresyon makine öğrenmesi sınıflandırma algoritmaları için bir mihenk taşıdır. Anlatımı ve yorumlaması oldukça kolaydır.

Regresyon algoritmaları için hedef (bağımlı) değişken sürekli bir dağılım içindedir. Yani eksi sonsuz ile artı sonsuz arasında birden çok değere sahip olabilir. Sınıflandırma algoritmaları için hedef değişken kesikli veri tipindedir. 1 (evli) veya 0 (bekar) gibi bir sonuç olabilir. Birden çok grup içinde sınıflandırma (Multiclass) yapılabilir.

Bu yazıda Python üzerinden lojistik regresyon analizi yaparak nasıl yorumlandığından bahsedeceğiz. Sentetik veri seti yaratarak ön işleme adımlarını atlayıp modelleme konusunu odaklanacağız.

Sentetik veri setini oluşturup genel olarak inceleyelim. Sentetik veri setinin nasıl oluşturulduğu ile ilgili bu yazıma göz atabilirsiniz

import pandas as pd
from sklearn.datasets import make_classification, make_blobs
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import matplotlib.pyplot as plt
import warnings
import numpy as np
warnings.filterwarnings('ignore')

# Ekrana basılan tabloları daha geniş gösterimi için
pd.set_option('display.max_columns', None)

# 2 etiketli sınıflandırma veri seti
x, y = make_blobs(n_samples=1000
,n_features = 7
,centers = 2
,cluster_std = 5) # verideki gürültü


# Dataframe objesine dönüştürme
df = pd.DataFrame({"x1":x[:,0],
"x2":x[:,1],
"x3":x[:,2],
"x4":x[:,3],
"x5":x[:,4],
"x6":x[:,5],
"target":y})

# değişkenlerin float değerini küçültelim
df = round(df ,3)

# ilk beş satırı yazdıralım
print(df.head())

Yukarıdaki tabloda görüldüğü üzere tüm değişkenlerimiz sayısal bir formatta yer almaktadır. Dolayısıyla kategorik bir değişkeni kukla değişkene (dummy variable) çevirmek durumunda değiliz. Ayrıca sentetik veride belirttiğimiz “centers = 2” parametresi ile hedef değişkeni 2 sınıflı olarak tanımladık. Diğer bir ifade ile bir bu değişkenin bir flag olduğunu söyleyebiliriz. Burada hedef değişken için 1 değerini “Kredi verilebilir”, 0 değerini ise “kredi verilmesi riskli” olarak aklınızda canlandırabilirsiniz.

Sentetik veri setimiz olduğu için iki değişken arasındaki ilişkiyi hedef değişken üzerinden kolaylıkla gözlenebilir olarak inceleyebiliriz.

# Scatter plot ile görselleştirme
colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots()
grouped = df.groupby('target')
for key, group in grouped:
group.plot(ax=ax, kind='scatter'
,x='x1', y='x6', label=key
,color=colors[key])
plt.show()

Yukarıdaki scatterplot üzerinde iki değişken arasındaki renk farkında sınıfların nasıl ayrıştığı görülebilmektedir.

Değişkenlere biraz da açıklayıcı istatistik gözüyle bakalım;

print(df.describe())

Yukarıdaki tabloda görüldüğü üzere sentetik veride yer alan X değişkenlerindeki ortalama ve medyan (ortanca) değerlerin birbirine yakın ve normal dağıldığı söylenebilir. Bununla beraber hedef (target) değişken ise dengeli (0.5) bir dağılım göstermektedir.

Modelleme aşamasına geçmeden önce sentetik veri setimizde kim hedef değişken kimler bağımsız değişken belirleyelim. Ardından test ve train olarak veri setini bölelim.

target = df.target
predictors = df.drop(columns = "target", axis = 1)

# Train and test splitting
x_train, x_test, y_train, y_test = train_test_split(predictors
,target
,test_size=0.25
,random_state=0)

Yukarıdaki kodda görüldüğü üzere veri setinde train için %75'lik, test için ise %25'lik bir bölüm ayrılmıştır (test_size=0.25).

Şimdi lojistik regresyon modelimizi uygulayabiliriz.

# lojistik regresyon nesnesinin çağırılması
lr = LogisticRegression()

# veri setine fit etme işlemi
lr.fit(x_train,y_train)

# öğrenilen modelin test verisine uygulanması
y_pred = lr.predict(x_test)

İlk kod satısında Sklearn kütüphanesinde yer alan lojistik regresyon sınıfını çağırarak bir değişkene tanımladık. İkinci satırda ise tanımlanan sınıfı train veri seti üzerinden çalıştırdık. Ardından çalışılan modeli test veri setindeki değişkenler üzerinde uygulayarak yeni sonuçları y_pred adlı değişkene yazdırdık. Şimdi test verisinde ayırdığımız y_test ile y_pred sonuçlarını karşılaştırarak modelin doğruluğunu değerlendirelim.

# Karmaşıklık Matrisi
print(metrics.confusion_matrix(y_test, y_pred))
# ÇIKTI:
# [[129 5]
# [ 0 116]]
# Görsel confusion matrix
import scikitplot.metrics as splt
splt.plot_confusion_matrix(y_test, y_pred)

Yukarıdaki confusion matrix’de test için ayrılan 250 değerin hem gerçekte olan hem de tahmin edilen değerleri karşılaştırılmıştır. Yukarıda linkini bıraktığım yazımda açıkladığım üzere 129 ve 116 değerleri doğru tahmin edilirken 5 adet değer yanlış tahmin edilmiştir. Dolayısıyla bu tablodan yola çıkarak elde edilen doğruluk oranlarına bir bakalım.

print("Doğruluk Oranı \ Accuracy Score")
print(metrics.accuracy_score(y_test, y_pred))
# ÇIKTI:
# Doğruluk Oranı \ Accuracy Score
# 0.98

print("Precision Score")
print(metrics.precision_score(y_test, y_pred))
# ÇIKTI:
# Precision Score
# 0.9586776859504132

print("Recall Score")
print(metrics.recall_score(y_test, y_pred))
# ÇIKTI:
# Recall Score
# 1.0

Doğruluk oranları incelendiği zaman %95 ile %100 arasında olduğu görülmektedir. Zaten sentetik bir veri seti olduğundan bu sonucu almamız gayet doğal.

Değişkenlerin hedef değişken üzerindeki etkisini yansıtan katsayıların bir grafiğine bakalım (feature importance).

feature_importance = abs(lr.coef_[0])
feature_importance = 100.0 * (feature_importance / feature_importance.max())
sorted_idx = np.argsort(feature_importance)
pos = np.arange(sorted_idx.shape[0]) + .5

featfig = plt.figure()
featax = featfig.add_subplot(1, 1, 1)
featax.barh(pos, feature_importance[sorted_idx], align='center')
featax.set_yticks(pos)
featax.set_yticklabels(np.array(predictors.columns)[sorted_idx], fontsize=8)
featax.set_xlabel('Relative Feature Importance')

plt.tight_layout()
plt.show()

Yukarıdaki grafik bize bağımsız (predictors) değişkenlerin hedef (target) değişkenler üzerinde ne derece bir öneme\ağırlığa sahip olduğunu göstermektedir.

Sonuç

Lojistik regresyonun birçok farklı alanda kullanımı mevcuttur. Verilerimizi sınıflandırmaya çalışırken ilk denenmesi gereken algoritmadır. Tabi bu son zamanlarda geliştirilen farklı algoritmaların başarısı lojistik regresyonu genel olarak geride bıraksa da her zaman bir kıyaslamada ya da değişkenlerin incelenmesi kullanılabilir.

--

--