본문 바로가기
[파이썬]/머신러닝

[머신러닝] GridSearchCV를 활용한 하이퍼파라미터 튜닝 이해하기

by sung min_Kim 2024. 1. 7.


 이번 글에서는 "GridSearchCV의 개념부터 사용방법"에 대한 내용들을 살펴보려 한다.
차례와 사용 툴 및 라이브러리는 아래와 같다.

 [차례]
 첫 번째, GridSearchCV의 개념
 두 번째, GridSearchCV를 사용하는 이유
 세 번째, GridSearchCV의 파라미터 설정
 네 번째, 하이퍼파라미터 설정(param_grid)
 다섯 번째, GridSearchCV 사용방법
 
 [사용 툴]

- Jupyter notebook(웹 기반 대화형 코딩 환경)
 
 [사용 라이브러리 및 모듈]

  • 머신러닝 라이브러리 및 모델: scikit-learn
    sklearn.model_selection.GridSearchCV: 하이퍼파라미터 튜닝
    - sklearn.ensemble. RandomForestClassifier: 랜덤 포레스트 모델 생성

 


GridSearchCV의 개념



GridSearchCV 개념 (출처:https://juejin.cn/post/7120089516597051428)


 GridSearchCV는 '그리드 검색 교차 검증(Grid Search Cross Validation)'의 줄임말로, 머신러닝 모델의 성능을 최적화하기 위한 방법 중 하나이다. 이름에서도 알 수 있듯이, 이 방법은 '그리드 검색'과 '교차 검증' 두 가지 주요 개념을 포함하고 있다.

 '그리드 검색(Grid Search)'은 모델의 성능에 영향을 미치는 파라미터들의 가능한 모든 조합을 탐색하는 과정이다. 이를 이해하는 가장 쉬운 방법은 일상생활에서의 선택 상황을 생각해 보는 것이다. 예를 들어, 본인이 완벽한 커피를 만들기 위해 여러 가지 조건을 실험해 본다고 생각해 보자. 커피의 맛은 원두의 종류, 분쇄도, 추출 시간 등 여러 가지 요소에 의해 결정된다. 이럴 때, 가장 맛있는 커피를 만들기 위해선 어떤 원두를 사용하고, 어느 정도로 분쇄하며, 얼마나 오랫동안 추출해야 할지는 알아내야 한다.

 여기서, GridSearchCV는 커피를 만드는 역할을 한다. 본인이 커피의 맛을 최적화하기 위해 여러 조건을 시도하는 것처럼, GridSearchCV 또한 머신러닝 모델의 성능을 최적화하기 위해 가능한 모든 파라미터 조합을 시도해 보고, 그중에서 가장 성능이 좋은 조합을 찾아내는 것이다.

 '교차 검증(Cross Validation)'은 모델의 성능을 평가하는 방법 중 하나로, 데이터를 여러 부분으로 나눈 다음 각각을 테스트 데이터로 사용해 모델의 성능을 평가하는 방식을 의미한다. 이를 통해 모델이 새로운 데이터에 대한 일반적인 성능을 더 정확히 평가할 수 있다.

 


GridSearchCV를 사용하는 이유



 머신러닝 모델은 일종의 '예측 기계'라고 볼 수 있다. 이 '예측 기계'의 성능은 모델이 사용하는 파라미터에 크게 의존한다. 이 파라미터들은 모델이 데이터를 어떻게 학습하고, 새로운 데이터에 대해 어떤 예측을 할지를 결정한다.

 그런데 이 파라미터를 어떻게 설정해야 모델의 성능이 가장 좋아질지를 알아내는 것은 쉽지 않다. 이 과정은 커피를 처음 만드는 사람이 완벽한 커피를 만들기 위한 과정과 비슷하다고 할 수 있다. 당연히, 이 과정은 매우 복잡하고 시간이 많이 소요될 것이다.

 이때 GridSearchCV를 사용하면 이 과정을 훨씬 쉽게 해결할 수  있다. GridSearchCV는 '그리드 검색'을 통해 가능한 모든 파라미터 조합을 시도해 보고, '교차 검증'을 통해 각 조합의 성능을 평가하여, 가장 성능이 좋은 파라미터 조합을 찾아준다. 이렇게 하면 복잡한 과정을 거치지 않고도 최적의 파라미터를 찾아내서 모델의 성능을 향상시킬 수 있다.

 따라서, GridSearchCV를 사용하는 이유는 머신러닝 모델의 성능을 최대화하기 위해 최적의 파라미터를 효과적으로 찾아내기 위함이다.

 


GridSearchCV의 파라미터 설정



 다음은 GridSearchCV에서 사용하는 주요 파라미터들에 대한 설명이다.

  • estimator: 이 파라미터는 본인이 사용하고자 하는 머신러닝 모델을 의미한다. 이 모델은 GridSearhCV가 최적화하고자 하는 대상이다.

  • param_grid: 이 파라미터는 본인이 튜닝하고자 하는 모델의 파라미터들과 그 가능한 값들을 딕셔너리 형태로 제공한다. 각 파라미터(key)에 대해 여러 개의 가능한 값(value)을 리스트로 제공하면, GridSearhCV는 이 파라미터들의 가능한 조합 중에서 최적의 조합을 찾는다.

  • cv: 이 파라미터는 데이터를 몇 부분으로 나눌지(즉, 몇 번 교차 검증을 할지)를 결정한다. 'cv=5'라고 설정하면, 전체 데이터는 5개의 부분으로 나누어지고, 각 부분은 차례로 테스트 데이터로 사용된다. 이 과정을 5번 반복하여 얻은 5개의 결과를 평균 내어, 모델의 최종 성능을 평가한다. 

  • scoring: 이 파라미터는 모델의 성능을 평가하는 지표를 결정한다.
    - 분류 문제의 경우 'accuracy(정확도)', 'precison(정밀도)', 'recall(재현율)', 'f1-score' 등이 사용된다.
    - 회귀 문제의 경우 'neg_mean_squared_error_', 'neg_mean_absolute_error' 등이 사용된다. 여기서 'neg'는 'negative'의 약자로, 오차 지표가 "작을수록 좋은" 특성을 "클수록 좋은" 특성으로 변환하기 위해 사용된다. 이는 GridSearchCV가 최적의 모델을 찾을 때 '큰 값이 좋다'는 기준을 일관되게 적용하기 위함이다.

  • n_jobs: 이 파라미터는 GridSearchCV가 병렬 처리를 어느 정도로 수행할지를 결정한다. 이는 사용할 CPU 코어의 수를 지정하는데, 'n_jobs=-1'로 설정하면 사용 가능한 모든 코어를 활용해 병렬 계산을 수행하게 한다. 이렇게 하면 모든 CPU 리소스를 사용해 그리드 서치를 빠르게 수행할 수 있지만, 동시에 컴퓨터의 다른 작업에 영향을 줄 수 있으므로 실제 사용 시에는 주의가 필요하다.


 예를 들어, GridSearchCV에 사용되는 파라미터들을 설정한다면 다음과 같이 나타낼 수 있다.

grid_search = GridSearchCV(estimator, param_grid, 
                           cv=5,
                           n_jobs=-1,
                           scoring="accuracy")

 


하이퍼파라미터 설정(param_grid) 

 


 param_grid는 하이퍼파라미터를 튜닝하기 위해 사용하는 값의 범위를 지정한다. 딕셔너리 형태로 제공되며, 키는 모델의 파라미터 이름을, 값은 해당 파라미터가 가질 수 있는 범위의 값들을 리스트 형태로 나타낸다.


 다음은 param_grid에서 주로 사용되는 하이퍼파라미터들에 대한 설명이다.

  • n_estimators: 이 파라미터는 용할 결정 트리의 수를 결정한다. 트리(tree)의 수를 늘리면 모델의 복잡성이 증가하여 과적합을 방지하고 더 좋은 성능을 얻을 수 있지만, 계산 시간이 증가하는 단점이 있다.
    - [사용 값] 주로 '50, 100 ~ 1000' 사이의 값이 사용된다.
    - [사용 모델] 랜덤 포레스트(rf), 엑스트라 트리(xt), 그레디언트 부스팅(gb), XGBoost(xgb)에서 사용할 수 있다. 단, 히스토그램 기반 그레디언트 부스팅(hg)에서는 이 대신 'max_iter' 파라미터를 사용한다.


  • max_depth: 이 파라미터는 각 트리의 최대 깊이를 결정한다(root 노드는 제외). 트리의 깊이가 깊어질수록 모델의 복잡성이 증가한다.
    - [사용 값] 제한이 없으나, 주로 'None ~ 50' 사이의 값이 사용된다.
    - [사용 모델] 모든 모델에서 사용 가능하다.


  • min_samples_split: 이 파라미터는 노드를 분할하기 위한 최소한의 샘플 수를 결정한다.
    - [사용 값] 제한이 없으나, 주로 '2 ~ 10' 사이의 값이 사용된다.
    - [사용 모델] 랜덤 포레스트(rf), 엑스트라 트리(xt), 그레디언트 부스팅(gb)에서 사용 가능하다.


  • min_samples_leaf: 이 파라미터는 리프 노드(결정 노드)가 되기 위한 최소한의 샘플 수를 결정한다.
    - [사용 값] 제한이 없으나, 주로 '1 ~ 10' 사이의 값이 사용된다.
    - [사용 모델] 랜덤 포레스트(rf), 엑스트라 트리(xt), 그레디언트 부스팅(gb), 히스토그램 기반 그레디언트 부스팅(hg)에서 사용 가능하다. 단, XGBoost(xgb)에서는 'min_child_weight' 함수를 사용한다.


 예를 들어, 랜덤 포레스트 모델(rf)에 대한 param_grid를 설정한다면 다음과 같이 나타낼 수 있다.

param_grid = {
    "n_estimators"     : [50, 100],
    "max_depth"        : [None, 10],
    "min_samples_split": [2, 5],
    "min_samples_leaf" : [1, 2, 4]
}


 트리 구조와 사용되는 용어(노드, 리프 노드 등)에 대한 이해가 필요하신 경우 아래의 글을 참고해 보시기 바란다. 

2024.01.07 - [[파이썬]/머신러닝] - [머신러닝] 트리(Tree) 구조의 이해

 

[머신러닝] 트리(Tree) 구조의 이해

이번 글에서는 " 트리(Tree)의 개념부터 트리 구조의 작동원리"에 대한 내용들을 살펴보려 한다. 차례와 사용 툴 및 라이브러리는 아래와 같다. [차례] 첫 번째, 트리(Tree)란? 두 번째, 트리의 중요

sungmin93.tistory.com

 


GridSearchCV 사용방법



 데이터 수집 및 전처리에 대한 과정은 생략하고, GridSearchCV 사용에 대한 예시를 중점적으로 다루고자 한다.

1. 모델 구축
 1.1 라이브러리 정의
from sklearn.model_selection import GridSearchCV

from sklearn.ensemble import RandomForestClassifier

 

1.2 랜덤 포레스트(rf) 모델 생성

 
 RandomForestClassifier 클래스를 호출하여, 랜덤 포레스트 모델(rf_model)을 생성한다.

rf_model = RandomForestClassifier()
rf_model

rf 모델 생성

 

1.3 하이퍼파라미터 설정


 랜덤 포레스트 모델의 성능을 최적화하기 위한 하이퍼파라미터들의 값을 설정한다.

param_grid = {
    "n_estimators" : [50, 100],
    "max_depth" : [None, 10],
    "min_samples_split" : [2, 5],
    "min_samples_leaf" : [1, 2, 4]
}

 

1.4 GridSearchCV 설정


GridSearchCV 클래스를 이용해 정의된 모델, 하이퍼파라미터, 교차검증 횟수(cv), CPU 코어의 수(n_jobs), 그리고 모델 성능 평가 지표(scoring) 등을 설정한다.

grid_search_rf = GridSearchCV(rf_model, param_grid,
                              cv=5,
                              n_jobs=-1, 
                              scoring="accuracy")

grid_search_rf

GridSearchCV 적용

 

2. 모델 훈련(학습)


 모델 구축 완료되면 fit 함수를 사용하여 모델을 훈련(학습)시킨다. 이때, GridSearchCV가 적용된 모델은 설정한 여러 파라미터들을 기반으로 훈련을 진행한다.

grid_search_rf.fit(X_train, y_train)

GridSearchCV 적용

 

3. 최적의 결과 추출하기


 모델 훈련(학습)이 완료된 후, GridSearchCV의 결과를 통해 최적의 파라미터(best_params_), 최적의 성능(best_score_), 그리고 최적의 모델(best_estimator_)을 추출 및 확인할 수 있다.

# 최적의 파라미터
best_param = grid_search_rf.best_params_

# 최적의 성능
best_score = grid_search_rf.best_score_

# 최적의 모델
best_model = grid_search_rf.best_estimator_

best_param, best_score, best_model



 출력된 결과를 살펴보면, 최적의 하이퍼파라미터 조합은 'max_depth:None', 'min_samples_leaf:1', 'min_samples_split:2', 'n_estmators:100'이라는 것을 알 수 있다.

 중요한 점은, 이러한 조합을 통해 약 '0.8909'라는 높은 성능을 보인 랜덤 포레스트 모델이 반환되었다는 것이다.

 즉, 반환된 해당 모델은 최적의 하이퍼파라미터 설정을 통해 최적의 성능을 낸 모델임을 의미한다.