MA1420 · DATA SAINS · SESI 13

Supervised Learning:
Regresi & Klasifikasi

Supervised learning adalah inti dari machine learning praktis — model belajar dari data berlabel untuk membuat prediksi pada data baru. Sesi ini memperkenalkan konsep, pipeline, algoritma utama, dan cara mengevaluasi model.

1. Supervised vs Unsupervised Learning

💡 ILUSTRASI — BELAJAR DENGAN DAN TANPA GURU

Supervised learning seperti belajar dengan guru yang memberi contoh berulabel: "ini foto kucing (label: kucing), ini foto anjing (label: anjing)." Model belajar dari pasangan input–label untuk memprediksi label pada data baru.

Unsupervised learning seperti anak yang diberi ribuan foto hewan tanpa keterangan — ia sendiri menemukan pola: "kelompok ini mirip satu sama lain." Tidak ada jawaban benar yang diberikan.

🎓
Supervised Learning
Data training punya label (jawaban benar). Model belajar memetakan input X → output Y dari contoh berlabel.
Prediksi harga Deteksi spam Diagnosa penyakit
🔍
Unsupervised Learning
Tidak ada label. Model menemukan pola, struktur, atau kelompok tersembunyi secara mandiri.
Segmentasi pelanggan Deteksi anomali Reduksi dimensi
AspekSupervisedUnsupervised
Label YAdaTidak ada
TujuanPrediksi / klasifikasiTemukan struktur tersembunyi
EvaluasiBandingkan prediksi vs label aktualLebih sulit — tidak ada "jawaban benar"
Contoh algoritmaLinear Regression, Decision Tree, SVMK-Means, PCA, DBSCAN

2. Pipeline Machine Learning

1
Definisi Masalah
Regresi (target numerik) atau klasifikasi (target kategori)? Apa metrik sukses? Berapa data tersedia?
2
Persiapan Data
Cleaning, imputasi, encoding kategorikal, scaling, feature engineering. Output: matriks X dan vektor y siap pakai.
← sesi 9–12 sudah kita pelajari!
3
Split Data: Train / Validation / Test
Train (60–80%) untuk fit model. Validation untuk tuning hyperparameter. Test hanya digunakan sekali di akhir — tidak boleh dilihat sebelumnya!
train_test_split() | cross_val_score()
4
Latih Model
Mulai dari model sederhana (linear regression) sebagai baseline. Jangan langsung pakai yang paling kompleks.
model.fit(X_train, y_train)
5
Evaluasi & Tuning
Ukur performa di validation set. Tuning hyperparameter. Analisis kesalahan — lihat di mana model salah.
GridSearchCV() | cross_val_score()
6
Evaluasi Akhir & Deploy
Pakai test set sekali — jika performa memadai, deploy. Monitor performa di produksi secara berkala.
model.predict(X_test)
VISUALISASI PEMBAGIAN DATA (STRATEGI 64/16/20)
TRAIN — 64%
VAL — 16%
TEST — 20%
Train — fit parameter model
Validation — pilih hyperparameter
Test — evaluasi akhir, hanya sekali!

3. Regresi: Prediksi Nilai Numerik

Regresi memodelkan hubungan antara target Y (numerik) dan satu atau lebih prediktor X. Output model adalah angka — bukan kategori.

MODEL REGRESI LINEAR

ŷ = β₀ + β₁X₁ + β₂X₂ + ... + βₚXₚ

β₀ = intercept  |  β₁…βₚ = koefisien masing-masing prediktor

Model dilatih dengan meminimalkan RSS (Residual Sum of Squares) = Σ(yᵢ − ŷᵢ)²

Metrik Evaluasi Regresi

MetrikRumusInterpretasiKelebihan
MAEΣ|yᵢ−ŷᵢ|/nRata-rata kesalahan absolut — unit sama dengan YMudah dipahami, robust terhadap outlier
RMSE√(Σ(yᵢ−ŷᵢ)²/n)Seperti MAE tapi menghukum kesalahan besar lebih beratPaling umum dilaporkan
1 − RSS/TSS% variansi Y yang dijelaskan model. 1.0 = sempurnaNormalized, mudah dibandingkan antar model

4. Klasifikasi: Prediksi Kategori

Klasifikasi memprediksi kelas diskrit dari sebuah input. Target Y adalah kategori (lulus/tidak, spam/bukan, sakit/sehat).

💡 ILUSTRASI — FILTER EMAIL SPAM

Gmail mengevaluasi setiap email: spam atau bukan spam? Keputusan ini berdasarkan ratusan fitur: kata tertentu, pengirim asing, banyak link, huruf kapital berlebihan. Model klasifikasi melakukan hal persis sama — memetakan fitur ke label kelas. Kesalahan ada dua jenis: email penting masuk spam (FN) atau spam lolos ke inbox (FP). Keduanya punya konsekuensi berbeda!

