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:

text
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  44

Dari 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:

LabelBenarSalahRecallTertukar ke
83760.8601 (empat kali), 2, 7
04410.9784
14510.9788
3, 5, 7, 9masing-masing 44-4510.978-1.000satu kali
2, 4, 6semua01.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:

python src/prediksi.py — inti inferensi
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):

text
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 | BENAR

Perhatikan 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.

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.