Recent Posts
Recent Comments
Archives
Today
Total
05-21 06:00
관리 메뉴

이것저것 잡동사니

[예제 코드] hyperopt를 사용한 LightGBM의 hyperparameter tuning 본문

컴퓨터공학/예제 코드

[예제 코드] hyperopt를 사용한 LightGBM의 hyperparameter tuning

Park Siyoung 2022. 10. 5. 20:49
반응형

  hyperopt를 사용해 bayesian optimization으로 classification을 수행하는 LightGBM 트리 모델의 hyperparameter의 최적값을 찾는 코드.

 

def objective_func(_params):
    params = {
        'objective': 'multiclass',
        'num_class': 3,
        'num_iterations': 4000,
        'feature_pre_filter': False,
        'verbosity': -1,
        'device': 'gpu',  # cpu인 경우 이 라인 생략하면 됨

        'n_estimators': int(_params['n_estimators']),
        'max_depth': int(_params['max_depth']),
        'min_child_samples': int(_params['min_child_samples']),
        'num_leaves': int(_params['num_leaves']),
        'learning_rate': _params['learning_rate'],
        'lambda_l2': _params['lambda_l2'],
        'feature_fraction': _params['feature_fraction'],
        'bagging_fraction': _params['bagging_fraction']
    }

    lgbmodel = lgb.train(params,
                         train_set=data_train,
                         valid_sets=[data_train, data_valid],
                         callbacks=[log_evaluation(10),  # 10 iter마다 출력
                         			early_stopping(40, verbose=True)])  # 40 iter동안 loss값이 떨어지지 않으면 종료

    pred = lgbmodel.predict(x_valid)
    return log_loss(y_valid, pred)


# 탐색할 하이퍼파라미터 범위
search_space = {
    'n_estimators': hp.quniform('n_estimators', 1000, 10000, 10),
    'max_depth': hp.quniform('max_depth', 3, 5000, 1),
    'min_child_samples': hp.quniform('min_child_samples', 100, 10000, 50),
    'num_leaves': hp.quniform('num_leaves', 100, 50000, 100),
    'learning_rate': hp.uniform('learning_rate', 1e-3, 5 * 1e-2),
    'lambda_l2': hp.uniform('lambda_l2', 1e-10, 1e-2),
    'feature_fraction': hp.uniform('feature_fraction', 0.3, 1.0),
    'bagging_fraction': hp.uniform('bagging_fraction', 0.2, 1.0)
}


# 최적값 찾기
best = fmin(fn=objective_func, space=search_space,
            algo=tpe.suggest, max_evals=150, trials=trials, rstate=np.random.default_rng())

# 탐색된 최적의 하이퍼파라미터 출력
print(best)
반응형
Comments