Pelatihan pada bagian sebelumnya berakhir dengan satu angka — akurasi uji 0.9733 — namun angka tunggal tidak menunjukkan pola kesalahannya. Bagian penutup proyek ini membaca keluaran evaluasi src/latih.py secara menyeluruh: confusion matrix, recall per kelas, hipotesis penyebab pertukaran digit, sampai inferensi lima sampel nyata. Angka-angka pada halaman ini berasal dari eksekusi nyata yang dapat Anda ulang sendiri.
Akurasi Uji dan Confusion Matrix #
Baris evaluasi akhir src/latih.py tercetak sebagai berikut:
akurasi uji akhir: 0.9733 (438/450)
confusion matrix (baris = label, kolom = prediksi):
0 1 2 3 4 5 6 7 8 9
label 0: 44 0 0 0 1 0 0 0 0 0
label 1: 0 45 0 0 0 0 0 0 1 0
label 2: 0 0 44 0 0 0 0 0 0 0
label 3: 0 0 1 45 0 0 0 0 0 0
label 4: 0 0 0 0 45 0 0 0 0 0
label 5: 0 0 0 0 0 45 0 0 0 1
label 6: 0 0 0 0 0 0 45 0 0 0
label 7: 0 0 0 0 1 0 0 44 0 0
label 8: 0 4 1 0 0 0 0 1 37 0
label 9: 0 0 0 0 0 0 0 1 0 44Dari 450 gambar uji, model benar pada 438 gambar dan keliru pada 12 gambar. Matriks ini dibangun fungsi buat_matriks_kekeliruan di src/latih.py: setiap sel (i, j) berisi jumlah gambar berlabel i yang diprediksi j, sehingga diagonal besar berarti sehat dan sel di luar diagonal adalah kesalahan yang spesifik — kerangka kerja yang dibahas pada chapter Confusion Matrix
.
Pola Kesalahan yang Muncul #
Kesalahan tidak tersebar merata; tabel berikut merangkum kelas-kelas yang paling terdampak:
| Label | Benar | Salah | Recall | Tertukar ke |
|---|---|---|---|---|
| 8 | 37 | 6 | 0.860 | 1 (empat kali), 2, 7 |
| 0 | 44 | 1 | 0.978 | 4 |
| 1 | 45 | 1 | 0.978 | 8 |
| 3, 5, 7, 9 | masing-masing 44-45 | 1 | 0.978-1.000 | satu kali |
| 2, 4, 6 | semua | 0 | 1.000 | — |
Dua pengamatan bisa ditarik. Pertama, kelas 8 menjadi titik terlemah: enam dari 43 gambar delapan salah dikenali, dan empat di antaranya diprediksi sebagai 1 — goresan lengkung delapan yang digambar sempit pada resolusi 8x8 memang menyisakan piksel terang yang tipis, hampir seperti angka satu. Kedua, pertukaran berbalas arah antara 1 dan 8 terjadi di kedua sisi (satu gambar 1 diprediksi 8), sehingga precision kelas 1 turun menjadi 45/49 ≈ 0.918 meskipun recall-nya tinggi — perbedaan recall dan precision ini diulas pada chapter Metrik Klasifikasi .
Hipotesis perbaikan pun langsung terarah: augmentasi data latih dengan geseran dan rotasi kecil pada gambar 8, atau menambah epoch — keduanya bisa Anda uji lewat argumen python3 src/latih.py keluaran.pt 40 lalu mencatat hasilnya ke laporan/LAPORAN.md.
Inferensi pada Sampel Individual #
Skrip src/prediksi.py memuat checkpoint, menyusun ulang data uji dengan seed yang sama, lalu memprediksi lima sampel pertama:
model = MLPDigit()
model.load_state_dict(checkpoint["state_dict"])
model.eval()
# Susun ulang data uji persis seperti latih.py (seed sama).
kumpulan = load_digits()
X, y = kumpulan.data, kumpulan.target
_, X_uji, _, y_uji = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=SEED
)
X_uji_t = torch.tensor(X_uji, dtype=torch.float32)
X_uji_t = (X_uji_t - checkpoint["rata2"]) / checkpoint["simpangan"]
y_uji = y_uji[INDEKS_SAMPEL]
with torch.no_grad():
logits = model(X_uji_t[INDEKS_SAMPEL])
probabilitas = torch.softmax(logits, dim=1)Output yang Dihasilkan (python3 src/prediksi.py):
checkpoint : /tmp/model_digit.pt
sampel : 5 gambar pertama data uji
sampel # 0 | label 1 | prediksi 1 | keyakinan 0.895 | BENAR
sampel # 1 | label 0 | prediksi 0 | keyakinan 1.000 | BENAR
sampel # 2 | label 9 | prediksi 9 | keyakinan 1.000 | BENAR
sampel # 3 | label 1 | prediksi 1 | keyakinan 0.999 | BENAR
sampel # 4 | label 5 | prediksi 5 | keyakinan 0.998 | BENARPerhatikan dua detail pada skrip ini. Standardisasi memakai checkpoint["rata2"] dan checkpoint["simpangan"] — statistik yang sama seperti saat pelatihan, bukan statistik dihitung ulang — dan torch.softmax baru muncul di sini untuk keperluan tampilan keyakinan, bukan untuk pelatihan.
Menutup Proyek #
Rangkaian uji otomatis (python3 tests/test_model.py dan python3 tests/test_pipeline.py) sama pentingnya dengan evaluasi manual: keduanya lulus dengan keluaran SEMUA TEST LULUS, dan pengujian pipeline memastikan siklus data-checkpoint-muat ulang berfungsi dari ujung ke ujung. Proyek pertama ini menuntaskan satu siklus penuh pada data tabular hasil perataan piksel. Proyek berikutnya, Klasifikasi Gambar Hewan
, naik satu tingkat: gambar dipertahankan dua dimensi dan dikenali lewat convolutional neural network.