Tutorial Lengkap Optuna: Optimasi Hyperparameter Otomatis
Daftar Isi
Pendahuluan
Tuning hyperparameter adalah salah satu tugas yang paling memakan waktu dalam machine learning. Optuna adalah framework optimasi hyperparameter otomatis yang menggunakan algoritma pencarian efisien untuk menemukan konfigurasi optimal secara signifikan lebih cepat dibanding grid search atau random search.
Dalam tutorial ini, Anda akan mempelajari cara menggunakan Optuna mulai dari optimasi dasar hingga tuning multi-objektif terdistribusi di berbagai framework ML.
Prasyarat
- Python 3.8+
- Pemahaman dasar machine learning
- Familiar dengan scikit-learn atau PyTorch
Instalasi dan Setup
pip install optuna optuna-dashboard plotly scikit-learn xgboost lightgbm torch
Opsional: untuk optimasi terdistribusi
pip install optuna[rdb] psycopg2-binary
Konsep Dasar: Study dan Trial
Optuna berpusat pada dua konsep utama:
- Study: Sesi optimasi yang terdiri dari banyak trial
- Trial: Satu evaluasi fungsi objektif dengan hyperparameter tertentu
import optuna
Definisikan fungsi objektif
def fungsiobjektif(trial):
# Sarankan hyperparameter
x = trial.suggestfloat("x", -10, 10)
y = trial.suggestfloat("y", -10, 10)
# Kembalikan nilai untuk diminimalkan
return (x - 2) 2 + (y + 3) 2
Buat study dan optimasi
study = optuna.createstudy(direction="minimize")
study.optimize(fungsiobjektif, ntrials=100)
print(f"Nilai terbaik: {study.bestvalue:.4f}")
print(f"Parameter terbaik: {study.bestparams}")
Metode Saran Parameter
def fungsiobjektif(trial):
# Parameter integer
jumlah
layer = trial.suggestint("jumlahlayer", 1, 5)
# Parameter float
learningrate = trial.suggestfloat("lr", 1e-5, 1e-1, log=True)
# Parameter kategorikal
optimizer = trial.suggestcategorical("optimizer", ["adam", "sgd", "rmsprop"])
# Float diskret
dropout = trial.suggestfloat("dropout", 0.1, 0.5, step=0.1)
# Parameter kondisional
if optimizer == "sgd":
momentum = trial.suggestfloat("momentum", 0.0, 0.99)
return latihmodel(jumlahlayer, learningrate, optimizer, dropout)
Optimasi Dasar dengan Scikit-Learn
import optuna
from sklearn.ensemble import RandomForestClassifier
from sklearn.modelselection import crossvalscore
from sklearn.datasets import loadbreastcancer
X, y = loadbreastcancer(returnXy=True)
def fungsiobjektif(trial):
params = {
"nestimators": trial.suggestint("nestimators", 50, 500),
"maxdepth": trial.suggestint("maxdepth", 3, 20),
"minsamplessplit": trial.suggestint("minsamplessplit", 2, 20),
"minsamplesleaf": trial.suggestint("minsamplesleaf", 1, 10),
"maxfeatures": trial.suggestcategorical("maxfeatures", ["sqrt", "log2", None]),
"criterion": trial.suggestcategorical("criterion", ["gini", "entropy"]),
}
clf = RandomForestClassifier(params, randomstate=42, njobs=-1)
skor = crossvalscore(clf, X, y, cv=5, scoring="accuracy")
return skor.mean()
study = optuna.createstudy(direction="maximize")
study.optimize(fungsiobjektif, ntrials=200, showprogressbar=True)
print(f"Akurasi terbaik: {study.bestvalue:.4f}")