CONFUSION MATRIX — KLASIFIKASI BINER (contoh: prediksi kelulusan)
Prediksi: POSITIF
Prediksi: NEGATIF
Aktual: POSITIF
TP
True Positive
85
FN
False Negative
(Type II Error)
12
Aktual: NEGATIF
FP
False Positive
(Type I Error)
8
TN
True Negative
95
ACCURACY (TP+TN)/total = 180/200 = 90%
Menyesatkan jika data tidak seimbang!
PRECISION TP/(TP+FP) = 85/93 = 91.4%
Penting saat FP mahal (spam filter)
RECALL (SENSITIVITY) TP/(TP+FN) = 85/97 = 87.6%
Penting saat FN mahal (diagnosa penyakit!)
F1-SCORE 2·(P·R)/(P+R) = 89.4%
Gunakan saat butuh keseimbangan P dan R

5. Algoritma Supervised Learning Populer

REGRESI / KLASIFIKASI
Logistic Regression
Meski namanya "regresi", dipakai untuk klasifikasi. Fungsi sigmoid mengubah output linear menjadi probabilitas 0–1, lalu ambil keputusan di threshold 0.5.
✓ Cepat, interpretable, output probabilitas
✗ Asumsi linearitas, tidak tangkap pola kompleks
📌 Baseline klasifikasi, prediksi churn, credit scoring
REGRESI / KLASIFIKASI
Decision Tree
Membuat pohon keputusan dengan pertanyaan ya/tidak berurutan. Setiap node memilih fitur yang memaksimalkan "kemurnian" kelas (Gini impurity / information gain).
✓ Sangat interpretable, tidak perlu scaling
✗ Mudah overfit, tidak stabil
📌 Saat interpretabilitas kritis, aturan bisnis
REGRESI / KLASIFIKASI
Random Forest
Ensemble dari ratusan decision tree, masing-masing dilatih pada subset data dan fitur berbeda. Hasil akhir: voting mayoritas atau rata-rata.
✓ Akurat, robust, built-in feature importance
✗ Kurang interpretable, lebih lambat
📌 Data tabular umum, kompetisi ML
REGRESI / KLASIFIKASI
K-Nearest Neighbors
Klasifikasikan titik baru berdasarkan voting k tetangga terdekat di ruang fitur. Tidak ada proses training eksplisit — lazy learner.
✓ Sederhana, non-parametrik
✗ Lambat saat prediksi, sensitif skala fitur
📌 Rekomendasi sederhana, anomaly detection
REGRESI / KLASIFIKASI
Gradient Boosting (XGBoost)
Bangun tree secara sekuensial — tiap tree baru fokus memperbaiki kesalahan tree sebelumnya. Sangat kuat untuk data tabular terstruktur.
✓ Salah satu terbaik untuk data tabular
✗ Banyak hyperparameter, butuh tuning hati-hati
📌 Kaggle competitions, fraud detection
KLASIFIKASI
Support Vector Machine
Cari hyperplane yang memaksimalkan margin antara dua kelas. Kernel trick memungkinkan SVM bekerja di ruang berdimensi sangat tinggi.
✓ Efektif di dimensi tinggi, robust outlier
✗ Lambat untuk data besar, butuh scaling
📌 Klasifikasi teks, bioinformatika

6. Cross-Validation: Evaluasi yang Lebih Andal

Evaluasi dengan satu train-test split bisa beruntung atau sial. K-Fold Cross-Validation memberikan estimasi lebih stabil.

5-FOLD CROSS-VALIDATION

Data dibagi k=5 bagian. Tiap iterasi, satu bagian jadi validation, sisanya training. Ulangi 5 kali. Rata-ratakan 5 skor.

Iter 1: [][□][□][□][□] → score₁
Iter 2: [□][][□][□][□] → score₂
Iter 3: [□][□][][□][□] → score₃
Iter 4: [□][□][□][][□] → score₄
Iter 5: [□][□][□][□][] → score₅
Final = mean(score₁…₅) ± std

7. Overfitting, Underfitting, dan Bias-Variance Tradeoff

UNDERFITTING
Train: 58% Test: 55%
Model terlalu sederhana — tidak menangkap pola. High bias.
JUST RIGHT ✓
Train: 92% Test: 89%
Menangkap pola utama, generalizes well. Low bias & low variance.
OVERFITTING
Train: 99% Test: 61%
Model hafal noise training — gagal di data baru. High variance.
HIGH BIAS, LOW VAR
Underfitting
Konsisten meleset. Model terlalu sederhana.
LOW BIAS, HIGH VAR
Overfitting
Rata-rata benar tapi tidak konsisten.
HIGH BIAS, HIGH VAR
Terburuk
Meleset dan tidak konsisten.
LOW BIAS, LOW VAR
Ideal ✓
Konsisten tepat sasaran. Tujuan kita.

8. Praktik Python

PYTHON · REGRESI DAN KLASIFIKASI DENGAN SKLEARN
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import mean_absolute_error, r2_score, classification_report

