Naive Bayes : Logika dalam Pengklasifikasian Pesan Spam (5 Minutes Explanation)
Hi, balik lagi setelah sekian lama mager ngapa2in. Kali ini saya akan membuat catatan tentang sebuah metode atau algoritma yang cukup terkenal di dunia statistik maupun machine learning, Naive Bayes, beserta contoh logika penerapannya pada use case klasifikasi pesan spam.
Naive Bayes / Naive Bayes Classifier merupakan sebuah metode klasifikasi yang berakar pada teorema Bayes, metode pengklasifikasian dengan menggunakan metode probabilitas dan statistik yang dikemukakan oleh ilmuwan Inggris Thomas Bayes, yaitu memprediksi peluang di masa depan berdasarkan pengalaman di masa sebelumnya sehingga dikenal sebagai Teorema Bayes. Ciri utama dari Naive Bayes Classifier ini adalah asumsi yg sangat kuat (naif) akan independensi dari masing-masing kondisi / kejadian, maksudnya gimana? akan saya jelaskan di tahap selanjutnya.
(https://binus.ac.id/bandung/2019/12/algoritma-naive-bayes/)
Use Case : Spam Classification
Sekarang bayangkan kita punya sekumpulan pesan yang normal, dan sekumpulan pesan spam yang sudah terklasifikasi.
Agar lebih mendetail, katakanlah kita punya 10 pesan normal dan 5 pesan spam. Pertama kita lihat semua kata yang ada di pesan normal dan pesan spam dan jumlah kemunculannya seperti contoh dibawah ini:
Pesan Normal
“Dear” : 20 kali
“Good” : 15 kali
“Donation” : 2 kali
“Love” : 15 kali
“Hangout” : 3 kali
Pesan Spam
“Dear” : 2 kali
“Good” : 2 kali
“Donation” : 15 kali
“Love” : 1 kali
“Hangout”: 0 kali
Dari data diatas kita akan memiliki katakanlah likelihood (peluang pada data diskrit disebut likelihood, data kontinu : probability) kemunculan pada setiap kata seperti berikut:
Pesan Normal
p(Dear|Normal) : 20/54 = 0.37
p(Good|Normal) : 15/54 = 0.277
p(Donation|Normal) : 1/54 = 0.0185
p(Love|Normal) : 15/54 = 0.277
p(Hangout|Normal) : 3/54 = 0.055
Pesan Spam
p(Dear|Spam): 2/20 = 0.1
p(Good|Spam): 2/20 =0.1
p(Donation|Spam): 15/20 = 0.75
p(Love|Spam): 1/20 = 0.05
p(Hangout|Spam) : 0/20 = 0
Kita telah memiliki likelihood untuk kemunculan setiap kata pada Normal dan Spam pesan. Lalu kita juga memiliki peluang secara umum pesan muncul sebagai Normal atau Spam, kita sebut prior probability.
p(N) = (total pesan normal)/(total pesan normal + total pesan spam)
p(N) = 10/(10+5) = 0.667
p(S) = 5/(5+10) = 0.333
Contoh 1
Sekarang misalkan kita memiliki sebuah pesan “Dear Love”. Kita akan tentukan apakah pesan ini spam atau bukan.
Mudah saja, caranya adalah dengan mengalikan prior probability pesan Normal dengan likelihood kata “Dear” dan “Love” dalam pesan Normal seperti dibawah ini.
p(N) x p(Dear|Normal) x p(Love|Normal) = 0.667 x 0.37 x 0.277 = 0.068
Kita lakukan perhitungan yang sama untuk menghitung peluang Spam.
p(S) x p(Dear|Spam) x p(Love|Spam) = 0.333 x 0.1 x 0.05= 0.0016
Kita bisa anggap angka 0.068 dan 0.0016 proporsional terhadap likelihood pesan “Dear Love” adalah pesan Normal dan pesan Spam.
Karena p(N|”Dear Love”) = 0.068 > 0.0016 = p(S|”Dear Love”) maka kita klasifikasikan pesan “Dear Love” sebagai pesan Normal. Wow! Naive Bayes itu mudah dan menyenangkan bukan??? bukan!
Contoh 2
Sekarang kita akan mencoba contoh yang sedikit lebih kompleks.
Kita akan mencoba mengklasifikasikan pesan “Donation Donation Donation Hangout”. Dengan intuisi kita bisa ketahui bahwa pesan ini adalah spam. Mari kita coba test dengan algoritma Naive Bayes dengan prior data (training data) seperti diatas.
Kita gunakan cara yang sama dengan Contoh 1.
p(N|”Donation Donation Donation Hangout”) = p(N) x p(Donation|Normal) x p(Donation|Normal) x p(Donation|Normal) x p(Hangout|Normal) = 0.667 x 0.0185 x 0.0185 x 0.0185 x 0.055 = 0.000000232
Wow! Kecil sekali peluangnya pesan tersebut adalah pesan Normal.
Tapi kita akan tetap mencoba untuk menghitung peluang pesan tersebut adalah pesan Spam.
p(S|”Donation Donation Donation Hangout”) = p(S) x p(Donation|Spam) x p(Donation|Spam) x p(Donation|Spam) x p(Hangout|Spam) = 0.333 x 0.75 x 0.75 x 0.75 x 0 = 0
Karena 0.000000232 > 0, maka algoritma mengklasifikasikan pesan tersebut adalah pesan Normal, lho?
Perhatikan bahwa walaupun pesan tersebut adalah Spam, namun p(Hangout|Spam) = 0. Berapapun besar p(Donation|Spam), namun selama ada kata “Hangout” dalam pesan maka pesan tersebut tidak bisa diklasifikasikan sebagai Spam? Lantas bagaimana menangani masalah ini?
Kita bisa menambahkan 1 event kedalam setiap event kemunculan kata sehingga tidak akan ada kata yang kemunculannya 0, yang ada hanyalah ‘sangat sedikit’. Selain 1, kita juga bisa menambahnya dengan angka berapapun, sesuai kasus kita. Nilai ini biasa disebut alpha (α), dalam kasus ini, kita akan gunakan α=1. Sehingga likelihood-nya menjadi seperti ini.
Pesan Normal
p(Dear|Normal) : (20+1)/(54+1) = 0.381
p(Good|Normal) : (15+1)/(54+1) = 0.291
p(Donation|Normal) : (1+1)/(54+1) = 0.036
p(Love|Normal) : (15+1)/(54+1) = 0.291
p(Hangout|Normal) : (3+1)/(54+1) = 0.0727
Pesan Spam
p(Dear|Spam): (2+1)/(20+1) = 0.143
p(Good|Spam): (2+1)/(20+1) =0.143
p(Donation|Spam): (15+1)/(20+1) = 0.762
p(Love|Spam): (1+1)/(20+1) = 0.095
p(Hangout|Spam) : (0+1)/(20+1) = 0.0476
Kemudian kita hitung lagi dengan event yang sudah ditambahkan.
p(N|”Donation Donation Donation Hangout”) = p(N) x p(Donation|Normal) x p(Donation|Normal) x p(Donation|Normal) x p(Hangout|Normal) = 0.667 x 0.036 x 0.036 x 0.036 x 0.0727 = 0.00000226
p(S|”Donation Donation Donation Hangout”) = p(S) x p(Donation|Spam) x p(Donation|Spam) x p(Donation|Spam) x p(Hangout|Spam) = 0.333 x 0.762 x 0.762 x 0.762 x 0.0476 = 0.007
Karena 0.00000226 < 0.007 maka pesan “Donation Donation Donation Hangout” diklasifikasikan sebagai pesan Spam, sesuai dengan perkiraan kita.
Yup, cuma kaya gitu, mudah bukan? bukan!
Sedikit tambahan informasi, seperti yang kita lihat, bahwa algoritma Naive Bayes tidak memperhitungkan susunan kata, hanya melihat jumlah kejadian pada setiap kata saja. Tentu kita tau kalau “Dear Love” dengan “Love Dear” jelas berbeda maknanya. Sehingga inilah yang menyebabkan Naive Bayes “Naive”, dan memiliki bias yang tinggi. Namun bagaimanapun juga, Naive Bayes secara mengejutkan menghasilkan performa yang bagus dalam mengklasifikasikan pesan Normal dan Spam. Dan juga, algoritma Naive Bayes tidak membutuhkan time processing yang lama, sehingga sangat cocok untuk pengklasifikasian pesan yang membutuhkan keputusan real time.
Terimakasih, semoga membantu teman-teman.
Referensi
- https://www.youtube.com/watch?v=O2L2Uv9pdDA
- https://binus.ac.id/bandung/2019/12/algoritma-naive-bayes/
nb: jika tidak keberatan bisa follow medium saya biar banyak aja dan bisa dapet adsense.