# untuk persiapan data
library(dplyr)
library(rsample)

# untuk keperluan machine learning
library(e1071)

Classification Machine Learning 2

Pada materi kali ini kita akan membahas Algoritma lainnya yang bisa digunakan untuk keperluan Klasifikasi. Pendekatan Algoritma yang akan kita bahas, harapannya dapat menghasilkan prediksi yang lebih akurat dan melengkapi kita semua dengan berbagai macam variasi permodelan untuk kasus-kasus lainnya.

Naive Bayes

Pada material Klasifikasi sebelumnya, kita sudah mengetahui bahwa metode Klasifikasi memanfaatkan konsep probability dalam menentukan sebuah data masuk ke kelas yang mana.

Pada konsep Algoritma Naive Bayes juga memanfaatkan Teorema Bayes, dengan teori tersebut bisa dibilang juga memanfaatkan konsep probability, akan tetapi yang menjadi pembedanya adalah konsep matematika di belakangnya.

Naive Bayes di R

Tidak semua menyukai matematika, tapi matematika nantinya bisa membantu kita sedikit banyak untuk lebih memahami konsep Algoritma yang digunakan. Maka dari itu, hal pertama yang akan kita bahas adalah bagaimana menggunakan Naive Bayes di R terlebih dahulu.

Contoh Study Case: Customer Behaviour

Agar lebih memahami bagaimana Naive Bayes bekerja, kita akan menggunakan kasus customer behavior. Peluang customer untuk membeli produk akan dihitung berdasarkan karakteristik pada nasabah.

customer <- read.csv("data_input/customer_behaviour.csv", 
                     stringsAsFactors = T)

glimpse(customer)
## Rows: 400
## Columns: 4
## $ Gender    <fct> Male, Male, Female, Female, Male, Male, Female, Female, Male…
## $ Age       <fct> < 30, 30-50, < 30, < 30, < 30, < 30, < 30, 30-50, < 30, 30-5…
## $ Salary    <fct> Low, Low, Medium, Medium, Medium, Medium, Medium, High, Low,…
## $ Purchased <fct> No, No, No, No, No, No, No, Yes, No, No, No, No, No, No, No,…

🗒️Deskripsi Data

  • Gender: jenis kelamin (Male, Female).
  • Age: range usia (< 30, 30-50, > 50).
  • Salary: kategori gaji customer (Low, Medium, High).
  • Purchased: apakah customer membeli produk atau tidak (Yes, No).

Fungsi Algoritma Naive Bayes

Kita dapat membuat model Naive Bayes menggunakan fungsi naiveBayes() dari pacakge e1071.

Menggunakan argumen naiveBayes(formula, data)

  • formula: y ~ x,
    • y: target variabel
    • x: prediktor variabel
  • data: data yang digunakan untuk target dan prediktor variabel

1 Prediktor: Gender

Melanjutkan contoh yang sebelumnya, mari kita gunakan gender sebagai prediktor, untuk menjawab pertanyaan Berapa peluang seorang membeli barang bila diketahui ia seorang Pria?

# Membuat model dengan 1 prediktor
nb_gender <- naiveBayes(formula = Purchased ~ Gender,
                        data = customer)

# output model 1 prediktor
nb_gender
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##     No    Yes 
## 0.6425 0.3575 
## 
## Conditional probabilities:
##      Gender
## Y        Female      Male
##   No  0.4941634 0.5058366
##   Yes 0.5384615 0.4615385

Jika pada model regresi logistik kita mendapatkan nilai koefisien setiap variabel, maka pada model naive bayes kita akan mendapatkan dua elemen:

  • A-priori Probabilities

Output ini menunjukkan peluang setiap kelas tanpa adanya prediktor.

[OPTIONAL] Math Behind

Metode perhitungannya hanya menghitung peluang customer membeli atau tidak berdasarkan jumlah kemunculannya tanpa mempertimbangkan informasi lainnya. Berikut cara perhitungan manualnya:

# 1. Tunjukan jumlah kemunculan untuk masing-masing target
table(customer$Purchased)
## 
##  No Yes 
## 257 143
# 2. Menghitung peluang membeli = yes
143 / (143 + 257)
## [1] 0.3575
# 2. Menghitung peluang membeli = no
257 / (143 + 257)
## [1] 0.6425
Dari hasil perhitungan di atas kita dapat menarik kesimpulan seperti ini:

Peluang seseorang membeli barang tanpa mengetahui kondisi lainnya sebesar … %

Peluang seseorang tidak membeli barang tanpa mengetahui kondisi lainnya sebesar … %

Pada contoh di atas, sering juga disebut dengan metode menghitung Prior Probability.

  • Conditional Probabilities

Output ini menunjukkan peluang prediktor jika diketahui variabel targetnya. + Peluang(Gender = Male | Purchased = Yes) = 0.4615385 + Peluang(Gender = Male | Purchased = No) = 0.5058366

[OPTIONAL] Math Behind

Konsep perhitungan yang digunakan adalah Dependent Event, atau konsep perhitungan peluang ketika diketahui kondisi-kondisi lainnya.

Contoh sederhana:

Peluang karyawan pulang menggunakan Taxi dibandingkan menggunakan Ojek Jika Diketahui cuaca mendung pada sore hari.

Peluang seseorang membeli produk Jika Diketahui kategori gajinya.
# Tabel P(gender = Male | Purchased = Yes)
table(customer$Purchased, customer$Gender)
##      
##       Female Male
##   No     127  130
##   Yes     77   66
# Menghitung P(gender = Male | Purchased = Yes)
66 / (66 + 77)
## [1] 0.4615385

Predict

Question: Berapa peluang seorang membeli barang bila diketahui ia seorang Pria?

