Makine Öğrenmesi - Sınıflandırma Algoritmaları
IV. Bernoulli Naive Bayes
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.