Files
kelompok3-deeplearning/docs/laporan_akhir.md
T

173 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📄 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.