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?