Menguasai supervised learning jenis regression: linear dan polynomial regression, regularisasi dengan Ridge/Lasso/ElasticNet untuk melawan overfitting, serta evaluasi dengan MSE, MAE, dan R2 melalui studi kasus prediksi harga rumah menggunakan scikit-learn.

Setelah di episode 4 kita membersihkan dan menyiapkan data, pada episode ini kita masuk ke supervised learning pertama: regression. Jika target yang ingin diprediksi berupa angka kontinu — harga rumah, penjualan, suhu — maka regression adalah pilihan kalian.
Mengapa regression penting dipelajari pertama? Karena ia adalah model paling sederhana dan paling mudah dipahami secara matematis, dan konsep yang dipelajari di sini (loss function, overfitting, regularisasi) adalah fondasi untuk semua model yang lebih kompleks. Memahami regression berarti memahami cara kerja model ML secara umum.
Linear regression memodelkan hubungan y = w·x + b: bobot w dan bias b dipilih agar garis paling cocok dengan data. Konsep dot product yang kita bahas di episode 3 muncul kembali di sini.
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
model = LinearRegression()
model.fit(X_train, y_train)
preds = model.predict(X_test)
print(f"MSE = {mean_squared_error(y_test, preds):.2f}")
print(f"koefisien = {model.coef_}")Model "belajar" dengan mencari bobot yang meminimalkan error. Error inilah yang disebut loss function — untuk regression, yang paling umum adalah Mean Squared Error (MSE): rata-rata kuadrat selisih prediksi dan aktual.
Karena selisih dikuadratkan, error besar dihukum jauh lebih berat daripada error kecil — itulah mengapa outlier bisa sangat merusak regresi linear.
Tidak semua hubungan bersifat linear. Harga rumah bisa naik dengan laju menurun seiring luas tanah — kurva, bukan garis. Polynomial regression menambahkan pangkat dari fitur: y = w1·x + w2·x² + b.
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
X_train_poly = poly.fit_transform(X_train)
model = LinearRegression()
model.fit(X_train_poly, y_train)Dengan menaikkan derajat polynomial, model semakin fleksibel — dan semakin mudah overfit. Sebuah polynomial derajat tinggi bisa melewati semua titik data persis, tetapi tidak bisa menebak data baru dengan baik. Inilah trade-off yang menjadi tema episode 7 dan 10.
Regularisasi adalah cara membatasi fleksibilitas model: ia menambahkan penalti pada besarnya bobot, sehingga model lebih memilih bobot kecil dan hasil yang lebih sederhana.
| Model | Penalti | Efek |
|---|---|---|
| Ridge | Kuadrat bobot (L2) | Mengecilkan bobot, semua fitur tetap dipakai |
| Lasso | Nilai absolut bobot (L1) | Bisa menjadikan bobot tepat nol → seleksi fitur |
| ElasticNet | Gabungan L1 + L2 | Kompromi keduanya |
from sklearn.linear_model import Ridge, Lasso, ElasticNet
models = {
"ridge": Ridge(alpha=1.0),
"lasso": Lasso(alpha=0.01),
"elasticnet": ElasticNet(alpha=0.01, l1_ratio=0.5),
}
for name, m in models.items():
m.fit(X_train, y_train)
print(f"{name}: R2 = {m.score(X_test, y_test):.4f}")Parameter alpha mengontrol kekuatan penalti: terlalu besar → model terlalu sederhana (underfit); terlalu kecil → hampir seperti regresi biasa (bisa overfit). Menemukan alpha yang tepat adalah pekerjaan hyperparameter tuning — dibahas di episode 10.
Warning
Jangan lupa scale fitur dulu sebelum regularisasi. Ridge, Lasso, dan ElasticNet menghitung penalti pada besarnya koefisien — jika kolom pendapatan berskala jutaan dan umur puluhan, penalti didominasi kolom berskala besar dan hasilnya tidak masuk akal.
Tiga metrik yang wajib kalian kuasai:
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
preds = model.predict(X_test)
print(f"MAE = {mean_absolute_error(y_test, preds):.2f}")
print(f"MSE = {mean_squared_error(y_test, preds):.2f}")
print(f"RMSE = {mean_squared_error(y_test, preds, squared=False):.2f}")
print(f"R2 = {r2_score(y_test, preds):.3f}")| Metrik | Arti | Unit |
|---|---|---|
| MAE | Rata-rata selisih absolut | Sama dengan target (mudah dibaca) |
| MSE | Rata-rata selisih kuadrat | Menghukum error besar |
| RMSE | Akar dari MSE | Sama dengan target, menghukum error besar |
| R² | Proporsi variansi yang dijelaskan model | 0-1, tanpa unit |
R² = 0.85 berarti model menjelaskan 85% variansi target — sisanya 15% tidak tertangkap model. R² bisa negatif jika model lebih buruk daripada sekadar memakai rata-rata data.
Mari rangkai semuanya dengan dataset boston versi modern (California housing) yang tersedia di scikit-learn:
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score
data = fetch_california_housing()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
pipeline = Pipeline([
("scale", StandardScaler()),
("model", Ridge(alpha=1.0)),
])
pipeline.fit(X_train, y_train)
preds = pipeline.predict(X_test)
print(f"R2 test = {r2_score(y_test, preds):.4f}")Output R² di rentang 0.6-0.7 untuk dataset ini sudah tergolong wajar. Perhatikan pola yang sudah menjadi kebiasaan kita: scaling → model, dibungkus Pipeline, dievaluasi dengan metrik yang jelas.
Pada episode 5 ini, kalian telah menguasai supervised learning pertama.
Inti yang harus dibawa pulang:
Di episode 6 selanjutnya kita akan membahas classification — logistic regression, kNN, dan evaluasi dengan accuracy, precision/recall, F1, confusion matrix, dan ROC-AUC, plus penanganan data tidak seimbang (class_weight, SMOTE) melalui studi kasus prediksi churn. Sampai jumpa di episode 6!