Batas-Batas Accuracy

Ketidakseimbangan kelas membuat accuracy berbohong.

Daftar isi

Accuracy menghitung proporsi prediksi yang benar dari seluruh prediksi dan menjadi metrik klasifikasi yang paling sering dilaporkan karena bentuknya sederhana. Topik ini menunjukkan kelemahan accuracy pada data tidak seimbang, yaitu data dengan proporsi kelas yang berjauhan, melalui percobaan ketika model yang tidak membaca fitur tetap mencetak accuracy tinggi. Pembahasan mencakup definisi accuracy, jebakan data dengan komposisi 95:5, serta disiplin menanyakan “accuracy atas apa” setiap kali metrik ini dilaporkan. Setelah topik ini dipahami, angka accuracy tidak lagi dibaca mentah, melainkan dinilai terhadap distribusi kelas datanya.

Accuracy sebagai proporsi prediksi benar#

Accuracy adalah proporsi prediksi yang benar terhadap seluruh prediksi, sebagaimana dirumuskan berikut.

accuracy=banyak prediksi yang benarbanyak seluruh prediksi \text{accuracy} = \frac{\text{banyak prediksi yang benar}}{\text{banyak seluruh prediksi}}

Metrik ini merangkum seluruh hasil prediksi menjadi satu bilangan antara 0 dan 1, sehingga mudah dibandingkan antarmodel dan mudah dimasukkan ke laporan. Pada data yang seimbang, yaitu data dengan jumlah tiap kelas yang kurang lebih sama, accuracy memberi gambaran yang wajar karena setiap kelas menyumbang porsi yang sebanding pada perhitungan. Data iris, misalnya, memiliki tiga kelas dengan porsi yang sama, sehingga accuracy 0.95 pada data itu berarti 95 persen seluruh sampel diprediksi dengan benar tanpa condong ke kelas tertentu.

Permasalahan muncul ketika distribusi kelasnya berjauhan. Rumus di atas memberi bobot sama pada setiap prediksi, sehingga kelas yang jumlahnya banyak mendominasi pembilang dan penyebut. Kelas kecil dapat seluruhnya keliru tanpa menggerakkan angka accuracy secara berarti karena kontribusinya hanya sekecil porsinya pada data.

Accuracy juga berpasangan erat dengan error rate, yaitu proporsi prediksi yang salah yang besarnya sama dengan satu dikurangi accuracy. Angka 0.9583 pada percobaan bagian berikutnya berarti 5 dari 120 sampel uji diprediksi keliru. Perhitungannya memang sederhana, tetapi justru kesederhanaan itu menyembunyikan informasi penting, yaitu kelas mana yang keliru dan berapa banyak, karena seluruh kesalahan tercampur dalam satu bilangan.

Jebakan pada data 95:5#

Jebakannya dapat direkonstruksi langsung dengan kode nyata. Data sintetis dibuat melalui make_classification menggunakan weights=[0.95, 0.05] sehingga kelas 1 hanya sekitar 5 persen. DummyClassifier dengan strategi most_frequent menjadi pembanding, yaitu model baseline yang selalu menjawab kelas mayoritas tanpa membaca satu pun fitur. LogisticRegression dengan max_iter=1000 menjadi model sungguhan yang diharapkan mempelajari pola dari fitur.

python perbandingan-akurasi.py
from sklearn.datasets import make_classification
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score
from sklearn.model_selection import train_test_split

