사용 방식
import optuna
trial
객체를 생성해 각 하이퍼파라미터 조합의 정보를 담고 trial
은 최적화 방향을 결정한다. suggest
로 시작하는 메소드로 value를 제안한다.
위 trial
은 objcetive 함수
에 들어간다. 이 함수는 각 하이퍼파라미터의 범위를 지정하고, 모델을 생성/평가하는 역할을 한다.
모델을 생성한 후 study.optimize()
로 최적화를 진행하고, 최적의 하이퍼파라미터는 study.best_trial
로 확인한다.
optuna.visualization
모듈로 학습과정의 절차를 시각화로 확인할 수 있다.
예시 코드
import optuna
import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
# 데이터 불러오기
iris = load_iris()
X, y = iris.data, iris.target
# 데이터를 학습용과 테스트용으로 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# LightGBM 데이터셋 생성
train_data = lgb.Dataset(X_train, label=y_train)
object 함수
를 만든다def objective(trial):
# 하이퍼파라미터 설정
params = {
'objective': 'multiclass',
'metric': 'multi_logloss',
'num_class': 3, # 클래스 수
'verbosity': -1,
'boosting_type': 'gbdt',
'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.1),
'max_depth': trial.suggest_int('max_depth', 2, 10),
'num_leaves': trial.suggest_int('num_leaves', 2, 256),
'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
'feature_fraction': trial.suggest_uniform('feature_fraction', 0.1, 1.0),
'bagging_fraction': trial.suggest_uniform('bagging_fraction', 0.1, 1.0),
'bagging_freq': trial.suggest_int('bagging_freq', 1, 10),
'min_child_weight': trial.suggest_loguniform('min_child_weight', 0.1, 100),
'reg_alpha': trial.suggest_loguniform('reg_alpha', 0.1, 100),
'reg_lambda': trial.suggest_loguniform('reg_lambda', 0.1, 100),
}
# 모델 학습
model = lgb.train(params, train_data)
# 테스트 데이터에 대한 예측
y_pred = model.predict(X_test)
y_pred_max = [list(x).index(max(x)) for x in y_pred]
# 정확도 계산
accuracy = accuracy_score(y_test, y_pred_max)
return accuracy
# Study 객체 생성
study = optuna.create_study(direction='minimize')
# 하이퍼파라미터 최적화 수행
study.optimize(objective, n_trials=100)
# 최적의 하이퍼파라미터 출력
print('Best trial:')
trial = study.best_trial
print(' Value: {}'.format(trial.value))
print(' Params: ')
for key, value in trial.params.items():
print(' {}: {}'.format(key, value))
from optuna import Trial, visualization ```
optuna.visualization.plot_param_importances(study)
optuna.visualization.plot_optimization_history(study)
세부 설명
suggest
설명name : 파라미터의 이름, low와 high : 값의 범위
suggest_int(name, low, high)
: 정수형 하이퍼파라미터 지정
suggest_float(name, low, high)
: 부동 소수점 형식의 하이퍼파라미터 지정
suggets_categorical(name, choices)
: 카테고리 형식의 하이퍼파라미터를 지정 choices는 list
suggest_uniform(name, low, high)
: 범위내 균등분포
suggest_doscrete_uniform(name, low, high)
: 범위 내 이산균등분포값 지정
suggest_loguniform(name, low, high)
: 로그 스케일로 분포된 부동 소수점 형식의 하이퍼파라미터 지정
study.besta_param
: 베스트 하이퍼파라미터 반환
study.best_value
: study에서 가장 좋은 objective value 반환
optuna.visualization.plot_param_importances(study)
: 하이퍼파라미터별 중요도를 확인할 수 있는 그래프
optuna.visualization.plot_optimization_history(study)
: 최적화 과정 확인