×

Hyperparameter Tuning: Cara Sistematis Mencari Setelan Model

Meja kerja dengan dua laptop menampilkan tabel kombinasi hyperparameter dan log pelatihan model

Hyperparameter Tuning: Cara Sistematis Mencari Setelan Model

Kamu sudah membersihkan data, memilih fitur, dan melatih model. Hasilnya mengecewakan. Sebelum menyerah dan ganti algoritma, cek dulu setelan yang kamu pakai. Sering kali masalahnya ada pada hyperparameter yang dibiarkan di nilai bawaan. Hyperparameter tuning model machine learning adalah proses mencari kombinasi setelan terbaik sebelum model dilatih, dan caranya bisa dibuat cukup sistematis.

Apa yang Dimaksud Hyperparameter

Hyperparameter adalah nilai yang kamu tentukan sendiri sebelum proses pelatihan berjalan. Model tidak belajar nilai ini dari data. Contohnya jumlah pohon pada Random Forest, kedalaman maksimum pohon keputusan, nilai k pada KNN, atau laju pembelajaran pada gradient boosting.

Parameter model seperti bobot dan bias diperbarui selama pelatihan, sedangkan hyperparameter mengatur cara model belajar. Karena itu, memilih nilainya butuh percobaan, bukan tebakan sekali jalan. Dua model dengan algoritma sama bisa memberi akurasi yang berbeda cukup jauh hanya karena satu hyperparameter diubah.

Kesalahan umum pemula adalah memakai nilai bawaan scikit-learn tanpa pernah menyentuhnya. Nilai bawaan dirancang aman untuk kasus umum, bukan dioptimalkan untuk datasetmu.

Cara Mencari Kombinasi: Grid Search dan Random Search

Ada beberapa strategi untuk menyisir ruang kombinasi hyperparameter. Dua yang paling sering dipakai karena tersedia langsung di scikit-learn adalah grid search dan random search.

Grid Search

Grid search mencoba semua kombinasi dari daftar nilai yang kamu tentukan. Kalau kamu memberi tiga nilai untuk satu hyperparameter dan tiga nilai untuk hyperparameter lain, total ada sembilan kombinasi yang dilatih dan dievaluasi.

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

param_grid = {
    "n_estimators": [100, 200, 300],
    "max_depth": [5, 10, None],
    "min_samples_split": [2, 5]
}

search = GridSearchCV(
    RandomForestClassifier(random_state=42),
    param_grid,
    cv=5,
    scoring="f1",
    n_jobs=-1
)
search.fit(X_train, y_train)

print(search.best_params_)
print(search.best_score_)

Grid search menyeluruh dan mudah dipahami hasilnya. Kekurangannya, jumlah percobaan tumbuh cepat. Tambah satu hyperparameter dengan lima nilai, dan total percobaan langsung berlipat lima. Untuk model yang butuh waktu latih lama, biaya komputasinya bisa tidak masuk akal.

Random Search

Random search mengambil sampel acak dari rentang nilai yang kamu berikan, bukan menyisir semua kombinasi. Pada banyak kasus, pendekatan ini menemukan setelan yang setara dengan grid search dengan jumlah percobaan jauh lebih sedikit.

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform

param_dist = {
    "n_estimators": randint(100, 500),
    "max_depth": randint(3, 20),
    "min_samples_split": randint(2, 10),
    "max_features": uniform(0.1, 0.9)
}

search = RandomizedSearchCV(
    RandomForestClassifier(random_state=42),
    param_dist,
    n_iter=40,
    cv=5,
    scoring="f1",
    random_state=42,
    n_jobs=-1
)
search.fit(X_train, y_train)

Perhatikan bahwa n_iter mengatur berapa kombinasi acak yang diuji. Nilai 40 berarti 40 percobaan, berapa pun ukuran ruang kombinasinya. Ini memberi kontrol langsung atas anggaran waktu yang kamu siap keluarkan.

Memakai Cross-Validation di Dalam Pencarian

Setiap kombinasi hyperparameter sebaiknya dievaluasi dengan cross-validation, bukan satu kali split. Tanpa cross-validation, hasil terbaik bisa saja kebetulan cocok dengan satu pembagian data tertentu. Mekanismenya sudah dijelaskan lebih rinci di panduan cross-validation untuk model machine learning.

Parameter cv=5 di contoh sebelumnya berarti setiap kombinasi dilatih lima kali dengan lipatan berbeda. Konsekuensinya, total pelatihan menjadi lima kali lipat dari jumlah kombinasi. Dengan 40 kombinasi dan 5 lipatan, model dilatih 200 kali. Ini alasan tambahan untuk memilih strategi pencarian yang hemat.

Kalau waktu masih terasa berat, ada dua langkah penghematan yang masuk akal. Pertama, turunkan cv ke 3 untuk tahap penjelajahan awal. Kedua, jalankan pencarian pada subset data yang lebih kecil dulu untuk menyaring rentang nilai, lalu ulangi pencarian pada data penuh di sekitar nilai terbaik.

Memilih Rentang Nilai yang Masuk Akal

