2024-02-28 | Pausi |

Naive Bayes

Naive Bayes
Naive Bayes adalah metode klasifikasi yang menggunakan prinsip probability untuk membuat model prediksi klasifikasi machine learning, dengan memanfaatkan kejadian di masa lalu untuk memprediksi kejadian di masa depan.
Naive Bayes adalah sekumpulan algoritma yang dibangun berdasarkan Teori Bayes (diambil dari nama matematikawan Inggris Thomas Bayes). Algoritma ini tidak membutuhkan terlalu banyak data training untuk membuat prediksi yang efektif.
Rumus Conditional Probability

Contoh

Gratis Hadiah Emas Uang Label
1 1 1 1 Spam
1 1 0 1 Spam
0 1 1 1 Spam
1 0 1 1 Spam
0 1 0 0 Ham
0 0 0 1 Ham
1 0 0 0 Ham
Itu adalah contoh data email yang diklasifikasikan sebagai spam atau Ham (Bukan Spam). Data ini akan kita training kedalam algoritma naive bayes, dan selanjutnya kita akan memprediksi email baru apakah spam atau Ham.
email baru yang akan kita prediksi adalah:
Gratis Hadiah Emas Uang
0 0 1 0
Pertanyaannya adalah apakah email ini spam atau bukan spam?
Untuk melakukannya kita perlu menghitung probabilitas kemungkinan spam dan bukan spam.
Dari dataset sebelumnya diketahui:
  • Spam: 4/7 (Jumlah data spam)
  • Bukan Spam: 3/7 (Jumlah data bukan spam)
Feature Spam ~Spam
Gratis 3/4 1/3
Hadiah 3/4 1/3
Emas 3/4 0/3
Uang 4/4 1/3
dan
Karena kita hanya membandingkan dua nilai, maka kita tidak perlu menghitung nilai pembagi (P(X)).
Hasilnya menjadi 0 karena ada satu probabilitas yang bernilai 0, yaitu . Untuk mengatasi masalah ini kita gunakan Laplace smoothing: tambahkan 1 pada pembilang dan 2 pada penyebut. Angka 2 dipakai karena setiap fitur bersifat biner, yaitu hanya punya 2 kemungkinan nilai (0 dan 1).
Sekarang kita hitung untuk yang bukan spam.
Sama seperti sebelumnya, karena maka kita terapkan Laplace smoothing (+1 pembilang, +2 penyebut).
Dari hasil perhitungan diatas, kita bisa simpulkan bahwa email tersebut bukan spam, karena probabilitasnya lebih besar dari spam.

Implementasi di Python

Import library yang dibutuhkan
import pandas as pd
from sklearn.naive_bayes import BernoulliNB
Kemudian kita buat dataframe yang berisi dataset yang akan kita gunakan
data = {
    'Gratis': [1, 1, 0, 1, 0, 0, 1],
    'Hadiah': [1, 1, 1, 0, 1, 0, 0],
    'Emas':   [1, 0, 1, 1, 0, 0, 0],
    'Uang':   [1, 1, 1, 1, 0, 1, 0],
    'Label':  ['Spam', 'Spam', 'Spam', 'Spam', 'Ham', 'Ham', 'Ham']
}
df = pd.DataFrame(data)
Kemudian kita pisahkan antara feature dan label
X = df[['Gratis', 'Hadiah', 'Emas', 'Uang']]
y = df['Label']
Selanjutnya kita buat model naive bayes. Karena fitur kita bernilai biner (0/1), kita pakai BernoulliNB. Secara default BernoulliNB sudah memakai Laplace smoothing (alpha=1.0) seperti perhitungan manual di atas.
model = BernoulliNB()
Kemudian kita training model dengan data yang sudah kita siapkan
model.fit(X, y)
Terakhir, kita prediksi email baru Gratis=0, Hadiah=0, Emas=1, Uang=0
email_baru = pd.DataFrame({'Gratis': [0], 'Hadiah': [0], 'Emas': [1], 'Uang': [0]})

print(model.predict(email_baru))        # ['Ham']
print(model.predict_proba(email_baru))  # probabilitas untuk tiap kelas
Hasilnya model memprediksi email tersebut sebagai Ham (bukan spam), sesuai dengan perhitungan manual yang kita lakukan sebelumnya.