Bab 7 ~6 jam
Supervised Learning
Kuda kerja ML — belajar dari data berlabel untuk membuat prediksi. Kami membahas algoritma terpenting dari sederhana hingga kompleks.
7.1 Regresi Linier
Algoritma supervised paling sederhana — fit hubungan linier antara fitur dan target.
ŷ = w₁x₁ + w₂x₂ + ... + wₙxₙ + b = wᵀx + b
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.preprocessing import PolynomialFeatures
# Regresi linier sederhana
lr = LinearRegression()
lr.fit(X_train, y_train)
print(f"R²: {lr.score(X_test, y_test):.3f}")
print(f"Koefisien: {lr.coef_}")
# Ridge (regularisasi L2) — mengecilkan koefisien
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
# Lasso (regularisasi L1) — bisa menolak koefisien ke nol
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)
# Regresi polinomial (derajat 2)
poly = PolynomialFeatures(degree=2, include_bias=False)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
lr_poly = LinearRegression().fit(X_train_poly, y_train)
Kapan digunakan: Sebagai model baseline. Cepat, interpretabel, bekerja baik ketika hubungan sebenarnya kira-kira linier. Periksa plot residual untuk pelanggaran.
7.2 Regresi Logistik
Meskipun namanya, ini adalah algoritma klasifikasi. Memodelkan probabilitas kelas menggunakan fungsi sigmoid.
P(y=1|x) = σ(wᵀx + b) = 1 / (1 + e^(−(wᵀx+b)))
from sklearn.linear_model import LogisticRegression
# Klasifikasi biner
logreg = LogisticRegression(max_iter=1000, random_state=42)
logreg.fit(X_train, y_train)
# Prediksi probabilitas
y_prob = logreg.predict_proba(X_test)[:, 1]
# Threshold kustom (default 0.5)
y_pred_custom = (y_prob >= 0.3).astype(int)
# Multikelas (one-vs-rest secara default)
logreg_multi = LogisticRegression(multi_class='multinomial', solver='lbfgs')
logreg_multi.fit(X_train, y_train)
7.3 Pohon Keputusan
Pohon membagi data dengan mengajukan serangkaian pertanyaan tentang fitur. Sangat interpretabel tapi rentan overfitting.
from sklearn.tree import DecisionTreeClassifier, plot_tree
# Pohon klasifikasi
tree_clf = DecisionTreeClassifier(
max_depth=5, min_samples_split=10,
min_samples_leaf=5, random_state=42
)
tree_clf.fit(X_train, y_train)
# Feature importances
for nama, imp in zip(X.columns, tree_clf.feature_importances_):
print(f"{nama}: {imp:.3f}")
# Visualisasi (simpan ke file untuk pohon besar)
plt.figure(figsize=(20, 10))
plot_tree(tree_clf, feature_names=X.columns,
class_names=['Tidak', 'Ya'], filled=True, max_depth=3)
plt.savefig('pohon.png', dpi=150, bbox_inches='tight')
Hati-hati: Pohon tanpa pemangkasan akan overfit parah. Selalu batasi kedalaman, min_samples, atau gunakan cost-complexity pruning. Pohon juga tidak stabil — perubahan data kecil bisa menghasilkan pohon sangat berbeda.
7.4 Metode Ensemble
Gabungkan beberapa weak learner menjadi strong learner. Ensemble mendominasi kompetisi ML dan deployment dunia nyata.
Random Forest
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
# Random Forest — bagging + subsampling fitur
rf = RandomForestClassifier(
n_estimators=200, max_depth=10,
min_samples_split=5, random_state=42,
n_jobs=-1 # Gunakan semua core CPU
)
rf.fit(X_train, y_train)
Gradient Boosting
# Gradient Boosting — koreksi error secara berurutan
gb = GradientBoostingClassifier(
n_estimators=200, learning_rate=0.1,
max_depth=4, random_state=42
)
gb.fit(X_train, y_train)
# XGBoost (install terpisah: pip install xgboost)
from xgboost import XGBClassifier
xgb = XGBClassifier(
n_estimators=200, learning_rate=0.1, max_depth=4,
use_label_encoder=False, eval_metric='logloss'
)
xgb.fit(X_train, y_train)
Tuning Hyperparameter
from sklearn.model_selection import GridSearchCV
params = {
'n_estimators': [100, 200, 500],
'max_depth': [3, 5, 7],
'learning_rate': [0.01, 0.1, 0.3]
}
grid = GridSearchCV(gb, params, cv=5, scoring='f1', n_jobs=-1)
grid.fit(X_train, y_train)
print(grid.best_params_)
7.5 Support Vector Machines
SVM menemukan hyperplane optimal yang memaksimalkan margin antar kelas. Kernel trick memungkinkan batas non-linier.
from sklearn.svm import SVC
# SVM Klasifikasi (selalu scaling fitur dulu!)
svm_clf = SVC(kernel='rbf', C=1.0, gamma='scale', random_state=42)
svm_clf.fit(X_train_scaled, y_train)
# Kernel umum
# 'linear' — batas linier
# 'rbf' — radial basis function (default, paling serbaguna)
# 'poly' — batas polinomial
Scaling wajib untuk SVM. Algoritma berbasis jarak dan sensitif terhadap skala fitur. Juga, SVM tidak scale baik ke dataset sangat besar (>100k sampel) — pertimbangkan SGDClassifier atau Linear SVM sebagai gantinya.
Latihan: Pada dataset kualitas wine, bandingkan Regresi Linier, Random Forest, dan XGBoost menggunakan 5-fold CV. Laporkan RMSE dan R² untuk masing-masing. Mana yang terbaik? Mengapa?