Logistic Regression

Logistic Regression

Logistic regression, basit yapısı ve açıklanabilirliği nedeniyle makine öğrenmesi uygulamalarında sıkça tercih edilen bir algoritmadır. Temel sınıflandırma problemlerinde etkili bir çözümdür ve daha karmaşık modellerin anlaşılmasında temel bir yapı taşı olarak görev yapar.

Logistic regression, makine öğrenmesinde kullanılan en temel sınıflandırma algoritmalarından biridir. Lineer regresyon ile benzer temellere dayansa da, logistic regression sınıflandırma problemleri için uygundur. Özellikle iki sınıf (binary) arasındaki ayrımı yapmak için kullanılır, ancak birden fazla sınıf için de genişletilebilir (multinomial logistic regression).

1. Temel Kavramlar

Logistic regression, doğrusal bir modeldir, ancak çıkış değeri sürekli bir sayı yerine bir olasılık olarak ifade edilir. Bu, modelin çıkışını 0 ile 1 arasında bir değere dönüştürmek için bir sigmoid fonksiyonu kullanması sayesinde olur.

2. Matematiksel Temel

a. Lineer Model

Logistic regression, bir doğrusal model ile başlar: \[z = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n = \beta_0 + \sum_{i=1}^{n}{\beta_i x_i}\]

Burada \(z\), bağımsız değişkenlerin bir lineer kombinasyonu olarak hesaplanır. Bu, aslında lineer regresyonun hesaplamasından farklı değildir.

b. Sigmoid Fonksiyonu

Logistic regression’ın temel farkı, yukarıdaki doğrusal modelin sonucunu sigmoid fonksiyonu denilen bir fonksiyondan geçirerek olasılıkları hesaplamasıdır: \[h(z) = \frac{1}{1 + {e}^{-z}} = \frac{1}{1 + {e}^{-(\beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n)}}\]

Sigmoid Function

Sigmoid fonksiyonu, her zaman 0 ile 1 arasında bir değer döndürür ve bu da, sınıf 1’e ait olma olasılığı olarak yorumlanır. Eğer olasılık 0.5’ten büyükse, model sınıfı 1 olarak tahmin eder; aksi takdirde 0 olarak tahmin eder.

3. Çoklu Sınıf Problemleri (Multinomial Logistic Regression)

Eğer problemde iki yerine birden fazla sınıf varsa, logistic regression birden fazla sınıfı ayırmak için genişletilebilir. Bu, “one-vs-all” (birine karşı diğerleri) veya “softmax regression” gibi yöntemlerle yapılabilir.

4. Örnek Uygulama

Örneğin, bir kişinin cinsiyetini tahmin etmek için logistic regression kullanılabilir. Girdi olarak kişinin boy, kilo, yaş bilgileri gibi özellikler kullanılır ve model, bu özelliklere dayalı olarak kişinin erkek olup olmadığını (sınıf 1) veya kadın olduğunu (sınıf 0) tahmin eder.

Dataset

// file: "data.csv"
ulke,boy,kilo,yas,cinsiyet
tr,180,90,30,e
tr,190,80,25,e
tr,175,90,35,e
tr,177,60,22,k
us,185,105,33,e
us,165,55,27,k
us,155,50,44,k
us,160,58,39,k
us,162,59,41,k
us,167,62,55,k
fr,174,70,47,e
fr,193,90,23,e
fr,187,80,27,e
fr,183,88,28,e
fr,159,40,29,k
fr,164,66,32,k
fr,166,56,42,k

Import the necessary modules and libraries

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sbn

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix

Data Preprocessing

Read Data

data = pd.read_csv('data.csv')

print(data.head(10))

print(data.describe())
  ulke  boy  kilo  yas cinsiyet
