Lojistik Regresyon (Logistic Regression Classification) ile Sınıflandırma: Python Örnek Uygulaması

Sınıflandırma notlarımıza Lojistik Regresyon ile devam ediyoruz. Daha önce teorisinden bahsettiğimiz lojistik regresyonun Python uygulamasını yapacağız. Kütüphaneleri indirelim, çalışma dizinini ayarlayalım ve veri setimizi görelim. Veri setini buradan indirebilirsiniz.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
os.chdir('Calisma_Dizniniz')
dataset = pd.read_csv('SosyalMedyaReklamKampanyası.csv')

Spyder’ın variable explorer penceresinden veri setimizi görelim:

Veriyi Anlamak

Yukarıda gördüğümüz veri seti beş nitelikten oluşuyor. Veri seti bir sosyal medya kayıtlarından derlenmiş durumda. KullaniciID müşteriyi belirleyen eşsiz rakam, Cinsiyet, Yaş, Tahmini Gelir yıllık tahmin edilen gelir, SatinAldiMi ise belirli bir ürünü satın almış olup olmadığı, hadi lüks araba diyelim. Bu veri setinde kolayca anlaşılabileceği gibi hedef değişkenimiz SatinAldiMi’dir. Diğer dört nitelik ise bağımsız niteliklerdir. Bu bağımsız niteliklerle bağımlı nitelik (satın alma davranışının gerçekleşip gerçekleşmeyeceği) tahmin edilecek.

Veri Setini Bağımlı ve Bağımsız Niteliklere Ayırmak

Yukarıda gördüğümüz niteliklerden bağımsız değişken olarak sadece yaş ve tahmini maaşı kullanacağız.

X = dataset.iloc[:, [2,3]].values
y = dataset.iloc[:, 4].values

Veriyi Eğitim ve Test Olarak Ayırmak

Veri setinde 400 kayıt var bunun 300’ünü eğitim, 100’ünü test için ayıralım.

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

Feature Scaling

Bağımsız değişkenlerden yaş ile tahmini gelir aynı birimde olmadığı için feature scaling uygulayacağız.

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

Lojistik Regresyon Modeli Kurmak

Lojistik regresyon modeli için scikit-learn kütüphanesinin linear_model modülünün LogisticRegression sınıfını kullanacağız. Nesnemizi oluşturup eğitim verisiyle eğitelim.

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)

Test Setini Tahmin Etmek

y_pred = classifier.predict(X_test)

Bağımlı değişken tahmin setimizi ve bağımsız değişken test setimizi aşağıda görüyoruz. Ölçek düzeltmesi yaptığımız için X_test yaş ve maaş değerleri orijinalinden çok farklı görünüyor. Aşağıda 7 ve 9 indeksli müşterilerin araç satın alacağı öngörülmüş.

Şimdi bu tahmin değerlerimiz ile gerçek değerleri karşılaştıran hata matrisine (confusion matrix) bakalım.

Hata Matrisini Oluşturma

Yaptığımız sınıflandırmanın doğruluğunu kontrol etme yöntemlerinden birisi de hata matrisi oluşturmaktır. Hata matrisi için scikit-learn kütüphanesi metrics modülü confusion_matrix fonksiyonunu kullanıyoruz.

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)
[[65 3]
[ 8 24]]

Yukarıdaki 65 ve 24 doğru olarak sınıflandırma sayısını, 8 ve 3 ise yanlış sınıflandırma sayısını gösterir. Hatırlarsanız biz test için 400 kayıttan 100 tanesini ayırmıştık. Yukarıda hata matrisindeki rakamları topladığımızda 100 sayısına ulaşıyoruz; 89 doğru, 11 yanlış.

Lojistik Regresyon Grafiğini Çizme

Grafik çizmek için biraz uzun bir kod var şimdi açıklamadan hemen çizdiriyorum.

from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('blue', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
     plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                 c = ListedColormap(('yellow', 'green'))(i), label = j)
plt.title('Lojistik Regresyon (Eğitim seti)')
plt.xlabel('Yaş')
plt.ylabel('Maaş')
plt.legend()
plt.show()


Yukarıdaki noktalar bizim eğitim veri setimizden. Sarı noktalar satın almayan müşterileri (0), yeşil noktalar ise satın alan müşterileri (1) temsil ediyor. Özetle söylemek gerekirse bu arabayı yaşı büyük ve geliri yüksek insanlar almış görünüyor. Ancak bazı istisnalar muhakkak ki var. Türk atasözü: İstisnalar kaideyi bozmaz. Lojistik regresyon çizgimiz bu ayırımı eniyi yapacak şekilde geçmiş. Lineer model kullandığımız için çizgimiz de doğru oldu. Şimdi grafiğimizi bir de test seti için çizdirelim.

from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
         np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('blue', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
     plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                 c = ListedColormap(('yellow', 'green'))(i), label = j)
plt.title('Lojistik Regresyon (Test seti)')
plt.xlabel('Yaş')
plt.ylabel('Maaş')
plt.legend()
plt.show()

Hata matrisinde 11 yanlış sınıflandırma var demiştik. Mavi bölgedeki yeşil noktalar ile yeşil bölgedeki sarı noktaları sayarsanız 11 olduğunu göreceksiniz. Şimdi grafik kodları için biraz açıklama yapalım. Grafiğimizde üç değişken Maaş ve yaş eksenleri İlk satır matplotlib kütüphanesi colors modülü ListedColormap sınıfını indiriyoruz. İkinci satırda X_set, y_set diye iki değişken oluşturduk. Bunun sebebi tüm kodları değiştirmeden buraya eğitim ve test değişkenlerimizi yazdığımızda grafik hemen çizilsin. np.meshgrid() ile grafiğin sınırlarını ve çözünürlüğünü ayarladık. plt.contourf() ile SatinAldiMi niteliği 0 değeri alan kayıtlar sarı, 1 olanları yeşil nokta ile gösteriyoruz. for döngüsü ile tüm y değerlerini dolaşıp nereye konumlanacağını (plt.scatter()) saçılma diyagramı ile çiziyoruz. plt.legent() ile sağ üst köşedeki bilgi kutusunu yazdırıyoruz.

Yazar Hakkında
Toplam 174 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (2 yorum)
Kadir
Kadir Yanıtla
- 16:51

Hocam Logistik Regresyon ile ilgili bir de R’da bir örnek kod yayımlamayı düşünüyor musunuz?

    Erkan ŞİRİN
    Erkan ŞİRİN Yanıtla
    - 15:18

    Merhaba evet atlamışız dönem. Python ile örnek yapıp R ile yapmamışız. Söz vermeyim ama eklemeye çalışırım ve size eposta atarım. İlginiz için teşekkürler.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara