Python ile Lojistik Regresyon — Makine Öğrenimi Bölüm-7

E. Kaan Ulgen
4 min readFeb 11, 2018

--

Bu haftaki yazımda Lojistik Regresyon konusunu ele alarak gözetimli öğrenme algoritmalarını tamamlamış olacağım. Daha önce bahsettiğim gözetimli öğrenme algoritmalarına ise aşağıdan tıklayarak ulaşabilirsiniz.

7.1 Lojistik Regresyon

Lojistik regresyon, ikili sonuç veren binary değişkenlerin modellenmesinde kullanılmaktadır. İkili durum söz konusu olan modellerde sonuç genellikle 0 veya 1 olarak tanımlanmaktadır. Örneğin, Titanik verisini ele aldığımızda hayatta kalma durumu 1'i temsil ederken 0 ise ölüme karşılık gelir diyebiliriz. Bu durumda p, örneklem kümesindeki 1'lerin, q ise sıfırların oranını vermektedir. Kısacası lojistik regresyon yöntemiyle kullanılan örneklemlerin hangi sınıfa ait olduklarını belirleyebiliriz.

  • f (x) = (1 / 1+e^(-z))

Lojistik fonksiyon (f(x)), -∞/+∞ aralığındaki tüm değerleri girdi olarak kabul edebilir. Çıktı olarak ise 0 ile 1 arasında değerler almaktadır.

Şekil-1

7.2 Python Uygulaması

Bu çalışma kapsamında kullanılan veriye ve hazırlanan kod’a buradan ulaşabilirsiniz.

  • İlk olarak kullanacağımız Titanik verisini okutalım. Bunun için pandas kütüphanesinden yararlanılmıştır.
import pandas as pd
import numpy as np

data = pd.read_excel("titanic.xls")
data.head()
Şekil-2
data.drop(['body','name','home.dest'], 1, inplace=True)
data.head()
  • Veri seti içerisindeki “body”, “name” ve “home.dest” kolonları çıkarıldı. Şekil-3'e baktığınızda görebilirsiniz.
Şekil-3
  • Veri setimizde bulunan kolonların istatistiksel sonuçlarını görmek için “describe” komutundan yararlanıldı. Bu sayede her bir kolon hakkında fikir sahibi olabiliriz. Örneğin “age” ve “fare” kolonlarını incelediğimizde (count değerini) NaN (Not a Number) değerlere sahip olduklarını görüyoruz.
data.describe()
Şekil-4
  • Bu durumu düzeltmek için ilk olarak “age” ve “fare” kolonlarının median değerlerini belirliyoruz. Daha sonra ise NaN değerler yerine median değerlerini yazıyoruz.
data["age"].fillna(data["age"].median(), inplace=True)
data["fare"].fillna(data["fare"].median(), inplace=True)
data.describe()
  • Şekil-5'e baktığımızda artık bütün kolonlarımızın eşit sayıda anlamlı değerlere sahip olduklarını görüyoruz (hepsinin count değeri 1309).
Şekil-5
  • Veri setimiz üzerindeki gerekli düzeltmeleri yaptıktan sonra sırada görselleştirme var.
import matplotlib.pyplot as plt
colors = ["r", "b","k"]
survived_ = data[data["survived"]== 1]["sex"].value_counts()
dead_ = data[data["survived"]==0]["sex"].value_counts()
data_ = pd.DataFrame([survived_, dead_])
data_.index = ["survived","dead"]
data_.plot.bar(stacked=True,color=colors)
Şekil-6
  • Üretilen histogram’ı incelediğimizde, hayatta kalanların büyük bölümünün kadın olduğu görülmektedir.
fig = plt.figure(figsize=(15,10))
plt.hist([data[data["survived"]==1]["age"], data[data["survived"]==0]["age"]],histtype='bar',stacked=True,bins=20,color=["r","b"],width=3, label=["Survived","Dead"])
plt.xlabel("Yaş")
plt.ylabel("N")
plt.legend()
Şekil-7
  • En çok ölüm 20 ile 30 yaş arasında
  • En çok hayatta kalanlar da 20 ile 30 yaş arasında. Unutulmamalı ki gemide bulunların yaş ortalaması 29.5.
  • Bebeklerin hayatta kalma oranı, ölüm oranına göre daha yüksek.
import seaborn as sns
g = sns.factorplot(x="pclass", y="survived", hue="sex", data=data, size=6, kind="bar")
g.despine(left=True)
g.set_ylabels("Hayatta kalma olasılığı")
plt.show()
Şekil-8
  • Bu histogramda ise gemide bulunan 3 sınıf için cinsiyete göre hayatta kalma olasılığı verilmiştir. Histogramı oluştururken seaborn kütüphanesinden yaralanılmıştır.
  • Sırada cinsiyet (“sex”) ve “embark” kolonlarının numerik olarak kullanılmasına geldi.
sex = pd.get_dummies(data["sex"],drop_first=True)
embark = pd.get_dummies(data["embarked"],drop_first=True)data_.drop(["sex","embarked","ticket","cabin","boat"], axis=1, inplace=True)
data_ = pd.concat([data, sex, embark], axis=1)
data_.drop(["sex","embarked","ticket","cabin","boat"], axis=1, inplace=True)
  • Veri setimizi “train_test_split” fonksiyonu yardımıyla eğitim ve test olarak ayırdık.
X = data_.drop("survived", axis=1)
y = data_["survived"]

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

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
  • Model üreteceğimiz zaman veri setimizi iyi tanımamız gerekmektedir. Bu çalışmada “titanik” verisi için lojistik regresyon modeli uygulandı. Daha sonra modelimizi eğitim verimiz ile eğittikten sonra test ettik.
  • Verimizi eğitip test ettikten sonra sonuçları değerlendirme aşamasına geldik. Bunun için “classification_report” fonksiyonundan yararlanıldı.
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train_std, y_train)

prediction = lr.predict(X_test_std)
from sklearn.metrics import classification_report
print(classification_report(y_test, prediction))
Şekil-9
  • Duyarlılığımız %79.

Bu yazıda temel seviyede “lojistik regresyon” konusu ele alanmıştır. Gelecek yazının konusu gözetimsiz öğrenme algoritmalarından “kümeleme” olacaktır.

Kaynaklar:

  1. http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
  2. DATA -Veri Madenciliği Veri Analizi (Haldun Akpınar), Papatya Bilim, 2014
  3. https://www.amazon.com/Hands-Machine-Learning-Scikit-Learn-TensorFlow/dp/1491962291/ref=sr_1_3?ie=UTF8&qid=1517174437&sr=8-3&keywords=machine+learning+python

--

--