본문 바로가기

Codestates AI 부트캠프/2. Machine Learning

[머신러닝] 2-4 Model Tuning


1. 모델 하이퍼파라미터 튜닝

모델 내 하이퍼파라미터를 조정하여 모델의 성능을 끌어올리는 작업이다. 

 

A. 직접 튜닝


최적의 하이퍼파라미터를 찾아주는 함수들이 있지만, 튜닝 과정을 전적으로 일임하는 것은 옳지 않다. 엔지니어가 직접 여러 값을 넣어보며 조정하는 과정이 꼭 필요하다. 이를 통해 모델에 대한 통찰을 얻고 효율적으로 시간을 쓸 수 있다.

모델별로 중요한 하이퍼파라미터

  • 트리 기반 - max_depth
  • 부스팅 - max_depth, learning_rate
  • 회귀 - alpah, C

 

B. Grid Search


검증하고자 하는 하이퍼파라미터 범위 내에서 모든 조합에 대해 모델을 학습하고 그 중 가장 좋은 조합을 선택한다. 튜닝할 파라미터 수가 많으면 시간이 오래 걸려 효율적이지 못하다.

from sklearn.model_selection import GridSearchCV

params = {
    "simpleimputer__strategy": ["median", "mean"],
    "xgbclassifier__max_depth": [2, 4, 6]}

grid_search = GridSearchCV
(pipe, 
param_grid=params, 
scoring="roc_auc", # 모델 성능 비교 기준이 될 검증지표
cv=3, # cross validaition 횟수
verbose=3)

# params 갯수에 cv까지 곱하면 search 횟수를 구할 수 있다
# 2 * 3 * 3 = 18

grid_search.fit(X_train, y_train)

print("최적 하이퍼파라미터: ", grid_search.best_params_)
print("최적 AUC: ", grid_search.best_score_)


* GridSearch에서 하이퍼파라미터 verbose의 의미는?

iteration시마다 수행 결과 메시지를 출력! 

  • verbose=0(default)면 메시지 출력 안함
  • verbose=1이면 간단한 메시지 출력
  • verbose=2이면 하이퍼 파라미터별 메시지 출력

출처 : https://www.inflearn.com/questions/62112/gridsearchcv%EC%97%90%EC%84%9C-verbose



C. Randomized Search

 

검증하고자 하는 파라미터 범위 내에서 랜덤으로 몇개의 조합을 학습하고 이 중 가장 좋은 조합을 선택한다. 탐색 횟수를 지정해주므로 범위가 넓더라도 Grid Search에 비해 탐색이 빠르다. 모든 조합에 대해 검증하지는 않으므로 최적의 조합을 놓칠 수 있다.

 

from sklearn.model_selection import RandomizedSearchCV

params = {
    "simpleimputer__strategy": ["median", "mean"],
    "xgbclassifier__max_depth": [2, 4, 6]}


randomized_search = RandomizedSearchCV(
    model,
    param_distributions=params,
    scoring="roc_auc", 
    n_iter=10, # 몇개의 조합을 테스트 하겠는가
    cv=3, 
    verbose=3,
    random_state=42)

# 횟수에 cv값을 곱하면 총 search 횟수를 구할 수 있다
# 10 * 3 = 30

randomized_search.fit(X_train, y_train)

print("최적 하이퍼파라미터: ", randomized_search.best_params_)
print("최적 AUC: ", randomized_search.best_score_)

 

D. Bayesian Search

검증하고자 하는 파라미터 범위 내에서 이전에 탐색한 조합들의 성능을 기반으로 최적의 조합을 확률적으로 탐색한다. Randomized Search보다 효율적으로 탐색하며 한정된 자원에서 좋은 파라미터 조합을 발견할 가능성이 높다. sklearn에서는 이 기능을 제공하지 않고 hyperopt 라이브러리에서 쓸 수 있다


2. 특성 선택

데이터가 충분한 상황에서는 중요하지 않은 특성이 포함된 데이터셋을 학습해도 성능이 크게 떨어지지 않는다. 하지만 데이터가 충분치 않은 상황에서는 과적합을 유발할 수 있어 불필요한 특성을 배제하는 것이 중요하다.

 

A. 직관 기반 선택

개발자가 직접 중요하지 않은 특성을 선택하고 제거하는 방법이며 꼭 필요한 과정이다.


B. 특성 중요도 기반 선택

# 선형회귀 기반 모델
model.coefficient

# 트리 기반 모델
model.feature_importance