Mengapa model terlalu sederhana gagal, model terlalu rumit juga gagal, dan model yang tepat berada di tengah-tengah? Bias-variance tradeoff adalah kerangka yang menjawab pertanyaan tersebut dengan memilah galat model menjadi tiga sumber yang berdiri sendiri: bias, variansi, dan derau. Kerangka ini adalah benang merah yang merangkai seluruh section evaluasi — akurasi latih versus uji pada chapter pertama, gap learning curve, pola underfitting dan overfitting — menjadi satu penjelasan terukur. Chapter penutup ini membangun dekomposisi tersebut dengan bahasa sederhana, lalu membuktikannya lewat eksperimen polynomial yang menghitung bias dan varians secara langsung dari 10 replika pelatihan.
Tiga Sumber Galat dalam Satu Rumus #
Galat yang diharapkan sebuah model pada titik data baru dapat dipilah menjadi tiga suku (kita simpan bentuk ringkasnya tanpa derivasi):
galat yang diharapkan = bias^2 + varians + derauBias adalah galat yang sistematis: rata-rata prediksi model, bila dilatih berulang pada banyak dataset berbeda, tetap meleset ke arah yang sama. Analoginya seorang penembak jitu yang bidikannya selalu condong ke kiri — tembakan terkumpul rapi, tetapi rapi di tempat yang salah. Model linear yang dipaksa memodelkan kurva cubic adalah contohnya: berapa kali pun dilatih ulang, garis lurus tersebut tidak akan pernah menekuk mengikuti kurva. Variansi adalah kepekaan terhadap data latih: model yang dilatih pada dataset yang sedikit berbeda menghasilkan prediksi yang berbeda jauh. Analoginya penembak yang tembakannya berserakan ke segala arah — pusat rata-ratanya bisa saja tepat di sasaran, tetapi tidak ada satu pun tembakan yang bisa dipercaya. Polynomial derajat tinggi adalah contohnya: satu titik latih yang bergeser bisa melengkungkan seluruh kurva. Derau adalah lantai galat yang tidak bisa dihapus model mana pun karena melekat pada data itu sendiri — kesalahan pengukuran sensor, ketidakkonsistenan pelabelan manusia, atau faktor yang memang tidak terekam. Batas analogi perlu jujur diakui: model tidak “berniat” seperti penembak; bias dan variansi di sini murni properti statistik dari prosedur latih-prediksi.
Underfit dan Overfit sebagai Dominasi #
Dekomposisi tersebut menerjemahkan dua istilah lama menjadi diagnosis yang presisi. Underfitting adalah kondisi didominasi bias: model terlalu kaku sehingga rata-rata prediksinya sendiri sudah melenceng dari pola sebenarnya — cirinya skor latih dan skor validasi sama-sama rendah, persis pola kurva berdempet pada Chapter Learning Curve. Overfitting adalah kondisi didominasi variansi: model terlalu lentur sehingga ikut mempelajari derau spesifik dataset latih — cirinya skor latih tinggi sementara skor validasi jatuh, pola gap lebar pada learning curve. Derau menetapkan lantai bersama: berapa pun kita menyempurnakan model, galat validasi tidak akan turun di bawah variansi derau data.
Tombol Kompleksitas dan Kurva-U #
Satu tombol mengendalikan komposisi galat: kapasitas model — derajat polynomial, kedalaman pohon, nilai C pada LogisticRegression, jumlah parameter jaringan saraf. Kapasitas rendah menempatkan galat di suku bias (model tidak mampu); kapasitas tinggi memindahkannya ke suku variansi (model terlalu mampu, sampai menghafal derau). Bila galat uji diplot terhadap kapasitas, hasilnya kurva berbentuk U: turun karena bias mengecil, mencapai lembah, lalu naik karena variansi membengkak. Pekerjaan pemilihan model pada praktiknya adalah mencari lembah U tersebut — dan alat section ini (learning curve, validasi silang, metrik yang tepat) adalah cara mengukurnya tanpa menipu diri.
Dekomposisi dalam Angka: Sembilan Derajat, Sepuluh Replika #
Eksperimen penutup kita mengukur ketiga suku secara langsung. Fungsi kebenaran adalah polynomial cubic pada rentang [-1, 1] dengan derau sigma = 0.3 (lantai derau 0.090). Untuk tiap derajat 1 sampai 9, model dilatih pada 10 replika dataset — masing-masing 30 sampel dengan seed berbeda — lalu diukur: MSE latih dan MSE uji rata-rata, serta prediksi pada satu titik kunci x0 = 0.9 dari kesepuluh replika. Dari prediksi tersebut, bias² dihitung sebagai kuadrat selisih rata-rata prediksi terhadap nilai benar, dan variansi sebagai sebaran prediksi antar replika.
# Dekomposisi galat: bias^2 + varians + derau, ditunjukkan lewat regresi
# polynomial derajat 1..9 yang dilatih ulang pada 10 replika data.
import numpy as np
# Fungsi kebenaran (ground truth) yang hendak kita aproksimasi.
def f(x):
return 0.2 - 0.9 * x + 1.5 * x**2 - 0.8 * x**3
SIGMA = 0.3 # simpangan baku derau -> lantai galat tak terpisahkan
N_LATIH = 30 # sampel latih per replika
REPLIKA = 10
X0 = 0.9 # titik kunci tempat bias dan varians diukur
f_x0 = f(X0)
# Data uji TETAP dipakai oleh semua replika supaya perbandingan adil.
x_uji = np.linspace(-1, 1, 40)
rng_uji = np.random.default_rng(7)
y_uji = f(x_uji) + rng_uji.normal(0, SIGMA, 40)
print(f"Nilai benar f({X0}) = {f_x0:.3f} , lantai derau = {SIGMA**2:.3f}")
print()
print(f"{'derajat':>7} | {'latih':>7} | {'uji':>7} | {'bias^2':>7} "
f"| {'varians':>7} | rentang prediksi di x0")
for d in range(1, 10):
mse_latih, mse_uji, pred_x0 = [], [], []
for r in range(REPLIKA):
rng = np.random.default_rng(42 + r) # seed tetap per replika
x = rng.uniform(-1, 1, N_LATIH)
y = f(x) + rng.normal(0, SIGMA, N_LATIH)
koef = np.polyfit(x, y, d)
mse_latih.append(np.mean((np.polyval(koef, x) - y) ** 2))
mse_uji.append(np.mean((np.polyval(koef, x_uji) - y_uji) ** 2))
pred_x0.append(np.polyval(koef, X0))
pred_x0 = np.array(pred_x0)
bias2 = (pred_x0.mean() - f_x0) ** 2
varians = pred_x0.var()
print(f"{d:>7d} | {np.mean(mse_latih):>7.3f} | {np.mean(mse_uji):>7.3f} "
f"| {bias2:>7.3f} | {varians:>7.3f} | "
f"[{pred_x0.min():+.2f}, {pred_x0.max():+.2f}]")Output yang Dihasilkan:
Nilai benar f(0.9) = 0.022 , lantai derau = 0.090
derajat | latih | uji | bias^2 | varians | rentang prediksi di x0
1 | 0.271 | 0.394 | 0.280 | 0.042 | [-0.91, -0.18]
2 | 0.083 | 0.102 | 0.046 | 0.009 | [+0.12, +0.41]
3 | 0.069 | 0.087 | 0.004 | 0.007 | [-0.09, +0.19]
4 | 0.065 | 0.095 | 0.001 | 0.021 | [-0.22, +0.26]
5 | 0.062 | 0.116 | 0.003 | 0.080 | [-0.64, +0.26]
6 | 0.060 | 0.126 | 0.002 | 0.047 | [-0.54, +0.29]
7 | 0.059 | 0.240 | 0.038 | 0.343 | [-1.76, +0.40]
8 | 0.058 | 0.786 | 0.157 | 1.419 | [-3.79, +0.65]
9 | 0.057 | 0.916 | 0.192 | 1.548 | [-3.97, +0.71]Mari kita telaah bagian-bagian pentingnya:
- Baris 8–9 (
def f(x)): fungsi kebenaran cubic — bentuk asli yang hendak dipelajari semua model, yang dalam masalah nyata tidak pernah kita ketahui; di sintetis inilah keuntungannya, sehingga bias bisa dihitung terhadap sesuatu yang pasti. - Baris 20–22 (
x_uji,y_uji): data uji dibuat sekali dengandefault_rng(7)dan dipakai tetap oleh seluruh replika — tiap model dinilai pada soal ujian yang sama. - Baris 32 (
rng = np.random.default_rng(42 + r)): tiap replika menarik 30 sampel dan deraunya dari generator berbeda yang seed-nya tetap. Sepuluh replika berarti sepuluh “kemungkinan dataset” yang semuanya bisa direproduksi. - Baris 36 (
np.polyfit(x, y, d)): regresi polynomial derajatd— tombol kapasitas yang kita putar dari 1 sampai 9. - Baris 42–43 (
bias2,varians): inti dekomposisi. Rata-rata prediksi dix0dibandingkan dengan nilai benarf_x0menghasilkan bias²; sebaran (varians) prediksi antar replika mengukur kepekaan model terhadap data latih.
Tabel output memperlihatkan keseluruhan kisah dalam angka. Derajat 1 didominasi bias: MSE latih 0,271 jauh di atas lantai derau, bias² di x0 mencapai 0,280, dan yang paling jujur adalah kolom rentang — kesepuluh prediksi berjajar rapat di [-0.91, -0.18], semuanya di bawah nilai benar 0,022. Tembakan yang rapi tetapi rapi di tempat keliru: itulah bias. Derajat 3 adalah lembah kurva-U: MSE uji 0,087 nyaris menyentuh lantai derau 0,090, bias² 0,004, varians 0,007 — kapasitas pas dengan kompleksitas pola. Derajat 9 didominasi variansi: MSE latih terendah sedunia (0,057, hafalan makin sempurna) tetapi MSE uji 0,916 — sepuluh kali lantai derau — dengan varians 1,548; rentang prediksinya [-3.97, +0.71], tembakan berserakan ke segala arah. MSE uji sendiri membentuk kurva-U sempurna: turun dari 0,394 (d=1) ke 0,087 (d=3), lalu naik terus hingga 0,916 (d=9).
Dengan kerangka ini, perjalanan evaluasi kita lengkap: dari disiplin data uji, holdout, cross-validation, hingga dekomposisi galat — satu rangkaian prosedur untuk menjawab pertanyaan yang sama dengan tingkat keyakinan yang naik. Seluruh bekal tersebut melekat pada satu jenis pembelajaran saja: belajar dari label. Dunia nyata juga menyimpan data tanpa label yang menunggu ditemukan strukturnya — dunia unsupervised learning yang menjadi pembuka Section berikutnya, dimulai dari Chapter Konsep Unsupervised Learning.
Referensi Resmi #
- Validation curves: plotting scores to evaluate models — hubungan kapasitas model, bias, variansi, dan kurva validasi.
- Common pitfalls and recommended practices — scikit-learn — bagaimana keputusan evaluasi yang keliru mendistorsi perkiraan galat.