Pada percobaan ini kita akan menggunakan data dummy (sintentis) untuk membuat sebuah model Naive Bayes. Untuk membuat data dummy, kita dapat menggunakan fungsi make_classification dari library scikit-learn. Selanjutnya, kita akan membuat model Multinomial Naive Bayes dengan menggunakan MultinomialNB dan model Gaussian Naive Bayes menggunakan GaussianNB.
Mendefiniskan Data Dummy
import numpy as np
from sklearn.datasets import make_classification
# Membuat data dummy
# Hasil dari make_classification berupa data fitur X dan label y
# Label y akan berupa data yang sudah di encode (angka)
X,y = make_classification(n_samples=30, n_features=2, n_classes=2, n_informative=2, n_redundant=0, n_repeated=0, shuffle=False)
# Secara defalt, make_classfication menghasilkan nilai float
# Kita perlu merubah dalam bentuk diskrit
# Absolutekan nilai
X = np.absolute(X)
# Bulatkan nilai ke 2 angka dibelakang koma
# Kalikan dengan 100 supaya tidak ada lagi koma
X = np.round(X, 2) * 100
# Ubah ke dalam bentuk integer
X = X.astype(int)
print(X)
print(y)
Parameter yang digunakan pada fungsi make_classification adalah,
n_samples: jumlah sampel yang diinginkan
n_features: jumlah fitur yang digunakan
n_classes: jumlah kelas
n_informative: jumlah fitur yang memiliki korelasi dengan kelas
n_redundant: jumlah fitur yang tidak memiliki korelasi dengan kelas
n_repeated: jumlah fitur yang diulang
(Opsional) Membuat Data Frame
Agar data lebih mudah untuk dibaca, maka kita akan membuat DataFrame dengan menggunakan library Pandas berdasarkan data dummy yang telah dibuat sebelumnya
import pandas as pd
# Reshape label y menjadi 2D
# Hal ini dilakukan karena kita akan menggabungkannya dengan data fitur X
y_new = y.reshape(len(y), 1)
# Gabungkan fitur X dan label y dalam data array
data = np.concatenate((X, y_new), axis=1)
# Definisikan nama kolom
nama_kolom = ['Fitur 1', 'Fitur 2', 'Label']
# Buat Data Frame
df = pd.DataFrame(data, columns=nama_kolom)
# Cek Data Frame
df.head()
Fitur 1
Fitur 2
Label
0
142
15
0
1
67
139
0
2
152
114
0
3
108
51
0
4
145
55
0
Dikarenakan label masih berbetuk encoding angka, untuk mempermudah pembacaan data, kita dapat mengubah bentuknya dalam bentuk kategorial
# Definisikan nama label
labels = {
1 : 'Kelas A',
0 : 'Kelas B'
}
# Copy Data Frame untuk menyimpan Data Frame baru
# dengan label yang mudah untuk dibaca
df_label = df.copy()
# Ubah label dengan fungsi mapping dari Pandas
# pada Data Frame df_label
df_label['Label'] = df_label['Label'].map(labels)
# Cek Data Frame df_label
df_label.head()
Fitur 1
Fitur 2
Label
0
142
15
Kelas B
1
67
139
Kelas B
2
152
114
Kelas B
3
108
51
Kelas B
4
145
55
Kelas B
(Opsional) Visualisasi Data
import matplotlib.pyplot as plt
# Definisikan warna untuk setiap kelas
colors = {
'class_a': 'MediumVioletRed',
'class_b': 'Navy'
}
# Kelompokkan label berdasarkan nama kelas
gb = df_label.groupby(['Label'])
class_a = gb.get_group('Kelas A')
class_b = gb.get_group('Kelas B')
# Plot
plt.scatter(x=class_a['Fitur 1'], y=class_a['Fitur 2'], c=colors['class_a'])
plt.scatter(x=class_b['Fitur 1'], y=class_b['Fitur 2'], c=colors['class_b'])
plt.xlabel('Fitur 1')
plt.ylabel('Fitur 2')
plt.legend(['Kelas A', 'Kelas B'])
plt.gca().axes.xaxis.set_ticklabels([])
plt.gca().axes.yaxis.set_ticklabels([])
plt.show()
Klasifikasi Multinomial Naive Bayes
from sklearn.naive_bayes import MultinomialNB # class untuk model MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score # evaluasi model berdasarkan akurasi
# Inisiasi obyek MultinomialNB
mnb = MultinomialNB()
# Kita dapat langsung menggunakan fitur X dan label y
# hasil dari proses pembuatan data dummy
# Split data training dan testing
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3, random_state=30)
# Fit model
# Label y harus dalam bentuk 1D atau (n_samples,)
mnb.fit(X_train, y_train)
# Prediksi dengan data training
y_train_pred = mnb.predict(X_train)
# Evaluasi akurasi training
acc_train = accuracy_score(y_train, y_train_pred)
# Prediksi test data
y_test_pred = mnb.predict(X_test)
# Evaluasi model dengan metric akurasi
acc_test = accuracy_score(y_test, y_test_pred)
# Print hasil evaluasi
print(f'Hasil akurasi data train: {acc_train}')
print(f'Hasil akurasi data test: {acc_test}')
Hasil akurasi data train: 0.6190476190476191
Hasil akurasi data test: 0.7777777777777778
Klasifikasi Gaussian Naive Bayes
from sklearn.naive_bayes import GaussianNB # class untuk model GaussianNB
# Inisiasi obyek Gaussian
gnb = GaussianNB()
# Kita menggunakan split data training dan testing
# yang sama dengan model multinomial
# Fit model
# Label y harus dalam bentu 1D atau (n_samples,)
gnb.fit(X_train, y_train)
# Prediksi dengan data training
y_train_pred_gnb = gnb.predict(X_train)
# Evaluasi akurasi training
acc_train_gnb = accuracy_score(y_train, y_train_pred_gnb)
# Prediksi test data
y_test_pred_gnb = gnb.predict(X_test)
# Evaluasi model dengan metric akurasi
acc_test_gnb = accuracy_score(y_test, y_test_pred_gnb)
# Print hasil evaluasi
print(f'Hasil akurasi data train (Gaussian): {acc_train_gnb}')
print(f'Hasil akurasi data test (Gaussian): {acc_test_gnb}')
Hasil akurasi data train (Gaussian): 0.6666666666666666
Hasil akurasi data test (Gaussian): 0.5555555555555556