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

IV. Bernoulli Naive Bayes

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

Bernoulli Naive Bayes, temel olarak özellikleri(hedef değerleri) yalnızca binary(ikili) sistemde (örn: doğru/yanlış, hasta/hasta değil, evet/hayır, 0/1) kabul eder. Bernoilli dağılımı üzerinde çalışır. Bu nedenle özellik değerleri ikili değerde olan veri setleri üzerinde Bernoulli Naive Bayes sınıflandırıcısını kullanabiliriz. **Diğer veri setlerinde(ikili sistemde olmayan hedef değişkenlikli) doğruluk oranı çok düşük çıkacaktır.

Bernoulli Dağılımı:

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

from sklearn.naive_bayes import BernoulliNB

Örnek-1: Titanic veri seti üzerinden, survived değişkenine(hayatta kalıp/kalmadığı) BernoulliNB sınıflandırma algoritmasını uygulayalım.

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.naive_bayes import BernoulliNB

Keşifsel Veri Analizi EDA

#Veri seti okunur
df=sns.load_dataset("titanic")
df.head()

Çıktı:

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

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.7+ KB
#Veri setinde boş elemanların toplamı
df.isnull().sum()

Çıktı:

survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64

Boş değişkenler olduğundan dolayı veri seti üzerinde temizleme işlemi yapılır.

# Veri seti temizleme

#age sütununda 177 tane boş alan olduğundan, ortalama değer ile boş alanları dolduralım.
df.age.fillna(df.groupby("sex")["age"].transform("mean"),inplace=True)

#embarked gemiye binilen yerin kısaltması 2 tane eksik alan olduğundan onlar en çok olan değerle doldurulabilir.
df.embarked.fillna(df.embarked.mode()[0],inplace=True)

#class ve pclass değerleri birbirleri ile aynı olduğundan class sütununu silelim
del df["class"]

#deck(güverte) alanında da 688 boş alan var,203 alan doludur. 
#Önem derecesine bağlı olarak silinebilir veya en çok değerle doldurulabilir. 
#Değerinin fazla olmadığını düşünerek ilgili sütunu silelim.
del df["deck"]

#alive değerleri surivived tahmin sütununun tekrarı olduğundan silinebilir.
del df["alive"]

#alone değerleri 0 ve 1 olarak değiştirilebilir.
df.alone=df.alone.map(lambda x:1 if x==True else 0)

#embarked sütunu ile embark_town sütun değerlerinin kısaltması olduğundan embark_town kaldırılabilir
del df["embark_town"]

#son durumda veri setinden rastgele değerlere baklım
df.sample(5)

Çıktı:

#survived sütunu eleman sayıları
df.survived.value_counts()

Çıktı:

0    549
1    342
Name: survived, dtype: int64
#Veri seti açıklamaları
df.describe()

Çıktı:


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

Çıktı:

#Korelasyon görüntülenmesi
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("survived",axis=1),df[["survived"]]

#object değerler olduğu için get_dummies işlemi yapılır
x=pd.get_dummies(x,drop_first=True)

#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ı:

((712, 12), (179, 12), (712, 1), (179, 1))
#BernoulliNB ataması yapılır
B=BernoulliNB()

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

#x_test verilerini tahminleme işlemi
predict_B=B.predict(x_test)
confusion_matrix(y_test,predict_B)

Çıktı:

array([[90, 20],
       [14, 55]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_B),annot=True,linewidths=2)

Çıktı:

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

Çıktı:

              precision    recall  f1-score   support

           0       0.87      0.82      0.84       110
           1       0.73      0.80      0.76        69

    accuracy                           0.81       179
   macro avg       0.80      0.81      0.80       179
weighted avg       0.81      0.81      0.81       179

Sınıflandırma raporunda da görüldüğü gibi doğru tahmin etme yüzdesi accuracy değeri göz önüne alınırsa %81 olarak tahmin etmiş oldu. 

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.