0   tr  180    90   30        e
1   tr  190    80   25        e
2   tr  175    90   35        e
3   tr  177    60   22        k
4   us  185   105   33        e
5   us  165    55   27        k
6   us  155    50   44        k
7   us  160    58   39        k
8   us  162    59   41        k
9   us  167    62   55        k
              boy        kilo        yas
count   17.000000   17.000000  17.000000
mean   173.058824   70.529412  34.058824
std     11.829363   17.871477   9.270050
min    155.000000   40.000000  22.000000
25%    164.000000   58.000000  27.000000
50%    174.000000   66.000000  32.000000
75%    183.000000   88.000000  41.000000
max    193.000000  105.000000  55.000000

Split Data

# boy
boy = data.iloc[:, 1:2].values

# kilo
kilo = data.iloc[:, 2:3].values

# yas
yas = data.iloc[:, 3:4].values

# cinsiyet
cinsiyet = data.iloc[:, -1:].values

Concatenate Data

Şimdi bu boy, kilo ve yas bağımsız değişkenlerini (x) ve cinsiyet (y) bağımlı değişkenini birleştiriyorum.

# Concatenate Data
x = pd.DataFrame(np.concatenate((boy, kilo, yas), axis= 1), columns=['boy', 'kilo', 'yas'])
y = pd.DataFrame(cinsiyet, columns=['cinsiyet'])

print(x.head(5))
print(y.head(5))
   boy  kilo  yas
0  180    90   30
1  190    80   25
2  175    90   35
3  177    60   22
4  185   105   33
  cinsiyet
0        e
1        e
2        e
3        k
4        e

Encoding

Eğitim sürecinde kullanılacak cinsiyet (y) bağımlı değişkenini LabelEncoder sınıfı ile sayısal değerlere dönüştürüyorum.

le = LabelEncoder()

y = le.fit_transform(y)

print(y)
[0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1]

Train - Test Split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=0)

Scale Data

sc = StandardScaler()

X_train = sc.fit_transform(x_train)
X_test = sc.transform(x_test)

print(X_train.shape)
print(y_train.shape)
(11, 3)
(6, 3)

Building and training of the model

log_reg = LogisticRegression(random_state=0)

log_reg.fit(X_train, y_train)
LogisticRegression(random_state=0)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

Predict

y_pred = log_reg.predict(X_test)

for i in range(len(y_pred)):
    print(f"Actual Class: {y_test[i]} - Predicted Class: {y_pred[i]}")
Actual Class: 0 - Predicted Class: 0
Actual Class: 1 - Predicted Class: 1
Actual Class: 1 - Predicted Class: 1
Actual Class: 1 - Predicted Class: 1
Actual Class: 0 - Predicted Class: 0
Actual Class: 0 - Predicted Class: 0

Evaluation

# Confusion Matrix
cm = confusion_matrix(y_true=y_test, y_pred=y_pred)

print(cm)

sbn.heatmap(cm, annot=True, fmt='d', cmap='Purples', xticklabels=['Erkek', 'Kadın'], yticklabels=['Erkek', 'Kadın'])

plt.xlabel('Predicted Class')
plt.ylabel('Actual Class')
plt.title('Confusion Matrix')
plt.show()
[[3 0]
 [0 3]]

Confusion Matrix

# Accuracy
accuracy = (cm[0][0] + cm[1][1]) / len(y_test)
print(f'Accuracy: {accuracy}')
Accuracy: 1.0

5. Avantajlar ve Dezavantajlar

Avantajlar:

  • Basit ve uygulanması kolaydır.
  • Sınıflandırma problemleri için oldukça etkilidir.
  • Modelin çıktısı bir olasılık verdiği için, karar verici sistemlerde kolayca entegre edilebilir.

Dezavantajlar:

  • Non-lineer problemlerde sınırlıdır.
  • Veriler arasındaki ilişki doğrusal değilse, performansı düşer.
  • Dengesiz veri setlerinde (bir sınıfın diğerinden çok daha fazla olduğu durumlar) performansı düşebilir.