Naive Bayes

"Si Polos yang Menebak Berdasarkan Peluang"

1. Apa itu Naive Bayes?

Naive Bayes adalah algoritma klasifikasi yang didasarkan pada Teorema Bayes (Statistik). Disebut "Naive" (Polos/Lugu) karena dia berasumsi bahwa semua fitur itu Independen (tidak berhubungan satu sama lain), padahal di dunia nyata jarang terjadi.

Contoh klasik: Filter Spam Email. Jika ada kata "Menang", "Hadiah", "Klik", Naive Bayes menghitung peluang email itu Spam vs Bukan Spam.

2. Rumus: Teorema Bayes

$$ P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} $$

Dalam bahasa manusia:

$$ \text{Peluang(Spam | Kata="Hadiah")} = \frac{\text{Peluang(Kata="Hadiah" | Spam)} \cdot \text{Peluang(Spam)}}{\text{Peluang(Kata="Hadiah")}} $$
  • Posterior $P(A|B)$: Peluang kejadian A terjadi JIKA kita tahu B terjadi. (Target kita).
  • Likelihood $P(B|A)$: Kemiripan. Seberapa sering B muncul kalau A terjadi.
  • Prior $P(A)$: Peluang awal A terjadi (sebelum lihat data).

3. Simulasi Manual: Deteksi Cuaca

Data Latih (10 Hari):
  • 5 Hari Hujan (Di antaranya: 4 Mendung, 1 Cerah)
  • 5 Hari Panas (Di antaranya: 1 Mendung, 4 Cerah)
Pertanyaan:

Hari ini Mendung. Apakah akan Hujan atau Panas?

Langkah 1: Hitung Prior (Peluang Umum)

$P(\text{Hujan}) = 5/10 = 0.5$
$P(\text{Panas}) = 5/10 = 0.5$

Langkah 2: Hitung Likelihood (Kemiripan)

$P(\text{Mendung} | \text{Hujan}) = 4/5 = 0.8$ (Sering mendung kalau mau hujan)
$P(\text{Mendung} | \text{Panas}) = 1/5 = 0.2$ (Jarang mendung kalau panas)

Langkah 3: Kalikan (Abaikan Pembagi P(B))

Hujan: $0.8 \times 0.5 = \mathbf{0.4}$
Panas: $0.2 \times 0.5 = \mathbf{0.1}$

Kesimpulan:

Karena $0.4 > 0.1$, maka prediksi model: HUJAN.

4. Implementasi Python (Scikit-Learn)

from sklearn.naive_bayes import GaussianNB
import numpy as np

# 1. Data Dummy
# Fitur: [Suhu, Kelembaban]
X_train = np.array([
    [30, 85], [25, 90], [28, 70], # Panas/Lembab -> Mungkin Hujan
    [35, 40], [32, 50], [40, 30]  # Panas/Kering -> Tidak Hujan
])
# Label: 1 = Hujan, 0 = Tidak
y_train = np.array([1, 1, 1, 0, 0, 0])

# 2. Buat Model
# GaussianNB digunakan untuk data angka (kontinyu)
model = GaussianNB()

# 3. Training
model.fit(X_train, y_train)

# 4. Prediksi (Suhu 27, Kelembaban 88)
X_new = np.array([[27, 88]])
prediksi = model.predict(X_new)
proba = model.predict_proba(X_new)

print(f"Prediksi: {'Hujan' if prediksi[0] == 1 else 'Tidak'}")
print(f"Probabilitas: Tidak={proba[0][0]:.2f}, Hujan={proba[0][1]:.2f}")