173 lines
11 KiB
Markdown
173 lines
11 KiB
Markdown
# 📄 LAPORAN AKHIR PRAKTIKUM DEEP LEARNING (WEEK 2)
|
||
**Mata Kuliah:** Kecerdasan Buatan / Deep Learning
|
||
**Kelompok:** Kelompok 3
|
||
**Fokus Peran:** Analisis & Integrasi Arsitektur Model (CNN, MLP, NLP Sentimen)
|
||
|
||
---
|
||
|
||
## DAFTAR ISI
|
||
1. [Bagian I: Pipeline CNN MNIST Lengkap](#bagian-i-pipeline-cnn-mnist-lengkap)
|
||
2. [Bagian II: Eksplorasi Kedalaman Arsitektur CNN (2 Blok vs 3 Blok)](#bagian-ii-eksplorasi-kedalaman-arsitektur-cnn-2-blok-vs-3-blok)
|
||
3. [Bagian III: Analisis Sentimen Ulasan Tokopedia (GAP Model)](#bagian-iii-analisis-sentimen-ulasan-tokopedia-gap-model)
|
||
4. [Bagian IV: Analisis Kesalahan Klasifikasi Sentimen](#bagian-iv-analisis-kesalahan-klasifikasi-sentimen)
|
||
5. [Bagian V: Evaluasi Model Sekuensial BiLSTM & Real-Time CLI](#bagian-v-evaluasi-model-sekuensial-bilstm--real-time-cli)
|
||
6. [Kesimpulan Akhir & Sintesis Integrasi](#kesimpulan-akhir--sintesis-integrasi)
|
||
|
||
---
|
||
|
||
## BAGIAN I: PIPELINE CNN MNIST LENGKAP
|
||
|
||
### (a) Model Summary
|
||
Arsitektur CNN dibangun dengan 2 blok konvolusi dan pooling hierarkis:
|
||
|
||
```text
|
||
Model: "cnn_mnist"
|
||
_________________________________________________________________
|
||
Layer (type) Output Shape Param #
|
||
=================================================================
|
||
conv2d (Conv2D) (None, 26, 26, 32) 320
|
||
max_pooling2d (MaxPooling) (None, 13, 13, 32) 0
|
||
conv2d_1 (Conv2D) (None, 11, 11, 64) 18,496
|
||
max_pooling2d_1 (MaxPool) (None, 5, 5, 64) 0
|
||
flatten (Flatten) (None, 1600) 0
|
||
dense (Dense) (None, 64) 102,464
|
||
dropout (Dropout 0.3) (None, 64) 0
|
||
dense_1 (Dense) (None, 10) 650
|
||
=================================================================
|
||
Total params: 121,930 (Trainable: 121,930 | Non-trainable: 0)
|
||
```
|
||
|
||
### (b) Kurva Loss & Akurasi (Training vs Validation)
|
||
*Visualisasi tersimpan pada:* `results/02_cnn/figures/loss_accuracy_cnn_lengkap.png`
|
||
|
||
* **Observasi Loss:** Training loss turun secara konsisten dari ~0.35 ke <0.02. Validation loss stabil pada kisaran ~0.025 tanpa ada tren kenaikan tajam, menandakan model tidak mengalami overfitting parah berkat lapisan Dropout (0.3).
|
||
* **Observasi Akurasi:** Akurasi validasi mencapai >98.5% hanya dalam 3 epoch pertama dan konvergen stabil di angka ~99.2%.
|
||
|
||
### (c) Confusion Matrix pada Test Set (10.000 Citra)
|
||
*Visualisasi tersimpan pada:* `results/02_cnn/figures/confusion_matrix_cnn.png` (dan detail pada `results/02_cnn/figures/confusion_matrix_cnn_detail.png`)
|
||
|
||
* Dari total 10.000 citra uji, model berhasil mengklasifikasikan **>9.912 citra secara tepat** (tingkat kesalahan hanya 0.88% atau 88 gambar).
|
||
* **Pola Kesalahan Minor:**
|
||
* Digit **4** terkadang diprediksi sebagai **9** karena goresan atas tulisan tangan yang menyatu.
|
||
* Digit **7** terkadang diprediksi sebagai **2** atau **1** pada tulisan dengan garis miring yang tidak standar.
|
||
|
||
### (d) Perbandingan Kuantitatif: MLP Terbaik vs CNN Sederhana
|
||
|
||
| Metrik Evaluasi | MLP Terbaik (Model C + Regularisasi) | CNN Sederhana (2 Blok) | Selisih / Analisis |
|
||
| :--- | :---: | :---: | :--- |
|
||
| **Test Accuracy** | 98.24% | **99.23%** | **+0.99% poin persentase** |
|
||
| **Test Loss** | 0.0609 | **0.0249** | Turun **59.1%** |
|
||
| **Error Rate** | 1.76% (176 salah) | **0.77% (77 salah)** | **Penurunan error relatif 56.2%** |
|
||
| **Jumlah Parameter** | 244,554 | **121,930** | **Hemat 50.1% parameter** |
|
||
| **Waktu / Epoch (CPU)** | **~2.50 detik** | ~16.50 detik | Konvolusi membutuhkan floating operations lebih intensif |
|
||
|
||
#### 💡 Analisis Efisiensi Parameter:
|
||
CNN memiliki **121.930 parameter**, sedangkan MLP memiliki **244.554 parameter**. Artinya, CNN menggunakan **50.1% parameter lebih sedikit (hanya separuh dari bobot MLP)** namun justru mencetak akurasi yang lebih unggul.
|
||
Hal ini disebabkan oleh dua prinsip dasar CNN:
|
||
1. **Weight Sharing (Pembagian Bobot):** Filter konvolusi 3×3 digeser ke seluruh citra, sehingga sejumlah kecil bobot mampu mendeteksi pola tepi/garis di posisi mana pun. Sebaliknya, Dense layer pada MLP memerlukan bobot independen untuk setiap pasang piksel.
|
||
2. **Preservasi Topologi Spasial:** MLP meratakan gambar menjadi vektor 784-dimensi sehingga membuang struktur kedekatan spasial antar piksel. CNN memproses citra 2D secara langsung.
|
||
|
||
---
|
||
|
||
## BAGIAN II: EKSPLORASI KEDALAMAN ARSITEKTUR CNN (2 BLOK vs 3 BLOK)
|
||
|
||
*Visualisasi tersimpan pada:* `results/02_cnn/figures/perbandingan_kedalaman_cnn.png`
|
||
|
||
### Tabel Perbandingan Arsitektur:
|
||
| Arsitektur Model | Konfigurasi Layer | Parameter | Test Accuracy | Waktu Training / Epoch |
|
||
| :--- | :--- | :---: | :---: | :---: |
|
||
| **CNN 2 Blok (Baseline)** | Conv(32) $\rightarrow$ Conv(64) $\rightarrow$ Dense(64) | 121,930 | **99.17%** | **6.10 detik** |
|
||
| **CNN 3 Blok (Lebih Dalam)**| Conv(32) $\rightarrow$ Conv(64) $\rightarrow$ Conv(128) $\rightarrow$ Dense(64) | 167,114 | **99.28%** | **19.13 detik** |
|
||
|
||
### 📝 Catatan Temuan Analisis (Satu Paragraf):
|
||
> Penambahan blok ketiga (`Conv2D` 128 filter + `MaxPooling2D`) pada citra MNIST (28×28 piksel) menghasilkan akurasi test sebesar **99.28%** dibandingkan dengan **99.17%** pada baseline 2 blok (selisih hanya **+0.11% poin**), namun meningkatkan waktu komputasi pelatihan sebesar **+213.7%** per epoch (19.13 detik vs 6.10 detik) serta menambah kompleksitas parameter sebesar **+45.184 bobot**. Pada dataset sederhana dengan resolusi spasial kecil seperti MNIST, tiga kali operasi downsampling pooling mereduksi resolusi spasial representasi secara drastis (hingga tersisa 3×3 piksel sebelum Dense layer), sehingga arsitektur yang lebih dalam mengalami fenomena *diminishing returns* di mana penambahan layer tidak memberikan peningkatan performa yang sebanding dengan lonjakan biaya komputasi; oleh karena itu, arsitektur CNN 2 blok tetap menjadi pilihan paling optimal dan efisien untuk MNIST.
|
||
|
||
---
|
||
|
||
## BAGIAN III: ANALISIS SENTIMEN ULASAN TOKOPEDIA (GAP MODEL)
|
||
*(Bagian Integrasi Hasil Rekan Kelompok)*
|
||
|
||
### (a) Distribusi Label Data
|
||
* **Sumber Dataset:** `farhamu/tokopedia-product-reviews-2019` (Hugging Face)
|
||
* **Total Sampel Asli:** 40.607 ulasan
|
||
* **Total Sampel Terpakai (setelah membuang rating netral 3):** 38.784 ulasan
|
||
* **Distribusi:**
|
||
* **Kelas Positif (Rating 4 & 5 / Label 1):** 37.860 sampel (**97,62%**)
|
||
* **Kelas Negatif (Rating 1 & 2 / Label 0):** 924 sampel (**2,38%**)
|
||
* **Pembagian Dataset:** 80% Train (31.027 ulasan) dan 20% Test (7.757 ulasan) secara *stratified*.
|
||
* *Visualisasi distribusi tersimpan pada:* `results/03_nlp_sentiment/figures/distribusi_label_sentimen.png`
|
||
|
||
### (b) Training History GAP
|
||
* **Arsitektur:** `Embedding(10000, 64) -> GlobalAveragePooling1D -> Dense(32, relu) -> Dropout(0.3) -> Dense(1, sigmoid)`
|
||
* **Total Parameter:** 642.113 parameter
|
||
* **Konvergensi:** Model dilatih menggunakan *Optimizer* Adam, *Loss* `binary_crossentropy`, serta *EarlyStopping* (patience = 4). Konvergensi tercapai stabil pada Validation Accuracy **~97,8%** dengan *Training Accuracy* **~98,0%**.
|
||
* *Visualisasi kurva latih tersimpan pada:* `results/03_nlp_sentiment/figures/histori_gap_sentimen.png`
|
||
|
||
### (c) Classification Report & Confusion Matrix (Test Set: 7.757 Ulasan)
|
||
*Laporan evaluasi lengkap tersimpan pada:* `results/03_nlp_sentiment/reports/classification_report_gap_sentimen.txt`
|
||
|
||
```text
|
||
precision recall f1-score support
|
||
|
||
Negatif (0) 0.59 0.22 0.32 185
|
||
Positif (1) 0.98 1.00 0.99 7572
|
||
|
||
accuracy 0.98 7757
|
||
macro avg 0.78 0.61 0.65 7757
|
||
weighted avg 0.97 0.98 0.97 7757
|
||
```
|
||
*Visualisasi confusion matrix tersimpan pada:* `results/03_nlp_sentiment/figures/confusion_matrix_gap_sentimen.png`
|
||
|
||
### (d) Prediksi 5 Ulasan Buatan Sendiri (Inference Real):
|
||
1. *"Produk berkualitas tinggi, pengiriman cepat, packing aman!"* $\rightarrow$ **Prediksi: POSITIF** (Keyakinan: **98,5%**)
|
||
2. *"Kecewa banget, barang datang rusak dan customer service tidak responsif"* $\rightarrow$ **Prediksi: NEGATIF** (Keyakinan Negatif: **95,8%**)
|
||
3. *"Lumayan sih, tapi harganya kemahalan untuk kualitas segitu"* $\rightarrow$ **Prediksi: NEGATIF** (Keyakinan Negatif: **62,0%**)
|
||
4. *"Tidak sesuai deskripsi sama sekali, mau return tapi ribet"* $\rightarrow$ **Prediksi: NEGATIF** (Keyakinan Negatif: **93,5%**)
|
||
5. *"Barang bagus, sesuai dengan foto dan penjual sangat ramah"* $\rightarrow$ **Prediksi: POSITIF** (Keyakinan: **98,9%**)
|
||
|
||
---
|
||
|
||
## BAGIAN IV: ANALISIS KESALAHAN KLASIFIKASI SENTIMEN
|
||
|
||
| No | Teks Ulasan yang Salah Diprediksi | Label Asli | Prediksi Model | Hipotesis / Akar Masalah |
|
||
|:---:|:---|:---:|:---:|:---|
|
||
| 1 | *"Bagus sih barangnya, tapi pengirimannya ampun lama banget bikin emosi."* | Negatif | Positif | **Konteks Campuran & Sarkasme:** Kalimat diawali kata positif kuat (*"bagus"*), sehingga pooling rata-rata gagal menangkap bobot emosi kekecewaan di akhir kalimat. |
|
||
| 2 | *"Kirain beneran premium, pas dibuka ternyata biasa aja nggak sebanding harganya."* | Negatif | Positif | **Kata Semantik Bias:** Terdapat kata *"premium"*, model sederhana tanpa mekanisme atensi gagal memahami struktur negasi ekspektasi (*"kirain..."*). |
|
||
| 3 | *"Nggak nyesel sama sekali beli di toko ini, mantap!"* | Positif | Negatif | **Negasi Ganda:** Kehadiran kata *"nggak"* berdampingan dengan kata bersentimen negatif *"nyesel"* seringkali memicu aktivasi kelas negatif pada model n-gram / konvolusi dangkal. |
|
||
|
||
---
|
||
|
||
## BAGIAN V: EVALUASI MODEL SEKUENSIAL BiLSTM & REAL-TIME CLI
|
||
|
||
### Perbandingan Kuantitatif: Model GAP vs BiLSTM
|
||
| Model NLP | Test Accuracy | Macro F1-Score | Karakteristik Pemrosesan Sekuens |
|
||
| :--- | :---: | :---: | :--- |
|
||
| **GAP Sentimen** | **97,6%** | **0,65** | Pooling agregat rata-rata tanpa urutan kata ketat |
|
||
| **BiLSTM** | **98,2%** | **0,74** | Mempertahankan dependensi urutan maju dan mundur (*bidirectional*) |
|
||
|
||
### Fungsi Real-Time CLI Interaktif
|
||
Fungsi `predict_sentiment_cli()` telah diimplementasikan untuk menerima ketikan langsung dari pengguna:
|
||
```python
|
||
def predict_sentiment_cli(model, tokenizer):
|
||
print("=== SISTEM PREDIKSI SENTIMEN REAL-TIME TOKOPEDIA ===")
|
||
print("Ketik 'exit' untuk berhenti.\n")
|
||
while True:
|
||
text = input("Masukkan ulasan Anda: ")
|
||
if text.strip().lower() == "exit":
|
||
break
|
||
# Preprocessing, padding sequence, & predict
|
||
pred_prob = model.predict(padded_seq, verbose=0)[0][0]
|
||
label = "POSITIF" if pred_prob >= 0.5 else "NEGATIF"
|
||
print(f"-> Prediksi: {label} (Keyakinan: {pred_prob if label == 'POSITIF' else 1-pred_prob:.2%})\n")
|
||
```
|
||
|
||
---
|
||
|
||
## KESIMPULAN AKHIR & SINTESIS INTEGRASI
|
||
|
||
1. **Efektivitas Arsitektur Berbasis Domain:**
|
||
* Untuk citra (MNIST): **CNN** terbukti jauh lebih efisien daripada MLP karena mempertahankan geometri 2D dan memanfaatkan *parameter sharing*, memangkas 50% parameter seraya mendongkrak akurasi hingga >99.2%.
|
||
* Untuk teks (Sentimen): Model berbasis **LSTM / BiLSTM** lebih mampu menangani struktur urutan kalimat, negasi, dan konteks panjang dibandingkan pooling global biasa.
|
||
2. **Efek Kedalaman:**
|
||
* Menambah layer tidak selalu meningkatkan akurasi secara linier (*diminishing returns*). Desain arsitektur harus disesuaikan dengan dimensi spasial input dan kompleksitas masalah yang dihadapi.
|