Model yang buruk bisa gagal dengan dua cara yang bertolak belakang, dan keduanya butuh obat yang berbeda. Model yang terlalu rapat mengikuti data latih akan tampak juara di kandang sendiri lalu keok di data baru — penyakit ini bernama overfitting. Model yang terlalu sederhana akan tampil biasa-biasa saja di mana pun, gagal menangkap pola meski polanya ada — ini underfitting. Keduanya tidak bisa dibedakan dari satu angka skor saja; kita perlu membandingkan performa pada data latih dan data uji seperti pada chapter Generalisasi Model , lalu membaca polanya. Pada chapter ini kita membedakan keduanya lewat demonstrasi nyata: satu parameter model yang digeser dari ekstrem ke ekstrem, dan tabel akurasi yang berubah mengikutinya.

Gejala Kedua Penyakit #

Karena keduanya sama-sama membuat model buruk, mari kita taruh gejalanya bersebelahan:

AspekOverfittingUnderfitting
Skor data latihTinggi, kadang sempurnaRendah
Skor data ujiJauh lebih rendah dari latihRendah juga, berdekatan dengan latih
Jarak latih-ke-ujiLebarSempit
SebabModel menyerap detail dan derau data latihModel terlalu sederhana untuk pola yang ada
AnalogiSiswa menghafal kunci jawaban, gagal saat soal diubahSiswa hanya membaca judul bab

Diagnosisnya selalu dua angka, bukan satu. Model dengan akurasi latih 100% terdengar mengesankan sampai kita tahu akurasinya di data uji — angka pertama saja tidak pernah menceritakan kisah lengkapnya.

Demonstrasi: Satu Parameter yang Mengubah Segalanya #

Algoritma K-Nearest Neighbors punya satu parameter yang langsung mengatur fleksibilitasnya: n_neighbors (k), yaitu berapa tetangga terdekat yang ikut memberi suara. Nilai k kecil membuat model sangat peka pada tiap titik data; nilai k besar membuat model menjadi konservatif. Kita latih pada data pelanggan Toko Kopi Kita (60 pelanggan, fitur umur dan belanja bulanan, label “setia”) lalu ukur akurasi di kedua data untuk empat nilai k:

python
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

rng = np.random.default_rng(42)
n = 60
umur = rng.integers(18, 60, n)
belanja = rng.integers(20, 500, n)
gabungan = 0.02 * belanja + 0.3 * (60 - umur) + rng.normal(0, 1.2, n)
setia = (gabungan > gabungan.mean()).astype(int)

X = np.column_stack([umur, belanja])
X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, setia, test_size=0.3, random_state=42, stratify=setia)

print(f"{'k':>4} {'akurasi latih':>14} {'akurasi uji':>12}")
for k in (1, 5, 15, 41):
    model = KNeighborsClassifier(n_neighbors=k).fit(X_latih, y_latih)
    a_latih = model.score(X_latih, y_latih)
    a_uji = model.score(X_uji, y_uji)
    print(f"{k:>4} {a_latih:>14.3f} {a_uji:>12.3f}")

Output yang Dihasilkan:

text
   k  akurasi latih  akurasi uji
   1          1.000        0.722
   5          0.738        0.833
  15          0.643        0.722
  41          0.524        0.556

Mari kita telaah baris demi baris hasilnya:

  1. k = 1 — overfitting klasik: akurasi latih 1,000 (sempurna) berbanding uji 0,722. Dengan satu tetangga, model tinggal mengembalikan label titik terdekat — setiap titik latih pada dasarnya “memprediksi dirinya sendiri”, sehingga hafalan sempurna. Jarak 0,278 antar skor adalah gejalanya.
  2. k = 5 — titik sehat: akurasi uji justru tertinggi (0,833) dengan jarak yang kecil. Lima suara tetangga meredam derau individu; pola mayoritas tetap terbaca. Akurasi uji yang sedikit di atas latih bukan pertanda istimewa — 18 titik uji adalah sampel kecil — tetapi keseimbangannya nyata.
  3. k = 41 — underfitting: kedua skor jatuh bersama ke sekitar 0,5-0,55, nyaris lempar koin. Ketika suara 41 tetangga dicampur, perbedaan antar wilayah data tercampur rata; model menjadi terlalu datar untuk menangkap pola apa pun.
  4. Polanya parabolik: performa uji naik lalu turun saat k berjalan dari 1 ke 41 — persis kurva yang dicari saat mengatur parameter: daerah tengahnya adalah titik seimbang antara terlalu fleksibel dan terlalu kaku.

Diagnosis dan Obatnya #

Setelah gejala terbaca, pilihannya mengikuti penyakitnya:

DiagnosisObat yang tepatObat yang salah
Overfitting (latih tinggi, uji jatuh)Data latih lebih banyak; model lebih sederhana; kurangi fitur derau; regularisasi; batasi kedalaman/jangkauan modelMenambah kompleksitas model
Underfitting (keduanya rendah)Fitur baru yang lebih informatif; model lebih fleksibel; latih lebih lama/lebih dalamMenambah data dari fitur yang sama

Satu catatan penting: menambah data hampir selalu membantu overfitting, tetapi tidak menyembuhkan underfitting — model yang terlalu sederhana tetap sederhana berapa pun data yang diberikan. Ketika kedua skor sama-sama rendah, persoalannya biasanya ada pada bahan bakunya: fitur yang tersedia tidak memuat informasi yang cukup untuk membedakan kelas atau memprediksi target.

Bias dan Variance dalam Satu Paragraf #

Dua istilah yang sering menyertai pembahasan ini: bias adalah kesalahan karena model terlalu kaku — asumsinya terlalu kaku sehingga pola asli terlewat (sumber underfitting); variance adalah kesalahan karena model terlalu peka terhadap isi data latih — ganti latihannya dengan sampel lain, modelnya ikut berubah drastis (sumber overfitting). Mengatur kompleksitas model pada dasarnya menimbang keduanya: model sederhana berbias tinggi bervariance rendah; model sangat fleksibel sebaliknya. Titik terbaik bukan variance nol atau bias nol, melainkan jumlah keduanya yang paling kecil — itulah yang ditunjukkan kolom akurasi uji pada demonstrasi kita: k = 5 meminimalkan gabungan keduanya.

Rangkuman #

  • Overfitting: skor latih tinggi, skor uji jauh jatuh — model menghafal derau; obatnya data lebih banyak atau model lebih sederhana.
  • Underfitting: kedua skor rendah dan berdekatan — model terlalu sederhana; obatnya fitur baru atau model lebih fleksibel, bukan sekadar menambah data.
  • Satu parameter seperti n_neighbors bisa menggerakkan model melewati ketiga wilayah: menghafal (k=1), seimbang (k=5), dan terlalu datar (k=41).
  • Bias (terlalu kaku) dan variance (terlalu peka) adalah dua sumber galat yang beradu; kompleksitas model adalah pengungkit untuk menimbangnya.
  • Diagnosis selalu dua angka — latih dan uji — dibaca berdampingan, seperti yang dilatih di chapter generalisasi.

Menyembuhkan model hanyalah setengah pekerjaan; pekerjaan sesungguhnya dimulai lebih awal — memilih model yang tepat untuk masalah, data, dan kebutuhan interpretasinya sejak awal. Chapter penutup Section ini merangkum panduan memilihnya: Memilih Model .

Referensi #

  1. scikit-learn — FAQ
  2. scikit-learn — Model selection: cross-validation
  3. scikit-learn — Metrics and scoring: model evaluation