> For the complete documentation index, see [llms.txt](https://polinema.gitbook.io/jti-modul-praktikum-pembelajaran-mesin/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://polinema.gitbook.io/jti-modul-praktikum-pembelajaran-mesin/klasifikasi/job-sheet-4-klasifikasi/praktikum-3.md).

# Praktikum 3

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 <a href="#mendefiniskan-data-dummy" id="mendefiniskan-data-dummy"></a>

```
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)
```

```
[[142  15]
 [ 67 139]
 [152 114]
 [108  51]
 [145  55]
 [114  16]
 [163  60]
 [ 32 210]
 [100 104]
 [131  55]
 [ 42 146]
 [ 78 120]
 [104  80]
 [153  66]
 [ 19 169]
 [ 17 163]
 [ 81  42]
 [111 111]
 [ 87  24]
 [ 92 114]
 [ 10  55]
 [112 167]
 [200 104]
 [ 75 135]
 [ 98 110]
 [ 27 101]
 [152  73]
 [ 78 112]
 [ 92 124]
 [ 86 119]]
[0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1]
```

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 <a href="#opsional-membuat-data-frame" id="opsional-membuat-data-frame"></a>

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 <a href="#opsional-visualisasi-data" id="opsional-visualisasi-data"></a>

```
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()
```

![](/files/91s1ItbZxybSRmMKw3XW)

### Klasifikasi Multinomial Naive Bayes <a href="#klasifikasi-multinomial-naive-bayes" id="klasifikasi-multinomial-naive-bayes"></a>

```
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 <a href="#klasifikasi-gaussian-naive-bayes" id="klasifikasi-gaussian-naive-bayes"></a>

```
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
```
