Panduan praktis membangun pipeline Bayesian hyperparameter optimization dengan Hyperopt, TPE, dan early stopping untuk machine learning production-grade.
Hyperparameter tuning sering jadi mimpi buruk buat data scientist. Grid search lambat, random search boros, dan manual tuning butuh waktu berjam-jam. Di artikel ini, kamu bakal belajar cara lebih pintar pakai Bayesian optimization dengan Hyperopt.
Kita akan bangun sistem yang bisa otomatis pilih model terbaik—antara Logistic Regression atau SVM—sambil nyari kombinasi hyperparameter optimal. Semuanya pakai Tree-structured Parzen Estimator (TPE), algoritma yang jauh lebih efisien daripada brute force.
Yang bikin seru, kita juga terapkan conditional search space. Jadi Hyperopt bisa bedakan parameter khusus tiap model. SVM punya kernel dan gamma, sementara Logistic Regression punya solver dan max_iter. Fleksibel banget.
Sebelum mulai coding, pastikan environment kamu siap. Install Hyperopt, scikit-learn, pandas, dan matplotlib. Kita pakai dataset Breast Cancer bawaan scikit-learn—cukup representatif buat demo production-grade pipeline.
StratifiedKFold dengan 5 split jadi fondasi evaluasi kita. Ini penting biar distribusi kelas tetap seimbang di tiap fold, terutama buat metric ROC-AUC yang kita targetkan.
Nah, ini inti dari conditional search space. Pakai hp.choice, kita definisikan dua cabang: logreg dan svm. Tiap cabang punya parameter sendiri-sendiri. Hyperopt bakal otomatis eksplorasi keduanya selama optimasi berjalan.
Perhatikan penggunaan scope.int untuk parameter integer kayak max_iter dan degree. Tanpa ini, Hyperopt bisa ngasih nilai float yang bikin model error. Detail kecil, tapi krusial di production.
Fungsi build_pipeline jadi pabrik model kita. Dia ngecek scaler perlu atau nggak, terus bangun Pipeline scikit-learn sesuai model yang dipilih. Struktur ini scalable—gampang ditambah model baru kayak XGBoost atau Random Forest.
Objective function-nya dirancang robust. Cross-validation dengan ROC-AUC scoring, n_jobs=-1 buat paralelisasi, plus error handling yang graceful. Kalau training gagal, trial tetap tercatat dengan STATUS_FAIL.
Loss yang diminimalkan adalah 1 - mean_auc. Semakin kecil loss, semakin bagus model. Kita juga attach metadata kayak std_auc dan waktu eksekusi buat analisis nanti.
Early stopping pakai no_progress_loss(20). Artinya, kalau 20 trial berturut-turut nggak ada improvement, optimasi berhenti otomatis. Hemat waktu dan komputasi, terutama buat search space yang gede.
Trials object jadi log lengkap perjalanan optimasi. Kamu bisa introspect tiap trial: parameter apa yang dicoba, loss berapa, berapa lama, dan status sukses atau gagal. Transparansi penuh, nggak ada black box.
Setelah fmin selesai, hasil best berupa index choices. Perlu decoding manual buat dapetin parameter readable. Mapping index ke label model, penalty, solver, dan lainnya.
Visualisasi loss trajectory ngasih insight berharga. Plot trial losses nunjukin sebaran eksplorasi, sementara best-so-far curve nunjukin konvergensi. Kalau curve cepat flat, artinya TPE sudah menemukan region optimal.
Model terbaik kemudian di-train ulang di full dataset. Ini best practice—jangan pakai model dari CV fold, tapi retrain dengan config optimal di seluruh data yang tersedia.
Framework ini easily extensible. Mau ganti ke gradient boosting? Tambah cabang baru di hp.choice. Mau distributed training? Ganti Trials jadi SparkTrials. Struktur tetap sama.
Practical takeaway: mulai selalu dengan conditional search space kalau kamu eksplorasi multiple model families. Lebih efisien daripada tuning tiap model terpisah. Terus selalu log metadata di objective function, dan jangan lupa visualisasi trajectory buat validasi konvergensi.
AI Updates lagi bergerak cepat, jadi jangan cuma lihat headline.
MarkTechPost
Catatan redaksi
Kalau lo cuma ambil satu hal dari artikel ini
AI Updates update dari MarkTechPost.
Sumber asli
Artikel ini merupakan rewrite editorial dari laporan MarkTechPost.
Baca artikel asli di MarkTechPost→


