Overfitting dan Underfitting Dijelaskan Tanpa Matematika Berat
TL;DR
Overfitting terjadi waktu model hafal detail dan noise di data latih, jadi akurasinya tinggi di data latih tapi jeblok di data baru. Underfitting kebalikannya: model kelewat sederhana sampai gagal nangkap pola yang ada, dan skornya jelek di dua sisi. Cara paling gampang ngenalinya dengan bandingin skor data latih dan skor data uji.
Overfitting terjadi waktu model hafal detail dan gangguan acak di data latih, bukan cuma polanya. Akurasinya jadi tinggi di data latih dan jeblok di data baru.
Underfitting kebalikannya. Modelnya kelewat sederhana buat nangkap pola yang ada, jadi skornya jelek di dua sisi sekaligus.
Dua hal ini penyebab paling sering angka di notebook nggak nyambung sama hasil di lapangan. Kabar bagusnya, cara ngenalinya cuma butuh dua angka.
Apa itu overfitting?
Overfitting adalah kondisi waktu model belajar terlalu detail dari data latih, termasuk gangguan acak yang nggak mewakili pola sebenarnya. Hasilnya skor di data latih nyaris sempurna, tapi begitu ketemu data yang belum pernah dilihat, tebakannya meleset jauh.
Model yang overfit nggak salah karena bodoh. Dia salah karena kebanyakan hafalan.
Contoh paling jelas ada di decision tree tanpa batas kedalaman. Dia bisa bikin satu cabang khusus buat satu pelanggan, lengkap dengan aturan "kalau umur 34 dan kota Bekasi dan total belanja Rp 431.500 maka churn".
Aturan itu benar 100 persen di data latih. Dan nggak berguna sama sekali buat pelanggan lain.
Apa itu underfitting?
Underfitting adalah kondisi waktu model kelewat sederhana buat nangkap pola di data. Skornya jelek di data latih dan jelek juga di data uji, karena modelnya emang belum belajar apa-apa yang berguna.
Penyebab paling umum: modelnya terlalu kaku buat bentuk datanya.
Contohnya kamu pakai regresi linear buat data yang hubungannya melengkung. Garis lurus nggak bakal pernah bisa ngikutin lengkungan, seberapa lama pun kamu latih.
Penyebab lain yang sering kelewat: kolom fiturnya emang nggak punya informasi yang relevan sama target. Model sekompleks apa pun nggak bisa nebak sesuatu dari data yang nggak nyimpen jawabannya.
Gimana cara tahu model kamu overfit atau underfit?
Bandingkan dua angka: skor di data latih dan skor di data uji. Skor latih tinggi dengan skor uji jauh lebih rendah artinya overfitting. Dua-duanya rendah artinya underfitting. Dua-duanya tinggi dan berdekatan artinya modelmu sehat.
| Skor data latih | Skor data uji | Diagnosa | Langkah pertama |
|---|---|---|---|
| Tinggi | Tinggi, selisih kecil | Sehat | Lanjut, cek metrik lain |
| Tinggi | Rendah, selisih besar | Overfitting | Sederhanakan model |
| Rendah | Rendah | Underfitting | Tambah fitur atau kompleksitas |
| Rendah | Lebih tinggi dari latih | Datanya aneh | Cek pembagian dan kebocoran data |
Buat dapat dua angka itu, kamu perlu train test split dulu. Tanpa pembagian, kamu cuma punya satu angka dan nggak bisa diagnosa apa-apa.
Kalau datamu sedikit, satu kali split gampang nyesatkan. Pakai cross validation supaya angkanya lebih stabil.
Kenapa model bisa overfitting?
Ada empat penyebab yang paling sering ketemu di pekerjaan sehari-hari.
- Model kelewat kompleks buat jumlah datanya. Random forest dengan 500 pohon di data 200 baris hampir pasti hafal.
- Kolom fitur kebanyakan. Makin banyak kolom, makin gampang model nemu pola kebetulan yang kelihatan meyakinkan.
- Latihan kelamaan. Di model yang belajar bertahap seperti gradient boosting atau neural network, tiap putaran tambahan bikin model makin nempel ke data latih.
- Ada kolom yang bocor informasi target. Misalnya kolom tanggal pembatalan dipakai buat nebak pesanan bakal batal atau nggak.
Penyebab nomor 4 paling berbahaya karena hasilnya kelihatan hebat. Akurasi 99 persen bikin orang seneng, bukan curiga.
Aturan aku sederhana: kalau skor uji di atas 97 persen di masalah bisnis yang beneran susah, cek dulu kolom-kolomnya sebelum ngerayain.
Gimana cara ngatasi overfitting?
Urutan yang aku pakai dari yang paling murah ke yang paling mahal.
- Batasi kompleksitas model. Di decision tree dan random forest, setel
max_depthdanmin_samples_leaf. Ini biasanya langsung ngefek. - Buang kolom yang nggak jelas kontribusinya. Cek dulu apakah kolom itu masuk akal secara bisnis, bukan cuma karena skornya naik.
- Pakai regularization. Di model linear, parameter
alphadi Ridge atauCdi LogisticRegression yang ngatur seberapa keras model dihukum kalau bobotnya kegedean. - Berhenti latih lebih awal. Pantau skor validasi tiap putaran, lalu berhenti waktu skornya mulai naik lagi.
- Tambah data. Paling ampuh, paling mahal, dan sering paling lama.
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(
max_depth=6,
min_samples_leaf=20,
random_state=42
)
Dua parameter itu doang sering cukup buat motong selisih skor dari belasan poin jadi di bawah lima.
Gimana cara ngatasi underfitting?
Kebalikannya, tapi urutannya beda karena tersangka utamanya bukan model.
- Cek dulu kolom fiturnya. Kalau nggak ada kolom yang masuk akal buat nebak target, ganti model nggak bakal nolong. Ini masuk wilayah feature engineering.
- Bikin kolom turunan. Rasio, selisih tanggal, dan agregat per pelanggan sering ngasih lompatan lebih besar dari ganti algoritma.
- Naikkan kompleksitas model. Longgarkan
max_depth, tambah jumlah pohon, atau pindah dari linear ke model berbasis pohon. - Kurangi regularization. Kalau
alphakegedean, model dipaksa terlalu sederhana. - Cek kualitas datanya. Kolom yang isinya 70 persen kosong nggak ngasih sinyal apa-apa. Ini bagian dari data quality.
Ilustrasi visual dari dua kondisi ini ada di contoh resmi scikit-learn.
Contoh kasus: prediksi pelanggan berhenti belanja di toko_berkah
Dataset latihan ngulikdata punya 4.180 pelanggan toko_berkah dengan 11 kolom perilaku belanja. Targetnya: pelanggan itu berhenti belanja dalam 90 hari terakhir atau nggak.
Aku latih decision tree dengan lima setelan kedalaman yang beda, sisanya sama persis.
| max_depth | Skor latih | Skor uji | Selisih | Kondisi |
|---|---|---|---|---|
| 2 | 0,881 | 0,874 | 0,007 | Sedikit underfit |
| 4 | 0,902 | 0,889 | 0,013 | Paling seimbang |
| 8 | 0,943 | 0,881 | 0,062 | Mulai overfit |
| 16 | 0,992 | 0,836 | 0,156 | Overfit berat |
| Tanpa batas | 0,998 | 0,821 | 0,177 | Hafal total |
Perhatikan kolom skor latih. Dia naik terus dari 0,881 sampai 0,998, tanpa pernah kasih tanda bahaya.
Yang ngasih tanda bahaya kolom skor uji. Dia naik sampai kedalaman 4, lalu turun terus.
Selisih 17,7 poin di baris terakhir artinya model itu bakal salah tebak jauh lebih sering di lapangan dibanding yang dijanjiin angkanya. Dengan rata-rata transaksi pelanggan toko_berkah Rp 187.000, salah target 500 pelanggan berarti voucher retensi belasan juta rupiah nyasar ke orang yang emang nggak mau pergi.
Model dengan max_depth=4 yang akhirnya dipakai. Skornya lebih rendah di atas kertas, dan lebih jujur di dunia nyata.
Kesalahan umum
- Cuma lihat satu angka akurasi. Tanpa pembanding, kamu nggak punya alat diagnosa.
- Nganggep semua overfitting harus dibasmi. Selisih 2 poin itu normal. Ngejar selisih nol malah sering bikin model jadi underfit.
- Nyetel model berdasarkan skor test set berkali-kali. Test set kamu pelan-pelan berubah jadi data latih tanpa kamu sadar.
- Ngobatin underfitting dengan ganti algoritma doang. Kalau kolomnya nggak nyimpen informasi, ganti model nggak nolong.
- Lupa cek target yang timpang. Akurasi 92 persen kedengeran sehat sampai kamu sadar 92 persen pelanggan emang nggak churn.
Ringkasan dan langkah berikutnya
Dua angka yang perlu kamu punya sebelum bilang model kamu bagus: skor di data latih dan skor di data uji.
Skor latih tinggi tapi skor uji rendah artinya hafalan. Dua-duanya rendah artinya model belum belajar apa-apa. Yang kamu cari kondisi di antaranya, dan biasanya itu berarti model yang lebih sederhana dari yang kamu kira.
Kalau kamu belum punya dua angka itu, mulai dari train test split. Kalau datamu terbatas, pakai cross validation biar diagnosanya nggak salah.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas groupby: Agregasi Data ala Pivot di Python (2026)
groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.