Kurs
Diyelim ki bir ürün yöneticisisiniz ve müşteri değerlendirmelerini olumlu ve olumsuz olarak sınıflandırmak istiyorsunuz. Ya da bir kredi yöneticisi olarak, hangi kredi başvuru sahiplerinin güvenli veya riskli olduğunu belirlemek istiyorsunuz. Bir sağlık analisti olarak, hangi hastaların diyabet hastalığından muzdarip olabileceğini tahmin etmek istiyorsunuz. Tüm bu örnekler, değerlendirmeleri, kredi başvuru sahiplerini ve hastaları sınıflandırma türünde aynı probleme sahiptir.
Naive Bayes, büyük veri yığınları için uygun, en basit ve en hızlı sınıflandırma algoritmasıdır. Naive Bayes sınıflandırıcı; istenmeyen e-posta filtreleme, metin sınıflandırma, duygu analizi ve öneri sistemleri gibi çeşitli uygulamalarda başarıyla kullanılır. Bilinmeyen sınıfın tahmini için Bayes olasılık teoremini kullanır.
Bu eğitimde aşağıdakilerin tümünü öğreneceksiniz:
- Sınıflandırma İş Akışı
- Naive Bayes sınıflandırıcı nedir?
- Naive Bayes sınıflandırıcı nasıl çalışır?
- Scikit-learn ile sınıflandırıcı oluşturma
- Sıfır Olasılık Problemi
- Avantajları ve dezavantajları
Bu eğitimdeki tüm örnek kodları kolayca kendiniz çalıştırmak için, Python’un önceden kurulu olduğu ve tüm kod örneklerini içeren ücretsiz bir DataLab çalışma defteri oluşturabilirsiniz. Scikit-learn üzerine daha fazla pratik için Scikit-learn ile Denetimli Öğrenme kursumuza göz atın!
Naive Bayes Sınıflandırıcı Nedir?
Naive Bayes, Bayes Teoremine dayalı istatistiksel bir sınıflandırma tekniğidir. En basit denetimli öğrenme algoritmalarından biridir. Naive Bayes sınıflandırıcı hızlı, doğru ve güvenilir bir algoritmadır. Büyük veri kümelerinde yüksek doğruluk ve hız sunar.
Naive Bayes sınıflandırıcı, bir sınıftaki belirli bir özelliğin etkisinin diğer özelliklerden bağımsız olduğunu varsayar. Örneğin, bir kredi başvuru sahibinin tercih edilir olup olmadığı; gelirine, önceki kredi ve işlem geçmişine, yaşına ve konumuna bağlıdır. Bu özellikler birbiriyle ilişkili olsa bile, yine de bağımsız kabul edilir. Bu varsayım hesaplamayı basitleştirir ve bu yüzden “naive” olarak adlandırılır. Bu varsayıma sınıfa koşullu bağımsızlık denir.

-
P(h): veriden bağımsız olarakhhipotezinin doğru olma olasılığı. Bunah’nin önsel olasılığı denir. -
P(D): hipotezden bağımsız olarak verinin olasılığı. Buna önsel olasılık denir. -
P(h|D):Dverisi verildiğindehhipotezinin olasılığı. Buna artgösterim olasılığı denir. -
P(D|h):hhipotezinin doğru olduğu varsayımı altındadverisinin olasılığı. Bu da artgösterim olasılığı olarak bilinir.
Naive Bayes Sınıflandırma İş Akışı
Ne zaman bir sınıflandırma yapsanız, ilk adım problemi anlamak ve potansiyel özellikleri ve etiketi belirlemektir. Özellikler, etiketin sonucunu etkileyen nitelik ya da özelliklerdir. Örneğin, kredi dağıtımı durumunda, banka yöneticileri müşterinin mesleğini, gelirini, yaşını, konumunu, önceki kredi geçmişini, işlem geçmişini ve kredi notunu belirler. Bu nitelikler, modelin müşterileri sınıflandırmasına yardımcı olan özellikler olarak bilinir.
Sınıflandırmanın iki aşaması vardır: öğrenme ve değerlendirme. Öğrenme aşamasında sınıflandırıcı, verilen veri kümesi üzerinde modelini eğitir; değerlendirme aşamasında ise sınıflandırıcının performansını test eder. Performans; doğruluk, hata, kesinlik (precision) ve duyarlılık (recall) gibi çeşitli ölçütlere göre değerlendirilir.