X, y = make_classification(
    n_samples=600, n_features=6, n_informative=3, n_redundant=0,
    weights=[0.95, 0.05], random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

dummy = DummyClassifier(strategy="most_frequent")
dummy.fit(X_train, y_train)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

print("Ukuran data uji        :", len(y_test))
print("Proporsi kelas 1 di uji:", round(y_test.mean(), 4))
print()
for nama, estimator in [("DummyClassifier    ", dummy), ("LogisticRegression ", model)]:
    pred = estimator.predict(X_test)
    acc = accuracy_score(y_test, pred)
    prec = precision_score(y_test, pred, zero_division=0)
    n_pos = (pred == 1).sum()
    print(f"{nama}: accuracy={acc:.4f}  prediksi positif={n_pos}  precision kelas 1={prec:.4f}")
text Keluaran
Ukuran data uji        : 120
Proporsi kelas 1 di uji: 0.05

DummyClassifier    : accuracy=0.9500  prediksi positif=0  precision kelas 1=0.0000
LogisticRegression : accuracy=0.9583  prediksi positif=1  precision kelas 1=1.0000

Keluarannya menegaskan jebakan tersebut. DummyClassifier memperoleh accuracy 0.95 tanpa membaca fitur, persis sebesar proporsi kelas mayoritas pada data uji. LogisticRegression hanya unggul tipis dengan 0.9583, padahal model ini benar-benar mempelajari pola, dan buktinya terlihat pada kolom prediksi positif yang berisi satu sampel kelas 1 yang tertangkap dengan tepat. Angka precision kelas 1 jauh lebih jujur, yaitu 0.0000 untuk baseline karena tidak ada satu pun prediksi positif yang dibuat, dan 1.0000 untuk model sungguhan karena satu-satunya prediksi positifnya memang benar.

Dua baris keluaran tersebut memiliki accuracy yang hampir sama, tetapi isinya sangat berbeda. Yang pertama adalah tebakan tetap tanpa kegunaan, sedangkan yang kedua adalah model yang mulai menemukan pola kelas minoritas. Accuracy saja tidak mampu membedakan keduanya, sehingga metrik tambahan diperlukan sebelum mutu model dinyatakan.

Menanyakan accuracy atas apa#

Setiap angka accuracy selalu melekat pada satu distribusi kelas, dan distribusi itulah yang wajib dinyatakan setiap kali metrik ini dilaporkan. Disiplin yang dianjurkan adalah menanyakan accuracy atas apa, yaitu atas data uji dengan komposisi kelas seperti apa metrik itu dihitung. Angka 0.9583 pada percobaan di atas adalah accuracy atas data uji 120 sampel yang 95 persennya berlabel kelas 0. Keterangan semacam ini mengubah angka mentah menjadi informasi yang dapat dinilai.

Bentuk pelaporan yang lengkap dapat dirumuskan sebagai satu kalimat, misalnya accuracy 0.9583 atas 120 sampel uji yang memuat 6 sampel kelas 1. Kalimat semacam itu memuat tiga keterangan sekaligus, yaitu nilai metrik, ukuran data uji, dan proporsi kelas minoritasnya. Dengan keterangan itu, pembaca laporan dapat menimbang langsung apakah angkanya melampaui tebakan kelas mayoritas tanpa menanyakan ulang konteksnya.

Penilaian menjadi sistematis dengan tiga periksa singkat. Pertama, bandingkan accuracy model dengan proporsi kelas mayoritas karena angka yang berdekatan menandakan model belum banyak melampaui tebakan paling sederhana. Kedua, lengkapi accuracy dengan metrik per kelas seperti precision, yaitu porsi prediksi positif yang benar, dan recall, yaitu porsi positif yang tertangkap, karena keduanya menilai kelas minoritas secara langsung. Ketiga, jangan membandingkan accuracy antardataset yang komposisi kelasnya berbeda, karena angka pada data 95:5 dan pada data seimbang tidak berdiri pada skala yang sama.

Kesalahan umum#

Kesalahan pada pemakaian accuracy umumnya bukan salah hitung, melainkan salah membaca konteks. Tiga pola berikut paling sering muncul.

  • Melaporkan accuracy tanpa menyebut distribusi kelas data uji, sehingga pembaca tidak dapat menilai apakah angka itu melampaui tebakan kelas mayoritas. Perbaikannya, sertakan proporsi kelas setiap kali accuracy dilaporkan.
  • Menganggap accuracy tinggi berarti seluruh kelas terlayani. Percobaan di atas menunjukkan accuracy 0.95 berdampingan dengan precision kelas minoritas yang nol. Perbaikannya, periksa metrik per kelas sebelum menyimpulkan mutu model.
  • Memilih accuracy karena kebiasaan templat laporan, bukan karena sifat datanya. Pada data tidak seimbang, F1 (rata-rata harmonik precision dan recall) dan AUC (luas di bawah kurva ROC) memberi gambaran yang lebih jujur. Perbaikannya, tetapkan metrik berdasarkan konsekuensi tiap jenis kesalahan pada domainnya.

Ringkasan#

  • Accuracy adalah proporsi prediksi yang benar dan tetap layak digunakan pada data yang seimbang.
  • Pada data 95:5, model yang selalu menjawab kelas mayoritas mencapai accuracy 0.95 tanpa membaca fitur, dan precision kelas minoritasnya nol.
  • Setiap angka accuracy wajib disertai jawaban atas pertanyaan “accuracy atas apa”, yaitu atas distribusi kelas manakah metrik itu dihitung.
  • Accuracy sebaiknya selalu dibandingkan dengan baseline kelas mayoritas dan dilengkapi metrik per kelas.

Referensi#