Pada percobaan ini, kita akan menggunakan nilai multinomial untuk melakukan klasifikasi dengan Naive Bayes. Nilai multinomial adalah data yang nilainya didapatkan dari proses menghitung. Sehingga, pada konteks fitur, nilai multinomial fitur berdasarkan proses perhitungan (counting) probabilitas kemunculan fitur tersebut dalam sebuah data. Contoh klasik fitur multinomial adalah perhitungan jumlah kata pada klasifikasi teks.Pada percobaan ini, kasus klasifikasi teks diberikan untuk mempermudah pemahaman terhadap algoritma Naive Bayes tipe Multinomial.
Kita akan menggunakan data spam.csv yang berisi data teks sms dengan label spam dan ham. Spam adalah sms sampah, sedangkan ham adalah sebaliknya
Load Data
Pada tahap ini kita akan loading data ke dalam data frame dan melakukan inspeksi sederhana untuk memastikan apakah kita perlu proses pra pengolahan data sebelum melakukan ekstraksi fitur dan permodelan
import numpy as np
import pandas as pd
df = pd.read_csv('spam.csv', encoding='latin-1') # spesifiksi encoding diperlukan karena data tidak menggunakan UTF-8
df.head()
v1
v2
Unnamed: 2
Unnamed: 3
Unnamed: 4
0
ham
Go until jurong point, crazy.. Available only ...
NaN
NaN
NaN
1
ham
Ok lar... Joking wif u oni...
NaN
NaN
NaN
2
spam
Free entry in 2 a wkly comp to win FA Cup fina...
NaN
NaN
NaN
3
ham
U dun say so early hor... U c already then say...
NaN
NaN
NaN
4
ham
Nah I don't think he goes to usf, he lives aro...
NaN
NaN
NaN
Terdapat 3 kolom yang tidak bermanfaat untuk proses selanjutnya, maka kita perlu membuang kolom tersebut. Selain itu, untuk memudahkan pembacaan data, kita juga akan mengubah nama kolom v1 yang berupa label dan v2 yang berupa teks sms
Pra Pengolahan Data
Beberapa hal yang akan dilakukan pada tahap ini yaitu,
Drop kolom yang tidak digunakan
Ubah nama kolom v1 (label) dan v2 (teks sms)
Inspeksi Data
Encode label
Memisahkan fitur dengan label
Drop Kolom
# Drop 3 kolom terakhir dengan fungsi iloc
df = df.drop(df.iloc[:,2:], axis=1)
# Cek data
df.head()
v1
v2
0
ham
Go until jurong point, crazy.. Available only ...
1
ham
Ok lar... Joking wif u oni...
2
spam
Free entry in 2 a wkly comp to win FA Cup fina...
3
ham
U dun say so early hor... U c already then say...
4
ham
Nah I don't think he goes to usf, he lives aro...
Ubah Nama Kolom V1 dan V2
# Data untuk rename kolom v1 dan v2
new_cols = {
'v1': 'Labels',
'v2': 'SMS'
}
# Rename nama kolom v1 dan v2
df = df.rename(columns=new_cols)
# cek data
df.head()
Labels
SMS
0
ham
Go until jurong point, crazy.. Available only ...
1
ham
Ok lar... Joking wif u oni...
2
spam
Free entry in 2 a wkly comp to win FA Cup fina...
3
ham
U dun say so early hor... U c already then say...
4
ham
Nah I don't think he goes to usf, he lives aro...
Inspeksi Data
# Cek Jumlah Data Per Kelas
print(df['Labels'].value_counts())
print('\n')
# Cek Kelengkapan Data
print(df.info())
print('\n')
# Cek Statistik Deskriptif
print(df.describe())
# Data untuk label
new_labels = {
'spam': 1,
'ham': 0
}
# Encode label
df['Labels'] = df['Labels'].map(new_labels)
# Cek data
df.head()
Labels
SMS
0
0
Go until jurong point, crazy.. Available only ...
1
0
Ok lar... Joking wif u oni...
2
1
Free entry in 2 a wkly comp to win FA Cup fina...
3
0
U dun say so early hor... U c already then say...
4
0
Nah I don't think he goes to usf, he lives aro...
Memisahkan Fitur dengan Label
X = df['SMS'].values
y = df['Labels'].values
Ekstraksi fitur
Ekstraksi fitur untuk setiap SMS akan menggunakan konsep Bag of Words. Kita dapat menggunakan fungsi CountVectorizer dari scikit-learn. Akan tetapi untuk mencegah leaking information kita akan melakukan split data terlebih dahulu, baru melakukan transformasi terhadap data training dan testing.
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
# Split data training dan testing
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=50)
# Inisiasi CountVectorizer
bow = CountVectorizer()
# Fitting dan transform X_train dengan CountVectorizer
X_train = bow.fit_transform(X_train)
# Transform X_test
# Mengapa hanya transform? Alasan yang sama dengan kasus pada percobaan ke-3
# Kita tidak menginginkan model mengetahui paramter yang digunakan oleh CountVectorizer untuk fitting data X_train
# Sehingga, data testing dapat tetap menjadi data yang asing bagi model nantinya
X_test = bow.transform(X_test)
Kita akan menggunakan algoritma Multinomial Naive Bayes. Fungsi MultinomialNB dari scikit-learn dapat digunakan pada kasus ini.
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# Inisiasi MultinomialNB
mnb = MultinomialNB()
# Fit model
mnb.fit(X_train, y_train)
# Prediksi dengan data training
y_pred_train = mnb.predict(X_train)
# Evaluasi akurasi data training
acc_train = accuracy_score(y_train, y_pred_train)
# Prediksi dengan data training
y_pred_test = mnb.predict(X_test)
# Evaluasi akurasi data training
acc_test = accuracy_score(y_test, y_pred_test)
# Print hasil evaluasi
print(f'Hasil akurasi data train: {acc_train}')
print(f'Hasil akurasi data test: {acc_test}')
Hasil akurasi data train: 0.9946152120260264
Hasil akurasi data test: 0.9775784753363229