Meja:
Pengantar
Naive Bayes adalah algoritma pembelajaran mesin klasifikasi yang didasarkan pada teorema Bayes. Ini sangat efisien terutama ketika menangani data tekstual seperti: Analisis Sentimen, Deteksi Spam, dan klasifikasi teks.
Algoritme ini disebut “Naif” karena asumsi bahwa semua variabel kumpulan data adalah independen, namun hal ini tidak selalu terjadi.
Sebelum menjelaskan lebih jauh cara kerja Naive bayes, pastikan kita memahami hal berikut:
Probabilitas bersyarat
Algoritme Naive Bayes didasarkan pada teorema Bayes yang didasarkan pada probabilitas bersyarat: yaitu probabilitas terjadinya suatu peristiwa A jika suatu peristiwa B telah terjadi.
Contoh:
Mari kita buat dua toples yang berisi bola berwarna:
-
Toples 1 berisi 3 bola biru, 2 bola merah, dan 4 bola hijau.
-
Toples 2 terdapat 1 bola biru, 4 bola merah, dan 3 bola hijau.
Kita ingin menghitung probabilitas terambilnya bola biru secara acak dari salah satu toples
Ini tidak lain adalah jumlah probabilitas terpilihnya bola biru dari Jar1 atau Jar2.
Sekarang, kita ingin menghitung probabilitas terambilnya bola biru jika kita memilih Jar1:
Terakhir, kita ingin menghitung probabilitas terpilihnya Jar1 jika kita menggambar bola biru. Disini kita menggunakan Teorema Bayes yang dinyatakan sebagai berikut:
Klasifikasi Naif Bayes
Dalam pengklasifikasi Naive Bayes, kami ingin mencari kelas yang memaksimalkan probabilitas bersyarat dengan vektor masukan X; dengan demikian, Naive Bayes dapat dirumuskan sebagai berikut:
Dengan menggunakan Teorema Bayes, fungsinya menjadi:
Dalam rumusan ini mudah untuk menghitung P(Ci) yang tidak lain adalah peluang kelas Ci, dan mudah untuk menghitung P(x) yang merupakan peluang terjadinya kejadian x.
Yang sulit dihitung adalah P(x|Ci); peluang kejadian x jika diberi kelas Ci. Untuk lebih menyederhanakan hal ini, kita perlu berasumsi bahwa semua variabel masukan adalah independen; dengan demikian, kita dapat menulis:
Dan sebenarnya karena asumsi inilah kami menyebut pengklasifikasi ini “Naif”, karena kami tidak selalu dapat menjamin independensi variabel masukan. Pengklasifikasi Naive Bayes menjadi:
Faktanya, rumusan ini bisa kita sederhanakan lebih jauh dengan menghilangkan P(x), karena rumusnya sama untuk semua kelas:
Sekarang, mari kita lihat sebuah contoh:
| Cuaca | Waktu | Hari dalam seminggu | Makan malam |
| ------- | -------- | --------------- | ------ |
| Hapus | Malam | Akhir pekan | juru masak |
| Berawan | Malam | Hari kerja | Pesanan |
| Hujan | Malam | Hari kerja | Pesanan |
| Hujan | Tengah hari | Hari kerja | Pesanan |
| Berawan | Tengah hari | Akhir pekan | juru masak |
| Hapus | Malam | Akhir pekan | juru masak |
| Bersalju | Malam | Akhir pekan | Pesanan |
| Hapus | Malam | Hari kerja | juru masak |
| Hapus | Tengah malam | Akhir pekan | Pesanan |
Di sini, kami memiliki kumpulan data kecil yang berisi 3 variabel masukan: Cuaca, Waktu, dan Hari, dan satu variabel Target: “Makan Malam” yang menunjukkan apakah seseorang memasak atau memesan makan malamnya. Kami ingin mencari kelas input x={Clear, Evening, Weekend}:
Kita perlu menghitung probabilitas kondisional untuk kelas “Cooks” dan kelas “Orders” dengan masukan x={Clear, Evening, Weekend}. Kelas yang diprediksi adalah kelas yang mempunyai probabilitas bersyarat tertinggi.
Kita mulai dengan menghitung probabilitas bersyarat dari kelas “Koki”:
Sekarang kita menghitung sendiri setiap probabilitas bersyarat:
Probabilitas cuaca=”Jelas” mengingat kelasnya adalah “Masak” adalah jumlah garis dengan cuaca “Jelas” dan kelas “Masak” dari jumlah total garis dengan kelas “Masak”
Hal yang sama berlaku untuk probabilitas bersyarat lainnya:
Sekarang untuk probabilitas P(Cooks) adalah jumlah baris dengan kelas “Cooks” dari jumlah total baris:
Sekarang kita menghitung produk dari probabilitas berikut:
Itu tadi untuk kelas “Masak”, sekarang kita perlu melakukan hal yang sama untuk kelas “Pesanan”:
Kami menghitung probabilitas individu:
Dan kami akhirnya menghitung produk dari probabilitas:
Terakhir, kita mengambil kelas dengan probabilitas tertinggi yaitu kelas “Masak”:
Kelebihan dan keterbatasan algoritma ini
Keuntungan:
-
Ini adalah pengklasifikasi yang sangat cepat.
-
Mudah diterapkan.
-
Tidak ada fase pelatihan, tetapi hanya inferensi.
-
Tidak memerlukan banyak data untuk membuat kesimpulan.
Keterbatasan:
- Naive Bayes mengasumsikan bahwa variabel masukan bersifat independen, namun hal ini tidak selalu benar.
- Naive Bayes mengalami masalah frekuensi nol: yaitu masalah yang menetapkan probabilitas nol pada variabel masukan. Ini akan menghilangkan semua probabilitas bersyarat P(C|x). Salah satu trik untuk menghindari hal ini adalah dengan menggunakan frekuensi minimal 1 ( bukan 0 ) untuk semua variabel.
Latihan
Berikut adalah kerangka data dari kumpulan data yang sama seperti yang telah kita lihat pada contoh.
Tugas Anda adalah mengimplementasikan Naive Bayes sendiri menggunakan python:
import pandas as pd
dataset = pd.DataFrame()
dataset['Weather'] = ['Clear', 'Cloudy', 'Rainy', 'Rainy', 'Cloudy', 'Clear', 'Snowy', 'Clear', 'Clear']
dataset['Time'] = ['Evening', 'Night', 'Night', 'Midday', 'Midday', 'Night', 'Evening', 'Night', 'Midnight']
dataset['Day'] = ['Weekend', 'Weekday', 'Weekday', 'Weekday', 'Weekend', 'Weekend', 'Weekend', 'Weekday', 'Weekend']
dataset['Class'] = ['Cooks', 'Orders', 'Orders', 'Orders', 'Cooks', 'Cooks', 'Orders', 'Cooks', 'Orders']
def naive_bayes(weather, time, day):
# res_dict = {class1: probability of class 1, class1: probability of class 1
return res_dict
Solusi
def naive_bayes(x_weather, x_time, x_day):
TARGET = 'Dinner' # The name of the target variable
CLASSES = list(dataset['Dinner'].unique()) # The classes of the target variable
len_dataset = len(dataset) # The length of the dataset
res_dict = {} # res_dict = {class1:probability1, ..., class_n:probability_n}
# for each class of the target classes, we calculate the it's conditional probability
for class_name in CLASSES:
# the number of lines that belong to the class "class_name"
len_c = len(dataset[ (dataset[TARGET] == class_name) ])
# the number of lines that belong to the class "class_name" and have weather="x_weather"
n_weather = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Weather'] == x_weather) ])
# the number of lines that belong to the class "class_name" and have time="x_time"
n_time = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Time'] == x_time) ])
# the number of lines that belong to the class "class_name" and have day="x_day"
n_day = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Day'] == x_day) ])
# We calculate the conditional probability:
# P(class|x) = P(weather|class) x P(time|class) x P(day|class) x P(class)
p = (n_weather / len_c) * (n_time / len_c) * (n_day / len_c) * (len_c / len_dataset) res_dict[class_name] = p
return res_dict