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:
| Aspek | Overfitting | Underfitting |
|---|---|---|
| Skor data latih | Tinggi, kadang sempurna | Rendah |
| Skor data uji | Jauh lebih rendah dari latih | Rendah juga, berdekatan dengan latih |
| Jarak latih-ke-uji | Lebar | Sempit |
| Sebab | Model menyerap detail dan derau data latih | Model terlalu sederhana untuk pola yang ada |
| Analogi | Siswa menghafal kunci jawaban, gagal saat soal diubah | Siswa 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:
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:
k akurasi latih akurasi uji
1 1.000 0.722
5 0.738 0.833
15 0.643 0.722
41 0.524 0.556Mari kita telaah baris demi baris hasilnya:
- 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.
- 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.
- 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.
- 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:
| Diagnosis | Obat yang tepat | Obat yang salah |
|---|---|---|
| Overfitting (latih tinggi, uji jatuh) | Data latih lebih banyak; model lebih sederhana; kurangi fitur derau; regularisasi; batasi kedalaman/jangkauan model | Menambah kompleksitas model |
| Underfitting (keduanya rendah) | Fitur baru yang lebih informatif; model lebih fleksibel; latih lebih lama/lebih dalam | Menambah 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_neighborsbisa 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 .