ML | Optuna : 하이퍼파라미터 최적화 라이브러리

소리·2024년 4월 17일
0
  • 용도 : 모델링 하이퍼파라미터 최적화
            하이퍼파라미터 성능 시각화
  • 시점 : train data와 test data로 나누고 ML 모델을 설정한 이후

사용 방식

  • 라이브러리이기 때문에 설치 후 임포트해서 사용한다.
import optuna
  1. trial 객체를 생성해 각 하이퍼파라미터 조합의 정보를 담고 trial은 최적화 방향을 결정한다. suggest로 시작하는 메소드로 value를 제안한다.

  2. trialobjcetive 함수에 들어간다. 이 함수는 각 하이퍼파라미터의 범위를 지정하고, 모델을 생성/평가하는 역할을 한다.

  3. 모델을 생성한 후 study.optimize()로 최적화를 진행하고, 최적의 하이퍼파라미터는 study.best_trial로 확인한다.

  4. 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 객체 생성
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)
: 최적화 과정 확인

참고문헌 trial, study

profile
데이터로 경로를 탐색합니다.

0개의 댓글