Naive Bayes Sınıflandırıcı Nasıl Çalışır?
Naive Bayes’in çalışma şeklini bir örnek üzerinden anlayalım. Hava koşulları ve spor yapma örneği verildiğinde, spor yapma olasılığını hesaplamanız gerekir. Şimdi, hava durumuna göre oyuncuların oynayıp oynamayacağını sınıflandırmanız gerekiyor.
İlk yaklaşım (tek özellik durumunda)
Naive Bayes sınıflandırıcı bir olayın olasılığını şu adımlarla hesaplar:
- Adım 1: Verilen sınıf etiketleri için önsel olasılığı hesaplayın
- Adım 2: Her sınıf için her öznitelikle koşullu olasılığı (likelihood) bulun
- Adım 3: Bu değerleri Bayes Formülüne koyup artgösterim olasılığını hesaplayın.
- Adım 4: Hangi sınıfın olasılığı daha yüksekse, girdinin o sınıfa ait olduğuna karar verin.
Önsel ve artgösterim olasılık hesaplarını basitleştirmek için frekans ve olasılık tabloları olmak üzere iki tablo kullanabilirsiniz. Her iki tablo da önsel ve artgösterim olasılıklarını hesaplamanıza yardımcı olur. Frekans tablosu, tüm özellikler için etiketlerin görülme sıklığını içerir. İki olasılık tablosu vardır. Olasılık Tablosu 1, etiketlerin önsel olasılıklarını; Olasılık Tablosu 2 ise artgösterim olasılığını gösterir.

Şimdi, hava bulutluyken oynama olasılığını hesaplamak istediğinizi varsayalım.
Oynama olasılığı:
P(Yes | Overcast) = P(Overcast | Yes) × P(Yes) / P(Overcast)
Adım 1: Önsel olasılıkları hesaplayın
- P(Overcast) = 4/14 = 0.29
- P(Yes) = 9/14 = 0.64
Adım 2: Artgösterim olasılığını hesaplayın
- P(Overcast | Yes) = 4/9 = 0.44
Adım 3: Bayes Formülünü uygulayın
Burada, önsel ve artgösterim olasılıklarını ilk denkleme yerleştiriyoruz.
P(Yes | Overcast) = 0.44 × 0.64 / 0.29 = 0.98
Benzer şekilde, oynamama olasılığını da hesaplayabilirsiniz:
Oynamama olasılığı:
P(No | Overcast) = P(Overcast | No) × P(No) / P(Overcast)
Adım 1: Önsel olasılıkları hesaplayın
- P(Overcast) = 4/14 = 0.29
- P(No) = 5/14 = 0.36
Adım 2: Koşullu olasılığı (likelihood) hesaplayın
- P(Overcast | No) = 0/5 = 0
Adım 3: Bayes Formülünü uygulayın
Burada, önsel ve koşullu olasılıkları denkleme koyup artgösterim olasılığını elde ediyoruz.
P(No | Overcast) = 0 × 0.36 / 0.29 = 0
'Yes' sınıfının olasılığı daha yüksek. Dolayısıyla hava bulutluysa, oyuncuların sporu oynayacağını söyleyebilirsiniz.
İkinci yaklaşım (çoklu özellik durumunda)