P(Purchased = Yes | Gender = Male)

Menggunakan fungsi predict(object = ..., newdata = ..., type = ...)

Parameter type:

  • type = "raw" mengembalikan nilai peluang untuk masing-masing kelas
  • type = "class" mengembalikan label kelasnya (default threshold 0.5)
predict(object = nb_gender,
        newdata = data.frame(Gender = "Male"),
        type = "class")
## [1] No
## Levels: No Yes
predict(object = nb_gender,
        newdata = data.frame(Gender = "Male"),
        type = "raw")
##             No       Yes
## [1,] 0.6632653 0.3367347

[OPTIONAL] Math Behind

Untuk melakukan perhitungannya kita akan menggunakan rumus ini (Rumus Bayes Theorem).

\[P(A|B) = \frac{P(B|A) P(A)}{P(B)}\] Keterangan

~ \(P(A|B)\) = Peluang terjadi A jika diketahui B telah terjadi (posterior probability)
\(P(B|A)\): peluang kejadian B diketahui kejadian A
\(P(A)\) = Peluang terjadi A tanpa informasi tambahan apapun (prior probability)
\(P(B)\): peluang kejadian B
Catatan

Kejadian A sering disebut sebagai hypothesis (target variable)

Kejadian B sering disebut sebagai evidence/observation (predictor variable)

Penerapan

\[P(Purchased = Yes | Gender = Male) = \frac{P(Gender = Male|Purchased = Yes) P(Purchased = Yes)}{P(Gender = Male)}\]

# 1.1 Tabel P(Purchased = Yes)
table(customer$Purchased)
## 
##  No Yes 
## 257 143
# 1.2 Menghitung P(Purchased = Yes)
p_yes <- 143 / (143 + 257)
p_yes
## [1] 0.3575
# 2.1 Tabel P(Gender = Male)
table(customer$Gender)
## 
## Female   Male 
##    204    196
# 2.2 Menghitung P(Gender = Male)
p_male <- 196 / (196+204)
p_male
## [1] 0.49
# 3.1 Tabel P(gender = Male | Purchased = Yes)
table(customer$Purchased, customer$Gender)
##      
##       Female Male
##   No     127  130
##   Yes     77   66
# 3.2 Menghitung P(gender = Male | Purchased = Yes)
p_male_yes <- 66 / (66 + 77)
p_male_yes
## [1] 0.4615385
# 4. Hitung P(Purchased = Yes | Gender = Male)
p_yes_male <- (p_male_yes * p_yes) / p_male

p_yes_male
## [1] 0.3367347

Karakter Naive Bayes

  • Naive Bayes melakukan klasifikasi berdasarkan peluang dependent antara prediktor dengan target variable (Bayes’ Theorem).

  • Asumsi Naive Bayes:

    • Antar prediktor saling independent
    • Antar prediktor memiliki bobot yang sama
      • dear friend = friend dear
  • Kelebihan:

    • Waktu komputasi relatif lebih cepat dibanding model klasifikasi lain, karena hanya mengkomputasi proporsi tabel frekuensi.
    • Maka dari itu, sering digunakan sebagai baseline model, yaitu model sederhana (acuan) yang nantinya dibandingkan dengan model yang lebih kompleks
  • Kekurangan: sangat terpengaruh oleh data yang memiliki skewness pada frekuensi data

Menghadapai Kekurangan NB Dengan Laplace Smothing

Pada kasus tertentu, dapat terjadi scarcity (kelangkaan), yaitu kondisi dimana suatu prediktor tidak hadir sama sekali di salah satu kelas.

Misalkan pada data Customer_Behaviour sebelumnya, terdapat kondisi dimana tidak ada customer Male yang melakukan Purchased. Sehingga tabel frekuensinya menjadi seperti ini.

new_table <- matrix(c(130, 143, 127, 0), nrow = 2, dimnames = list(c("Female", "Male"), c("No", "Yes")))

new_table
##         No Yes
## Female 130 127
## Male   143   0
new_table %>% prop.table(margin = 2)
##               No Yes
## Female 0.4761905   1
## Male   0.5238095   0

Dari tabel di atas, kita peroleh: \(P(Male\ |\ Purchase) = 0\). Jika Irfan adalah seorang Pria, berapakah peluang Irfan untuk Purchased?

\[P(Purchased|Male) = \frac{P(Male|Purchased) P(Purchased)}{P(Male)}=\frac{0 * P(Purchased)}{P(Male)} = 0\]

Untuk menghadapinya, kita bisa menggunakan konsep Laplace Smoothing.

# Menambahkan nilai 1 untuk setiap nilai
new_table_lp <- matrix(c(130, 143, 127, 0) + 1, 
                       nrow = 2, 
                       dimnames = list(c("Female", "Male"), c("No", "Yes")))

new_table_lp
##         No Yes
## Female 131 128
## Male   144   1
new_table_lp %>% prop.table(margin = 2)
##               No         Yes
## Female 0.4763636 0.992248062
## Male   0.5236364 0.007751938

Setelah ditambahkan laplace smooting = 1, maka P(Male|Purchased) bukan lagi 0 dan peluang/proporsi dari variabel lainnya tidak berubah jauh dari proporsi/peluang sebelumnya.

Bagaimana penerapannya pada code di R? Dengan menggunakan function naiveBayes(), kita cukup menambahkan parameter laplace = 1:

# train
nb_all_lp <- naiveBayes(formula = Purchased ~ . , 
                        data = customer, 
                        laplace = 1)

# New Data
new_cust <- data.frame(Gender = "Female",
                       Age = "< 30",
                       Salary = "Medium")

# predict
predict(nb_all_lp, newdata = new_cust, type = "raw")
##             No        Yes
## [1,] 0.9840288 0.01597116