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.
Hocam Logistik Regresyon ile ilgili bir de R’da bir örnek kod yayımlamayı düşünüyor musunuz?
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.