# Evaluation

## Metrik

**Accuracy** — proporsi soal yang caption benarnya kamu pilih, dihitung datar di
seluruh test set.

```
accuracy = (jumlah prediksi benar) / 250
```

Tidak ada pembobotan per tipe soal. Semua soal bernilai sama.

- **Chance level**: 20% (5 pilihan)
- **Baseline yang disediakan**: ≈41%

## Format submission

Satu file `submission.csv` dengan tepat dua kolom:

```csv
id,label
0,3
1,0
2,4
...
```

| Kolom | Tipe | Keterangan |
|---|---|---|
| `id` | int | sama persis dengan `id` di `test/test.csv` |
| `label` | int | indeks caption yang kamu pilih, **0–4** |

Gunakan `sample_submission.csv` sebagai titik awal. Semua 250 `id` harus ada;
`id` yang hilang dihitung salah.

## Public / Private

Skor dibelah dua, meniru konvensi leaderboard:

| | Jumlah soal |
|---|---|
| **Public** | 125 |
| **Private** | 250 − 125 = 125 |

Pembagiannya **stratified per tipe soal** — tiap paruh berisi 25 soal dari setiap
tipe. Jadi kedua paruh punya campuran kesulitan yang identik, dan skor publik
adalah penduga yang tidak bias untuk skor privat.

### Cara membaca selisih Public–Private

Pada n = 125, standard error accuracy sudah sekitar **4,5%**. Standard error dari
*selisih* dua paruh sekitar **6,3%**.

Artinya: **selisih Public–Private sampai ±12 poin masih konsisten dengan kebetulan
murni.** Kalau skor publikmu 52% dan privatmu 45%, tidak terjadi apa-apa — itu
bukan overfitting, itu varians sampel.

Script penilai mencetak kolom `gap/2SE` yang menormalkan selisih terhadap
kebisingannya. Baca kolom itu, bukan selisih mentahnya:

| `gap/2SE` | Artinya |
|---|---|
| \|nilai\| < 1 | tidak ada yang perlu dijelaskan |
| \|nilai\| > 1 | mulai layak dilihat |
| \|nilai\| > 2 | ada yang sistematis, bukan kebetulan |

## Penilaian

```bash
python score.py submission.csv --solution solution.csv
```

Kunci jawaban disimpan privat oleh mentor dan tidak dirilis sampai sesi debrief
selesai.