Kualitas hasil pencarian bergantung pada rentang nilai yang kamu berikan. Memberi rentang terlalu lebar membuang percobaan pada area yang jelas tidak menjanjikan. Memberi rentang terlalu sempit membuat pencarian hampir tidak berguna.

  • Mulai dari rentang lebar dengan skala kasar. Untuk max_depth, coba 3, 10, dan 20 dulu. Setelah tahu area mana yang bagus, persempit di sekitarnya.
  • Perhatikan arti tiap hyperparameter terhadap kompleksitas model. Nilai max_depth besar membuat pohon lebih dalam dan rawan overfitting. Nilai kecil membuat model terlalu sederhana. Pola ini akan terlihat saat kamu memeriksa kurva learning untuk mendeteksi underfitting dan overfitting.
  • Sesuaikan rentang dengan ukuran data. Pada dataset kecil, nilai min_samples_split yang besar cenderung memperburuk hasil. Pada dataset besar, nilai kecil sering tidak berpengaruh.
  • Jangan menyentuh data uji. Semua pencarian dilakukan pada data latih dengan cross-validation. Data uji baru dipakai sekali di akhir.

Sejumlah hyperparameter bisa saling memengaruhi. Rasio max_features dan n_estimators pada Random Forest, misalnya, bekerja bersama menentukan seberapa bervariasi pohon yang dihasilkan. Kalau satu diubah drastis, nilai terbaik untuk yang lain bisa ikut bergeser. Inilah sebabnya pencarian dua tahap, lebar lalu sempit, lebih aman daripada satu kali pencarian rapat.

Kapan Berhenti Mencari

Pencarian hyperparameter bisa berlangsung tanpa ujung kalau tidak ditentukan batasnya. Tetapkan anggaran waktu atau jumlah percobaan sejak awal, lalu berhenti saat batas itu tercapai meski hasilnya belum memuaskan.

Perhatikan juga selisih antara skor cross-validation terbaik dan skor kombinasi lain di sekitarnya. Kalau banyak kombinasi memberi skor yang berdekatan, pilih yang paling sederhana. Model dengan max_depth 8 yang skornya hanya terpaut tipis dari max_depth 15 biasanya lebih aman dipakai di data baru.

Peningkatan akurasi beberapa persen dari tuning sering kali kalah penting dibanding memastikan data latih dan data uji benar-benar terpisah bersih.

Sebelum masuk ke tuning, pastikan data sudah bersih dari nilai ekstrem yang bisa menyesatkan hasil evaluasi. Cara memeriksanya ada di panduan menangani outlier sebelum melatih model. Untuk proyek yang masih di tahap awal, selesaikan dulu alur pelatihan dasarnya seperti di tips melatih model machine learning pertama. Tuning pada pipeline yang belum stabil hanya membuang waktu.

Kalau nanti kamu membangun antarmuka web untuk menampilkan hasil model, kerapian kode di sisi klien juga berpengaruh pada kemudahan perawatan. Teknik seperti chaining jQuery untuk kode yang lebih rapi dan mudah dibaca bisa jadi acuan saat menyusun skrip pendukung. Prinsipnya sama: satukan langkah yang saling terkait supaya alurnya mudah diikuti.

Menyimpan Hasil Pencarian

Setelah menemukan kombinasi terbaik, latih ulang model pada seluruh data latih dengan setelan tersebut, lalu simpan. Proses penyimpanan model ke file dibahas di cara menyimpan model machine learning dengan joblib. Simpan juga catatan kombinasi hyperparameter yang dicoba beserta skornya. Catatan ini berguna saat kamu perlu mengulang eksperimen atau menjelaskan keputusan ke rekan tim.

Untuk proyek yang nantinya dijalankan di perangkat dengan sumber daya terbatas, pertimbangkan batas memori sejak tahap tuning. Model dengan pohon sangat banyak mungkin memberi skor tinggi di laptop, tetapi tidak muat di perangkat tujuan. Pembahasan soal memilih media penyimpanan data untuk perangkat IoT memberi gambaran bahwa batasan perangkat sering menentukan pilihan teknis jauh sebelum kode ditulis.

Ringkasan

Hyperparameter tuning adalah proses mencoba kombinasi setelan secara terukur, bukan menebak sampai hasilnya bagus. Mulai dari rentang lebar dengan random search, persempit dengan grid search di area terbaik, dan selalu evaluasi memakai cross-validation pada data latih. Tetapkan anggaran percobaan sejak awal agar pencarian berhenti pada waktu yang wajar, lalu pilih kombinasi paling sederhana di antara yang skornya berdekatan.

Pertanyaan yang Sering Diajukan

Apakah tuning hyperparameter selalu meningkatkan akurasi?

Tidak selalu. Kalau masalah utamanya ada pada kualitas data, fitur yang lemah, atau ketidakseimbangan kelas, tuning hanya memberi perbaikan kecil. Perbaiki data dan fitur terlebih dahulu sebelum menghabiskan waktu pada pencarian setelan.

Berapa jumlah percobaan yang wajar untuk random search?

Tidak ada angka pasti. Mulai dari puluhan percobaan untuk melihat pola, lalu tambah kalau skor masih naik cukup jelas. Kalau 20 percobaan terakhir tidak memberi perbaikan berarti, kemungkinan kamu sudah mendekati batas wajar untuk dataset tersebut.

Apakah boleh memakai data uji untuk memilih hyperparameter?

Tidak. Data uji yang dipakai berulang kali untuk memilih setelan akan membuat skor evaluasi akhir terlalu optimistis. Gunakan cross-validation pada data latih untuk semua keputusan tuning, dan sentuh data uji hanya sekali di akhir.

You May Have Missed