Episode ini tentang momok pertama yang membuat saya merasa bodoh saat belajar machine learning. Saya melatih decision tree untuk klasifikasi sederhana, akurasi di data training 99 persen. Senang setengah mati. Begitu diuji ke data yang belum pernah dilihat, nilainya anjlok ke kisaran 60-an. Saya cek ulang kode, curiga ada bug, cari-cari jam kerja yang hilang. Ternyata tidak ada bug. Yang terjadi adalah overfitting, dan episode ini adalah catatan saya memahaminya lewat kacamata seorang programmer.
Model Itu Fungsi, Training Itu Optimasi
Ingat analogi yang kita pakai sepanjang seri ini: model adalah fungsi berparameter, misalnya f(x; θ), dan training adalah proses mencari nilai θ yang mengecilkan loss di data training. Masalahnya, “mengecilkan loss di data training” bukan tujuan sesungguhnya. Tujuan kita adalah performa di data baru yang belum pernah dilihat model. Dua hal ini sering dicampuradukkan, dan di situlah masalah dimulai.
Analogi favorit saya: unit test. Bayangkan seorang programmer nakal yang membuat implementasi yang isinya cuma membaca daftar kasus uji lalu mengembalikan jawaban yang sudah dihardcode. Semua test hijau, coverage bagus, tapi programnya tidak berguna sama sekali karena tidak menggeneralisasi. Model yang overfit persis begitu: dia menghafal pasangan input-output di data training, termasuk noise-nya, bukan mempelajari polanya.
Underfitting: Bias Tinggi
Kebalikannya, underfitting terjadi kalau model terlalu kaku untuk menangkap pola yang ada. Contoh klasik: memaksa regresi linear untuk data yang polanya melengkung. Errornya tinggi di data training, dan pasti tinggi juga di data validasi. Rasanya seperti memakai regex untuk mem-parsing HTML yang bersarang — alatnya salah dari awal, sebaik apa pun Anda mengatur parameternya hasilnya tetap jelek.
Dalam istilah statistik, underfitting disebut bias tinggi: prediksi model secara sistematis meleset dari kenyataan karena asumsi fungsinya terlalu sederhana. Overfitting disebut varians tinggi: model terlalu sensitif, perubahan kecil di data training bisa menghasilkan model yang sangat berbeda. Tradeoff keduanya adalah salah satu kerangka berpikir paling berguna di machine learning.
Tabel Diagnosa Cepat
| Aspek | Underfitting | Overfitting |
|---|---|---|
| Error training | Tinggi | Sangat rendah |
| Error validasi | Tinggi | Tinggi |
| Jarak train vs validasi | Rapat | Gap lebar |
| Penyebab umum | Model terlalu sederhana, fitur kurang informatif | Model terlalu kompleks, data terlalu sedikit |
| Obat pertama | Model lebih fleksibel, feature engineering | Regularisasi, lebih banyak data, sederhanakan model |
Cara Deteksi di Lapangan
- Pisahkan data menjadi train, validation, dan test sejak awal. Jangan pernah menilai generalisasi dari data training.
- Bandingkan metrik di train versus validation. Gap besar adalah tanda overfitting; keduanya buruk sekaligus adalah underfitting.
- Gambar learning curve: bagaimana error berubah seiring bertambahnya data dan iterasi training.
- Gunakan cross-validation supaya penilaian tidak bergantung pada satu pembagian data yang kebetulan mujur.
Kode berikut adalah ritual yang sekarang saya jalankan di hampir setiap eksperimen: latih, lalu bandingkan akurasi train dan validasi secara eksplisit.
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
X_tr, X_val, y_tr, y_val = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = DecisionTreeClassifier(max_depth=None) # bebas dalam: rawan overfit
model.fit(X_tr, y_tr)
print("train :", accuracy_score(y_tr, model.predict(X_tr)))
print("valid :", accuracy_score(y_val, model.predict(X_val)))
# train 1.00, valid 0.61 --> gap lebar, overfitting
# coba max_depth=4 lalu bandingkan lagi
Daftar Obat yang Saya Pakai
- Tambah data, kalau memungkinkan. Cara paling jujur dan paling mahal.
- Regularisasi L1/L2: menghukum bobot yang terlalu besar supaya model tidak bergantung pada pola rapuh.
- Sederhanakan model: batasi kedalaman tree, kurangi jumlah layer atau neuron.
- Early stopping: berhenti training sebelum model mulai menghafal.
- Dropout untuk neural network: mematikan neuron secara acak saat training supaya tidak ada yang jadi “single point of failure”.
- Untuk underfitting: arah sebaliknya — model lebih kompleks, fitur lebih baik, training lebih lama.
Bagian yang paling perlu saya terima sebagai orang yang suka optimasi: tidak ada model yang bebas dari kedua penyakit ini. Menekan varians hampir selalu menaikkan bias sedikit, dan sebaliknya. Yang penting bukan mengejar nol error, tapi tahu posisi Anda di kurva tradeoff, dan punya alat untuk bergeser ke arah yang tepat saat metrik bilang perlu.
Komentar Terbaru