Makine Öğrenmesi - Sınıflandırma Algoritmaları

Logistic Regression

Yayın tarihi :16-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Logistic Regression (aka logit, MaxEnt), hedef/tahmin değişkeninin kategorik olduğu bir sınıflandırma algoritmasıdır. İsmine rağmen bir regresyon algroritması değil bir sınıflandırma algoritmasıdır. Doğrusal bir tahminleme yöntemidir. Regresyon derslerinde ele alınan  Doğrusal regresyon(Linear Regression) ile lojistik regresyon arasındaki temel fark, lojistik regresyonun sonuç aralığının 0 ile 1 arasında sınırlandırılmasıdır. 0.5'den küçük olan olasılıklar 0, 0.5 ve üzeri olan olasıklar ise 1 değerini alır. Ayrıca lineer regresyonun aksine lojistik regresyon girdiler ve çıktı değişkenleri arasında lineer bir ilişki gerektirmez.

Kullanım için "LogisticRegression" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.linear_model import LogisticRegression

Söz dizimi : LogisticRegression(penalty='l2', *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)

  • penalty, eklenecek cezanın türünü temsil eder. 4 farklı değer alır: "l1", "l2", "elasticnet", "none". Varsayılan olarak l2 ceza terimi uygulanmıştır.
    • l1, L1 ceza terimini temsil eder.
    • l2, L2 ceza terimini temsil eder.
    • elasticnet, hem L1 hem de L2 ceza terimin temsil eder.
    • none, ceza terimi uygulanmaz. 

Örnek-1: Bazı fiziksel özelliklere ve kan değerlerine bakılarak kişilerin kalp hastası olup olmayacağını tahmin edelim. Veri seti olarak "heart.csv" kullanılacaktır.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
from sklearn.metrics import confusion_matrix,classification_report

from sklearn.linear_model import LogisticRegression

Keşifsel Veri Analizi EDA

#Veri seti okunur
df=pd.read_csv("heart.csv")
df.head()

Çıktı:

# Veri seti hakkında bilgi 
df.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 303 entries, 0 to 302
Data columns (total 14 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   age       303 non-null    int64  
 1   sex       303 non-null    int64  
 2   cp        303 non-null    int64  
 3   trestbps  303 non-null    int64  
 4   chol      303 non-null    int64  
 5   fbs       303 non-null    int64  
 6   restecg   303 non-null    int64  
 7   thalach   303 non-null    int64  
 8   exang     303 non-null    int64  
 9   oldpeak   303 non-null    float64
 10  slope     303 non-null    int64  
 11  ca        303 non-null    int64  
 12  thal      303 non-null    int64  
 13  target    303 non-null    int64  
dtypes: float64(1), int64(13)
memory usage: 33.3 KB
#target sütunu eleman sayıları
df.target.value_counts()

Çıktı:

1    165
0    138
Name: target, dtype: int64
#Veri seti açıklamaları
df.describe()

Çıktı:

#Sütunların birbirleri ile korelasyonu
df.corr()

Çıktı:

#Korelasyon görüntülenmesi
plt.figure(figsize=(16,6))
sns.heatmap(df.corr(),annot=True)

Çıktı:


Model Oluşturma İşlemleri

#x(bağımsız değişkenler) ve y(hedef/tahmin değişkeni) ataması yapılır.
x,y=df.drop("target",axis=1),df[["target"]]

#train ve test verileri ayrılır
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=13)
x_train.shape,x_test.shape,y_train.shape,y_test.shape

Çıktı:

((242, 13), (61, 13), (242, 1), (61, 1))
#LogisticRegression ataması yapılır
Log=LogisticRegression()

#Model eğitme işlemi
Log.fit(x_train,y_train)

#x_test verilerini tahminleme işlemi
predict_Log=Log.predict(x_test)
confusion_matrix(y_test,predict_Log)

Çıktı:

array([[22,  4],
       [ 6, 29]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_Log),annot=True,linewidths=2)

Çıktı:

 
#Sınıflandırma raporu
print(classification_report(y_test,predict_Log))

Çıktı:

              precision    recall  f1-score   support

           0       0.79      0.85      0.81        26
           1       0.88      0.83      0.85        35

    accuracy                           0.84        61
   macro avg       0.83      0.84      0.83        61
weighted avg       0.84      0.84      0.84        61

Sınıflandırma raporunda da görüldüğü gibi LogisticRegression algoritması ile girilen değerlere göre target sütununda bulunan hastalık durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %84 olarak buldu.

Model Tahminleme İşlemleri

LogisticRegression algoritması ile eğitmiş olduğumuz modele dışardan bilgiler girerek ilgili kişinin kalp hastası olup olmayacağı bilgisine bakalım.

#1. Hasta bilgileri
#Sırasıyla:'age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal' değerleri girilir.
patientInformation=[[45.0, 1.0, 1.0, 170.0, 270.0, 1.0, 0.0, 150.0, 1.0, 1.6, 1.0, 0.0, 3.0]]

#Model tahminleme işlemi
Log.predict(patientInformation)

Çıktı:

array([0], dtype=int64)

Girilen kişinin kalp hastası olma durumu 0 olarak sonuçlandı. Yani kişi kalp hastası değildir. 

#2. hasta bilgileri
#Sırasıyla:'age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal' değerleri girilir.
patientInformation=[[52.0, 0.0, 1.0, 105.0, 198.0, 0.0, 1.0, 168.0, 0.0, 0.0, 2.0, 1.0, 2.0]]

#Model tahminleme işlemi
Log.predict(patientInformation)

 Çıktı:

array([1], dtype=int64)

Girilen kişinin kalp hastası olma durumu 1 olarak sonuçlandı. Yani kişi kalp hastası olabilir.

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.