Membangun fondasi machine learning: supervised vs unsupervised, trade-off bias-variance, overfitting, dan train/test split — dilengkapi praktik membangun model baseline pertama dengan scikit-learn

Setelah di episode 8 kita menarik data dari database, pada episode ini kita masuk ke jantung data science: machine learning. Semua episode sebelumnya — statistika, data stack, wrangling, EDA, visualisasi, SQL — adalah persiapan menuju kemampuan untuk membangun model yang belajar pola dari data.
Mengapa memahami fundamental dulu, bukan langsung pakai library? Karena ML bukan kumpulan tombol; ia adalah ilmu tentang generalisasi. Model yang bagus adalah model yang belajar pola nyata dan tidak menangkap noise. Tanpa memahami supervised vs unsupervised, bias-variance, dan overfitting, kalian akan menghasilkan model yang terlihat sempurna di notebook tetapi gagal di dunia nyata — persis kesalahan yang paling sering ditemui perekrut di kandidat junior.
Model belajar dari data berlabel: pasangan (fitur, target) digunakan untuk mempelajari hubungan, lalu memprediksi target dari data baru.
Data berlabel: (X, y) → model → prediksi y untuk X baru| Jenis | Target | Contoh |
|---|---|---|
| Regresi | Numerik kontinu | Memprediksi harga rumah |
| Klasifikasi | Kategori | Memprediksi churn ya/tidak |
Contoh klasifikasi: dari fitur tenure, monthly_charges, contract, model memprediksi churn. Episode ini menggunakan pola ini untuk model baseline.
Model menemukan struktur dari data tanpa label — mengelompokkan data berdasarkan kemiripan.
| Jenis | Tujuan | Contoh |
|---|---|---|
| Clustering | Mengelompokkan data | Segmentasi pelanggan |
| Dimensionality reduction | Menyederhanakan fitur | PCA untuk visualisasi |
Unsupervised sering dipakai di fase eksplorasi: menemukan segmen yang tidak kita ketahui sebelumnya. Series learn-machine-learning membahasnya mendalam; di series ini kita fokus pada supervised karena paling sering dipakai data scientist.
Dua masalah utama training model:
Bias adalah kesalahan karena asumsi model terlalu sederhana; variance adalah sensitivitas model terhadap data training. Trade-off-nya:
Tujuan kita: menemukan titik keseimbangan — model cukup kompleks untuk menangkap pola, cukup sederhana untuk generalisasi. Episode 11 dan 25 akan membahas cara menemukan titik ini secara empiris.
Important
Aturan emas: model diuji hanya pada data yang belum pernah dilihatnya. Melatih lalu menguji pada data yang sama hampir selalu memberi angka luar biasa — dan menipu kalian. Inilah alasan train/test split, yang kita lakukan di bawah.
Pisahkan data menjadi training (belajar) dan test (evaluasi jujur):
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv("telco_churn.csv")
X = df.drop(columns=["churn"])
y = df["churn"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(X_train.shape, X_test.shape)stratify=y menjaga proporsi kelas target di training dan test — penting untuk data tidak seimbang. Split ini harus menjadi batas pertama: semua preprocessing (episode 5, 10) wajib dilakukan setelah split untuk mencegah data leakage.
Mulai dari model paling sederhana yang masuk akal: Logistic Regression. Ia linier, cepat, dan interpretable — baseline yang tepat sebelum mencoba model kompleks.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
df = pd.read_csv("telco_churn.csv")
X = df.drop(columns=["churn"])
y = df["churn"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
model.fit(X_train, y_train)
print("train acc:", round(accuracy_score(y_train, model.predict(X_train)), 3))
print("test acc:", round(accuracy_score(y_test, model.predict(X_test)), 3))Catatan penting: StandardScaler hanya di-fit pada X_train lalu mentransform X_test — melalui make_pipeline, ini otomatis benar. Dua angka yang keluar adalah titik awal perbandingan untuk semua episode berikutnya.
| Pitfall | Dampak | Solusi |
|---|---|---|
| Menguji pada data training | Angka menipu | Selalu split & uji di test |
| Preprocessing sebelum split | Data leakage | Pipeline setelah split |
| Langsung model kompleks | Overfit & sulit debug | Baseline sederhana dulu |
| Mengabaikan kelas tidak seimbang | Accuracy menipu | Stratify & metrik tepat (ep. 11) |
| Random seed tidak tetap | Eksperimen tidak bisa dibandingkan | Tetapkan random_state |
Inti yang harus dibawa pulang:
Di episode 10 selanjutnya kita akan membahas feature engineering & selection — encoding, scaling, dan memilih fitur yang benar-benar membantu model, yang sering menjadi pembeda performa paling besar. Sampai jumpa di episode 10!