Evaluasi pada Bagian 4 memberi angka; analisis kesalahan memberi penjelasan. Bagian penutup ini menjalankan src/analisis_kesalahan.py yang menyusun tiga pandangan berlapis: confusion matrix, daftar sampel salah beserta keyakinan model, dan statistik bercak yang menguji hipotesis secara eksplisit. Metode berlapis seperti ini adalah inti chapter Analisis Kesalahan — dugaan “model kesulitan pada daun dengan sedikit bercak” tidak kita biarkan sebagai dugaan, tetapi kita buktikan dengan data.

Menjalankan Analisis #

Dari folder proyek, analisis berjalan di atas checkpoint hasil Bagian 3:

bash
python3 src/analisis_kesalahan.py

Output yang Dihasilkan:

text
model    : CNNDaun (9538 parameter)
data uji : 75 gambar (pembagian stratified, seed 42)

confusion matrix (baris = label, kolom = prediksi):
                  pred sehat  pred berbintak
label sehat               35               3
label berbintak            4              33

akurasi uji: 0.9067 (68/75)

sampel salah: 7
posisi       label    prediksi  keyakinan  bercak
     1       sehat   berbintak      0.642       0 (FP)
     2       sehat   berbintak      0.684       0 (FP)
    15   berbintak       sehat      0.905       1 (FN)
    21   berbintak       sehat      0.868       1 (FN)
    33   berbintak       sehat      0.516       1 (FN)
    40   berbintak       sehat      0.752       1 (FN)
    57       sehat   berbintak      0.568       0 (FP)

akurasi per kelompok jumlah bercak (hanya daun berbintak):
  kelompok   jumlah   benar   akurasi
      1          16      12     0.750
      2           8       8     1.000
      3           5       5     1.000
      4           8       8     1.000
  sehat          38      35     0.921

rata-rata bercak: sampel salah 1.00 vs sampel benar 2.27
kasus tersulit: daun berbintak dengan 1 bercak (akurasi 0.750 dari 16 sampel)

Skrip membagi tugasnya menjadi tiga fungsi: muat_model membangun CNNDaun lalu mengisi bobot dari checkpoint, prediksi mengembalikan kelas terpilih beserta keyakinan softmax, dan fungsi main menyusun seluruh laporan. Kunci yang menghubungkan laporan ini dengan Bagian 2 adalah indeks_latih_uji(y) — indeks uji identik dengan yang dipakai pelatihan, sehingga baris jumlah_bintak dapat dibaca untuk sampel uji tanpa risiko salah pasang.

Membaca Daftar Sampel Salah #

Kolom bercak pada daftar sampel salah langsung memperlihatkan pola yang dicari:

  1. Empat false negative (posisi 15, 21, 33, 40): seluruhnya daun berbintak dengan tepat satu bercak — kategori kasus sulit yang sengaja kita tanam pada generator di Bagian 1.
  2. Tiga false positive (posisi 1, 2, 57): daun sehat dengan keyakinan 0.568-0.684. Pada dataset ini, sekitar 22 persen daun sehat membawa satu-dua piksel noise gelap yang menyerupai bercak kecil — model menangkap kemiripan itu dan menebak berbintak.
  3. Keyakinan tidak selalu rendah saat keliru: false negative pada posisi 15 justru berkeyakinan 0.905. Model tidak sekadar “ragu-ragu”; pada kasus satu bercak samar, model yakin ke arah yang salah — temuan yang tidak akan terlihat bila kita hanya memfilter sampel berkeyakinan rendah.

Statistik Bercak Membuktikan Pola #

Tabel akurasi per kelompok jumlah bercak mengubah daftar kesalahan menjadi bukti terukur:

KelompokJumlah ujiAkurasi
1 bercak160.750
2 bercak81.000
3 bercak51.000
4 bercak81.000
sehat380.921

Dua-dua bercak ke atas selalu benar; satu bercak hanya benar 12 dari 16. Rata-rata bercak pada sampel salah (1.00) versus sampel benar (2.27) menutup argumen: semakin banyak bercak, semakin mudah model mengenali — dan semakin sedikit, semakin menyerupai daun sehat yang membawa noise. Kesalahan tidak tersebar acak; kesalahan terkonsentrasi pada satu segmen data yang dapat kita definisikan tanpa melihat label prediksinya.

Hipotesis dan Langkah Perbaikan #

Pola yang sudah terbukti mengarahkan langkah perbaikan berikutnya secara jauh lebih presisi daripada “latih lebih lama”:

  • Tambah sampel kasus sulit: menaikkan proporsi daun berbercak satu (misalnya dari 15 menjadi 40 persen) memberi gradien lebih banyak contoh pada segmen tersulit — perubahan satu baris pada generator.
  • Augmentasi potongan gambar: memotong area sekitar bercak dan melatih ulang membantu filter convolution menangkap bercak kecil; tekniknya dibahas pada chapter Image Augmentation .
  • Ambang keputusan khusus: menggeser batas keputusan ke kelas berbintak (misalnya prediksi berbintak bila peluangnya melewati 0.35, bukan 0.5) menukar beberapa false positive dengan recall lebih tinggi — pilihan yang masuk akal karena biaya false negative jauh lebih besar.

Proyek ini menutup satu putaran penuh: data diperiksa, diproses, model dilatih, prediksi dievaluasi, lalu kesalahannya dibedah sampai akar penyebabnya terbukti. Kemampuan yang sama — membangun model dari data terbatas — bisa dilampaui ketika kita memakai model yang sudah dilatih orang lain sebagai titik awal; itulah pokok bahasan proyek berikutnya, Transfer Learning dengan Model Pretrained .