np.random.seed(42)
n = 200
jam_belajar = np.random.normal(4, 1.5, n).clip(1, 8)
kehadiran   = np.random.normal(80, 12, n).clip(40, 100)
nilai_uts   = (30 + 7*jam_belajar + 0.4*kehadiran
               + np.random.normal(0, 5, n)).clip(0, 100)
lulus = (nilai_uts >= 60).astype(int)

X = pd.DataFrame({'jam_belajar': jam_belajar, 'kehadiran': kehadiran})

# ── REGRESI: prediksi nilai UTS ──────────────────
X_tr, X_te, y_tr, y_te = train_test_split(X, nilai_uts, test_size=0.2, random_state=42)
reg = LinearRegression().fit(X_tr, y_tr)
y_pred = reg.predict(X_te)
print("=== REGRESI LINEAR ===")
print(f"Koefisien: jam_belajar={reg.coef_[0]:.2f}, kehadiran={reg.coef_[1]:.2f}")
print(f"MAE  : {mean_absolute_error(y_te, y_pred):.2f}")
print(f"R²   : {r2_score(y_te, y_pred):.3f}")
cv_r2 = cross_val_score(reg, X, nilai_uts, cv=5, scoring='r2')
print(f"CV R²: {cv_r2.mean():.3f} ± {cv_r2.std():.3f}")

# ── KLASIFIKASI: prediksi lulus/tidak ────────────
sc = StandardScaler()
X_tr2, X_te2, y_tr2, y_te2 = train_test_split(X, lulus, test_size=0.2, random_state=42)
X_tr2s = sc.fit_transform(X_tr2); X_te2s = sc.transform(X_te2)

print("\n=== KLASIFIKASI ===")
for name, clf in {
    'Logistic Regression': LogisticRegression(),
    'Random Forest': RandomForestClassifier(100, random_state=42)
}.items():
    clf.fit(X_tr2s, y_tr2)
    acc = clf.score(X_te2s, y_te2)
    cv  = cross_val_score(clf, sc.fit_transform(X), lulus, cv=5)
    print(f"{name}: acc={acc:.3f} | CV={cv.mean():.3f}±{cv.std():.3f}")

# Classification report untuk Random Forest
rf = RandomForestClassifier(100, random_state=42).fit(X_tr2s, y_tr2)
print("\n", classification_report(y_te2, rf.predict(X_te2s),
      target_names=['Tidak Lulus', 'Lulus']))
📤 OUTPUT
=== REGRESI LINEAR ===
Koefisien: jam_belajar=7.15, kehadiran=0.38
MAE  : 4.87
R²   : 0.891
CV R²: 0.882 ± 0.024   ← konsisten di 5 fold

=== KLASIFIKASI ===
Logistic Regression: acc=0.925 | CV=0.918±0.031
Random Forest      : acc=0.950 | CV=0.941±0.022

             precision  recall  f1-score  support
Tidak Lulus     0.91    0.93      0.92       29
Lulus           0.97    0.96      0.96       71
accuracy                          0.95      100

Uji Pemahaman Sesi 13

🧩PERTANYAAN 1 — JENIS MASALAH
Bank ingin membangun model untuk memutuskan apakah permohonan kredit disetujui atau ditolak berdasarkan data nasabah. Ini termasuk jenis masalah ML apa?
Benar! B. Output yang diinginkan adalah keputusan diskrit: disetujui atau ditolak — ini klasifikasi biner. Data histori nasabah (disetujui/ditolak + fiturnya) menjadi data training berlabel → supervised learning. Jika bank ingin prediksi berapa batas kredit (angka), baru itu regresi.
🧩PERTANYAAN 2 — OVERFITTING
Decision Tree menghasilkan train accuracy = 99% dan test accuracy = 68%. Apa masalahnya dan solusi tepat?
Benar! B. Gap besar antara train (99%) dan test (68%) = tanda klasik overfitting. Decision Tree tanpa batasan tumbuh sangat dalam sampai hafal setiap titik data training termasuk noise-nya. Solusi: batasi max_depth, gunakan Random Forest (ensemble mengurangi variance), tambah data training, atau pruning.
🧩PERTANYAAN 3 — METRIK
Model deteksi kanker mendapat akurasi 95%. Namun dari 100 pasien kanker aktual, hanya 40 berhasil terdeteksi. Metrik mana yang paling penting di sini?
Benar! C. Recall = TP/(TP+FN) = 40/100 = 40% — berbahaya! Model melewatkan 60% pasien kanker. Akurasi tinggi 95% bisa karena data tidak seimbang — model prediksi "sehat" untuk semua dan tetap dapat akurasi tinggi. Dalam diagnosa medis, False Negative (pasien kanker tidak terdeteksi) jauh lebih berbahaya — Recall menjadi metrik paling penting.
📋 Ringkasan Sesi 13