Şimdi, hava bulutluyken ve sıcaklık ılıman olduğunda oynama olasılığını hesaplamak istediğinizi varsayalım.
Oynama olasılığı:
P(Play = Yes | Weather = Overcast, Temp = Mild) = P(Weather = Overcast, Temp = Mild | Play = Yes) × P(Play = Yes)
Naive Bayes bağımsızlık varsayımını kullanarak:
P(Weather = Overcast, Temp = Mild | Play = Yes) = P(Overcast | Yes) × P(Mild | Yes)
Adım 1: Önsel olasılığı hesaplayın
- P(Yes) = 9/14 = 0.64
Adım 2: Koşullu olasılıkları hesaplayın
- P(Overcast | Yes) = 4/9 = 0.44
- P(Mild | Yes) = 4/9 = 0.44
Adım 3: Birleşik koşullu olasılığı hesaplayın
P(Weather = Overcast, Temp = Mild | Play = Yes) = 0.44 × 0.44 = 0.1936
Adım 4: Bayes Formülünü uygulayın
P(Play = Yes | Weather = Overcast, Temp = Mild) = 0.1936 × 0.64 = 0.124
Benzer şekilde, oynamama olasılığını da hesaplayabilirsiniz:
Oynamama olasılığı:
P(Play = No | Weather = Overcast, Temp = Mild) = P(Weather = Overcast, Temp = Mild | Play = No) × P(Play = No)
Naive Bayes bağımsızlık varsayımını kullanarak:
P(Weather = Overcast, Temp = Mild | Play = No) = P(Overcast | No) × P(Mild | No)
Adım 1: Önsel olasılığı hesaplayın
- P(No) = 5/14 = 0.36
Adım 2: Koşullu olasılıkları hesaplayın
- P(Overcast | No) = 0/5 = 0
- P(Mild | No) = 2/5 = 0.4
Adım 3: Birleşik koşullu olasılığı hesaplayın
P(Weather = Overcast, Temp = Mild | Play = No) = 0 × 0.4 = 0
Adım 4: Bayes Formülünü uygulayın
P(Play = No | Weather = Overcast, Temp = Mild) = 0 × 0.36 = 0
'Yes' sınıfının olasılığı daha yüksektir (0.124’e karşı 0), bu nedenle hava bulutlu ve sıcaklık ılıman olduğunda oyuncular sporu oynayacaktır.
Scikit-learn ile Sınıflandırıcı Oluşturma
Sentetik bir veri kümesiyle Naive Bayes Sınıflandırıcı
İlk örnekte, scikit-learn kullanarak sentetik veri üretecek ve Gaussian Naive Bayes algoritmasını eğitip değerlendireceğiz.
Veri kümesinin oluşturulması
Scikit-learn, veri kümesi oluşturup çeşitli makine öğrenimi algoritmalarını değerlendirebileceğimiz bir makine öğrenimi ekosistemi sağlar.
Bizim durumumuzda, make_classification() fonksiyonunu kullanarak altı özellikli, üç sınıflı ve 800 örnekten oluşan bir veri kümesi oluşturuyoruz.
from sklearn.datasets import make_classification
X, y = make_classification(
n_features=6,
n_classes=3,
n_samples=800,
n_informative=2,
random_state=1,
n_clusters_per_class=1,
)
Veri kümesini görselleştirmek için matplotlib.pyplot’un scatter() fonksiyonunu kullanacağız.
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=y, marker="*");
Gözlemlenebileceği gibi üç tür hedef etiket var ve çok sınıflı bir sınıflandırma modeli eğiteceğiz.
Eğitim-test ayrımı
Eğitim sürecine başlamadan önce, model değerlendirmesi için veri kümesini eğitim ve test olarak ayırmamız gerekir.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.33, random_state=125
)
Model kurma ve eğitim
Genel bir Gaussian Naive Bayes modeli oluşturup eğitim veri kümesi üzerinde eğitin. Ardından, modele rastgele bir test örneği vererek tahmin edilen bir değer elde edin.
from sklearn.naive_bayes import GaussianNB
# Build a Gaussian Classifier
model = GaussianNB()
# Model training
model.fit(X_train, y_train)
# Predict Output
predicted = model.predict([X_test[6]])
print("Actual Value:", y_test[6])
print("Predicted Value:", predicted[0])
Gerçek ve tahmin edilen değerler aynıdır.
Actual Value: 0
Predicted Value: 0
Model değerlendirme
Modeli, görülmemiş bir test veri kümesi üzerinde değerlendireceğiz. Önce test veri kümesi için değerleri tahmin edecek, ardından bunları kullanarak doğruluk ve F1 puanını hesaplayacağız.
from sklearn.metrics import (
accuracy_score,
confusion_matrix,
ConfusionMatrixDisplay,
f1_score,
)
y_pred = model.predict(X_test)
accuray = accuracy_score(y_pred, y_test)
f1 = f1_score(y_pred, y_test, average="weighted")
print("Accuracy:", accuray)
print("F1 Score:", f1)
Modelimiz varsayılan hiperparametrelerle oldukça iyi performans gösterdi.
Accuracy: 0.8484848484848485
F1 Score: 0.8491119695890328
Karmaşıklık matrisini görselleştirmek için, gerçek-pozitif ve gerçek-negatifleri hesaplamak üzere confusion_matrix’i ve etiketlerle birlikte matrisi göstermek için ConfusionMatrixDisplay kullanacağız.
labels = [0,1,2]
cm = confusion_matrix(y_test, y_pred, labels=labels)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)
disp.plot();
Modelimiz oldukça iyi performans gösterdi ve ölçekleme, ön işleme, çapraz doğrulamalar ve hiperparametre optimizasyonuyla performansı daha da iyileştirebiliriz.
Bir kredi veri kümesiyle Naive Bayes Sınıflandırıcı
Naive Bayes Sınıflandırıcıyı gerçek bir veri kümesi üzerinde eğitelim. Ön işleme ve veri keşfi dışında görevlerin çoğunu tekrarlayacağız.
Veri yükleme
Bu örnekte, pandas’ın read_csv fonksiyonunu kullanarak DataLab’den Kredi Verisini yükleyeceğiz.
import pandas as pd
df = pd.read_csv('loan_data.csv')
df.head()
Veri keşfi
Veri kümesi hakkında daha fazla bilgi edinmek için .info() kullanacağız.
-
Veri kümesi 14 sütun ve 9578 satırdan oluşur.
-
purposedışında, sütunlar ya float ya da integer’dır. -
Hedef sütunumuz
not.fully.paid.
df.info()
RangeIndex: 9578 entries, 0 to 9577
Data columns (total 14 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 credit.policy 9578 non-null int64
1 purpose 9578 non-null object
2 int.rate 9578 non-null float64
3 installment 9578 non-null float64
4 log.annual.inc 9578 non-null float64
5 dti 9578 non-null float64
6 fico 9578 non-null int64
7 days.with.cr.line 9578 non-null float64
8 revol.bal 9578 non-null int64
9 revol.util 9578 non-null float64
10 inq.last.6mths 9578 non-null int64
11 delinq.2yrs 9578 non-null int64
12 pub.rec 9578 non-null int64
13 not.fully.paid 9578 non-null int64
dtypes: float64(6), int64(7), object(1)
memory usage: 1.0+ MB
Bu örnekte, krediyi tamamen ödememiş müşterileri tahmin edecek bir model geliştireceğiz. Hedef ve amaç sütunlarını seaborn’un countplot’u ile inceleyelim.
import seaborn as sns
import matplotlib.pyplot as plt
sns.countplot(data=df,x='purpose',hue='not.fully.paid')
plt.xticks(rotation=45, ha='right');
Veri kümemiz dengesiz ve bu durum modelin performansını etkileyecektir. Dengesiz veri kümeleriyle pratik yapmak için Dengesiz Bir Veri Kümesini Yeniden Örnekleme eğitimine göz atabilirsiniz.
Veri İşleme
purpose sütununu pandas get_dummies() fonksiyonunu kullanarak kategorikten tamsayıya dönüştüreceğiz.
pre_df = pd.get_dummies(df,columns=['purpose'],drop_first=True)
pre_df.head()
Ardından, özellik (X) ve hedef (y) değişkenlerini tanımlayıp veri kümesini eğitim ve test olarak ayıracağız.
from sklearn.model_selection import train_test_split
X = pre_df.drop('not.fully.paid', axis=1)
y = pre_df['not.fully.paid']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.33, random_state=125
)
Model kurma ve eğitim
Model kurma ve eğitim oldukça basittir. Varsayılan hiperparametrelerle eğitim veri kümesi üzerinde bir model eğiteceğiz.
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X_train, y_train);
Model değerlendirme
Model performansını belirlemek için doğruluk ve f1 skoru kullanacağız ve Gaussian Naive Bayes algoritmasının oldukça iyi performans gösterdiği görülüyor.
from sklearn.metrics import (
accuracy_score,
confusion_matrix,
ConfusionMatrixDisplay,
f1_score,
classification_report,
)
y_pred = model.predict(X_test)
accuray = accuracy_score(y_pred, y_test)
f1 = f1_score(y_pred, y_test, average="weighted")
print("Accuracy:", accuray)
print("F1 Score:", f1)
Accuracy: 0.8206263840556786
F1 Score: 0.8686606980013266
Verinin dengesiz doğası nedeniyle, karmaşıklık matrisi farklı bir tablo çizer. Azınlık hedefi olan not fully paid üzerinde daha fazla yanlış etiketleme vardır.
labels = ["Fully Paid", "Not fully Paid"]
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)
disp.plot();
Eğitim veya model değerlendirme sırasında sorun yaşıyorsanız, Scikit-learn kullanarak Naive Bayes Sınıflandırma Eğitimi için DataLab çalışma defterine göz atabilirsiniz. Veri kümesi, kaynak kodu ve çıktılarla birlikte gelir.
Sıfır Olasılık Problemi
Veri kümesinde riskli kredi için hiç kayıt olmadığını varsayalım; bu senaryoda artgösterim olasılığı sıfır olur ve model tahmin yapamaz. Bu probleme, belirli bir sınıfın görülme sıklığının sıfır olmasından ötürü Sıfır Olasılık denir.
Bu tür bir sorun için çözüm, Laplace düzeltmesi veya Laplace Dönüşümüdür. Laplace düzeltmesi, yumuşatma tekniklerinden biridir. Burada, veri kümesinin yeterince büyük olduğunu ve her sınıfa bir satır eklemenin tahmini olasılığı etkilemeyeceğini varsayabilirsiniz. Bu, olasılık değerlerinin sıfıra inmesi sorununu ortadan kaldırır.
Örneğin: Riskli kredi sınıfı için veritabanında 1000 eğitim kaydı olduğunu varsayalım. Bu veritabanında gelir sütununda düşük gelir için 0 kayıt, orta gelir için 990 kayıt ve yüksek gelir için 10 kayıt vardır. Laplace düzeltmesi olmadan bu olayların olasılıkları sırasıyla 0, 0.990 (990/1000’den) ve 0.010’dur (10/1000’den)
Şimdi, verilen veri kümesine Laplace düzeltmesini uygulayın. Her gelir-değer çifti için 1 kayıt daha ekleyelim. Bu olayların olasılıkları:
Naive Bayes’in Avantajları
- Sadece basit bir yaklaşım olmakla kalmaz, aynı zamanda tahmin için hızlı ve doğrudur.
- Naive Bayes’in hesaplama maliyeti çok düşüktür.
- Büyük veri kümelerinde verimli bir şekilde çalışabilir.
- Sürekli değişkene kıyasla ayrık tepki değişkeni söz konusu olduğunda iyi performans gösterir.
- Çok sınıflı tahmin problemlerinde kullanılabilir.
- Metin analizi problemlerinde de iyi performans gösterir.
- Bağımsızlık varsayımı geçerli olduğunda, Naive Bayes sınıflandırıcı lojistik regresyon gibi diğer modellere kıyasla daha iyi performans gösterir.
Naive Bayes’in Dezavantajları
- Bağımsız özellikler varsayımı. Pratikte, tamamen bağımsız yordayıcılar setine sahip olmak neredeyse imkansızdır.
- Belirli bir sınıf için hiç eğitim kaydı yoksa, bu durum artgösterim olasılığının sıfır olmasına yol açar. Bu durumda model tahmin yapamaz. Bu probleme Sıfır Olasılık/Sıklık Problemi denir.
Sonuç
Tebrikler, bu eğitimin sonuna ulaştınız!
Bu eğitimde Naive Bayes algoritmasını, çalışma şeklini, Naive Bayes varsayımını, sorunlarını, uygulamasını, avantaj ve dezavantajlarını öğrendiniz. Yol boyunca ayrıca scikit-learn’de ikili ve çok terimli (multinomial) sınıflar için model kurma ve değerlendirmeyi de öğrendiniz.
Naive Bayes en basit ve en güçlü algoritmalardan biridir. Son birkaç yıldaki önemli makine öğrenimi ilerlemelerine rağmen değerini kanıtlamıştır. Metin analizinden öneri motorlarına kadar birçok uygulamada başarıyla hayata geçirilmiştir.
Python’da scikit-learn hakkında daha fazla bilgi edinmek isterseniz, scikit-learn ile Denetimli Öğrenme kursumuzu alın ve Scikit-Learn Eğitimi: Beyzbol Analitiği Bölüm 1 içeriğimize göz atın.