Python ile Lojistik Regresyon — Makine Öğrenimi Bölüm-7
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.
- 1.Kısım: Makine Öğrenimi — Giriş
- 2.Kısım: k-En Yakın Komşuluk,
- 3. Kısım: Yapay Sinir Ağları,
- 4. Kısım: Destek Vektör Makinaları
- 5. Kısım: Karar Ağaçlarından ve
- 6. Kısım: Doğrusal Regresyon.
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.
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()
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.
- 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()
- 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).
- 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)
- Ü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()
- 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()
- 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))
- 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:
- http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
- DATA -Veri Madenciliği Veri Analizi (Haldun Akpınar), Papatya Bilim, 2014
- 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